-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/cronjobs.xsd">\r
- <import>\r
- <cronjob>\r
- <classpath>lib/system/cronjob/GetUpdateInfoCronjob.class.php</classpath>\r
- <description>Gets update package information</description>\r
- <startminute>0</startminute>\r
- <starthour>2</starthour>\r
- <startdom>*/2</startdom>\r
- <startmonth>*</startmonth>\r
- <startdow>*</startdow>\r
- <active>1</active>\r
- <canbeedited>1</canbeedited>\r
- <canbedisabled>1</canbedisabled>\r
- </cronjob>\r
- \r
- <cronjob>\r
- <classpath>lib/system/cronjob/RefreshSearchRobotsCronjob.class.php</classpath>\r
- <description>Refreshes list of search robots</description>\r
- <startminute>0</startminute>\r
- <starthour>3</starthour>\r
- <startdom>1</startdom>\r
- <startmonth>*</startmonth>\r
- <startdow>*</startdow>\r
- <active>1</active>\r
- <canbeedited>1</canbeedited>\r
- <canbedisabled>1</canbedisabled>\r
- </cronjob>\r
- \r
- <cronjob>\r
- <classpath>lib/system/cronjob/CleanUpCronjobLogCronjob.class.php</classpath>\r
- <description>Deletes old entries from cronjob log.</description>\r
- <startminute>0</startminute>\r
- <starthour>12</starthour>\r
- <startdom>*</startdom>\r
- <startmonth>*</startmonth>\r
- <startdow>*</startdow>\r
- <active>1</active>\r
- <canbeedited>1</canbeedited>\r
- <canbedisabled>1</canbedisabled>\r
- </cronjob>\r
- \r
- <cronjob>\r
- <classpath>lib/system/cronjob/CleanUpSessionLogCronjob.class.php</classpath>\r
- <description>Deletes old entries from session log.</description>\r
- <startminute>0</startminute>\r
- <starthour>10</starthour>\r
- <startdom>*</startdom>\r
- <startmonth>*</startmonth>\r
- <startdow>*</startdow>\r
- <active>1</active>\r
- <canbeedited>0</canbeedited>\r
- <canbedisabled>0</canbedisabled>\r
- </cronjob>\r
- \r
- <cronjob>\r
- <classpath>lib/system/cronjob/CleanupListenerCronjob.class.php</classpath>\r
- <description>Executes cleanup system.</description>\r
- <startminute>5,20,35,50</startminute>\r
- <starthour>*</starthour>\r
- <startdom>*</startdom>\r
- <startmonth>*</startmonth>\r
- <startdow>*</startdow>\r
- <active>1</active>\r
- <canbeedited>0</canbeedited>\r
- <canbedisabled>0</canbedisabled>\r
- </cronjob>\r
- </import>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/cronjobs.xsd">
+ <import>
+ <cronjob>
+ <classpath>lib/system/cronjob/GetUpdateInfoCronjob.class.php</classpath>
+ <description>Gets update package information</description>
+ <startminute>0</startminute>
+ <starthour>2</starthour>
+ <startdom>*/2</startdom>
+ <startmonth>*</startmonth>
+ <startdow>*</startdow>
+ <active>1</active>
+ <canbeedited>1</canbeedited>
+ <canbedisabled>1</canbedisabled>
+ </cronjob>
+
+ <cronjob>
+ <classpath>lib/system/cronjob/RefreshSearchRobotsCronjob.class.php</classpath>
+ <description>Refreshes list of search robots</description>
+ <startminute>0</startminute>
+ <starthour>3</starthour>
+ <startdom>1</startdom>
+ <startmonth>*</startmonth>
+ <startdow>*</startdow>
+ <active>1</active>
+ <canbeedited>1</canbeedited>
+ <canbedisabled>1</canbedisabled>
+ </cronjob>
+
+ <cronjob>
+ <classpath>lib/system/cronjob/CleanUpCronjobLogCronjob.class.php</classpath>
+ <description>Deletes old entries from cronjob log.</description>
+ <startminute>0</startminute>
+ <starthour>12</starthour>
+ <startdom>*</startdom>
+ <startmonth>*</startmonth>
+ <startdow>*</startdow>
+ <active>1</active>
+ <canbeedited>1</canbeedited>
+ <canbedisabled>1</canbedisabled>
+ </cronjob>
+
+ <cronjob>
+ <classpath>lib/system/cronjob/CleanUpSessionLogCronjob.class.php</classpath>
+ <description>Deletes old entries from session log.</description>
+ <startminute>0</startminute>
+ <starthour>10</starthour>
+ <startdom>*</startdom>
+ <startmonth>*</startmonth>
+ <startdow>*</startdow>
+ <active>1</active>
+ <canbeedited>0</canbeedited>
+ <canbedisabled>0</canbedisabled>
+ </cronjob>
+
+ <cronjob>
+ <classpath>lib/system/cronjob/CleanupListenerCronjob.class.php</classpath>
+ <description>Executes cleanup system.</description>
+ <startminute>5,20,35,50</startminute>
+ <starthour>*</starthour>
+ <startdom>*</startdom>
+ <startmonth>*</startmonth>
+ <startdow>*</startdow>
+ <active>1</active>
+ <canbeedited>0</canbeedited>
+ <canbedisabled>0</canbedisabled>
+ </cronjob>
+ </import>
</data>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/options.xsd">\r
- <import>\r
- <categories>\r
- <!-- modules -->\r
- <category name="module">\r
- <showorder>1</showorder>\r
- </category>\r
- <category name="module.system">\r
- <parent>module</parent>\r
- </category>\r
- <category name="module.user">\r
- <parent>module</parent>\r
- </category>\r
- <category name="module.display">\r
- <parent>module</parent>\r
- </category>\r
- <category name="module.content">\r
- <parent>module</parent>\r
- </category>\r
- \r
- <category name="message"></category>\r
- \r
- <category name="message.general">\r
- <parent>message</parent>\r
- </category>\r
- <!-- /modules -->\r
- \r
- <!-- general -->\r
- <category name="general">\r
- <showorder>2</showorder>\r
- </category>\r
- <category name="general.page">\r
- <parent>general</parent>\r
- </category>\r
- <category name="general.offline">\r
- <parent>general</parent>\r
- </category>\r
- <category name="general.http">\r
- <parent>general</parent>\r
- </category>\r
- <category name="general.http.cookie">\r
- <parent>general.http</parent>\r
- </category>\r
- <category name="general.http.http">\r
- <parent>general.http</parent>\r
- </category>\r
- <category name="general.http.proxy">\r
- <parent>general.http</parent>\r
- </category>\r
- <category name="general.date">\r
- <parent>general</parent>\r
- </category>\r
- <category name="general.mail">\r
- <parent>general</parent>\r
- </category>\r
- <category name="general.mail.general">\r
- <parent>general.mail</parent>\r
- </category>\r
- <category name="general.mail.send">\r
- <parent>general.mail</parent>\r
- </category>\r
- <category name="general.cache">\r
- <parent>general</parent>\r
- </category>\r
- <category name="general.cache.general">\r
- <parent>general.cache</parent>\r
- </category>\r
- <category name="general.cache.memcache">\r
- <parent>general.cache</parent>\r
- </category>\r
- <!-- /general -->\r
- \r
- <!-- user -->\r
- <category name="user">\r
- <showorder>3</showorder>\r
- </category>\r
- <!-- /user -->\r
- \r
- <!-- security -->\r
- <category name="security">\r
- <showorder>4</showorder>\r
- </category>\r
- <category name="security.general">\r
- <parent>security</parent>\r
- </category>\r
- <category name="security.general.session">\r
- <parent>security.general</parent>\r
- </category>\r
- <category name="security.blacklist">\r
- <parent>security</parent>\r
- </category>\r
- <category name="security.antispam">\r
- <parent>security</parent>\r
- </category>\r
- <category name="security.censorship">\r
- <parent>security</parent>\r
- </category>\r
- <!-- /security -->\r
- </categories>\r
- \r
- <options>\r
- <option name="module_master_password">\r
- <categoryname>module.system</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- </option>\r
- \r
- <!-- general.page -->\r
- <option name="page_title">\r
- <categoryname>general.page</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <option name="page_description">\r
- <categoryname>general.page</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <option name="page_url">\r
- <categoryname>general.page</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <option name="page_urls">\r
- <categoryname>general.page</categoryname>\r
- <optiontype>textarea</optiontype>\r
- </option>\r
- <option name="meta_keywords">\r
- <categoryname>general.page</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <option name="meta_description">\r
- <categoryname>general.page</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <!-- /general.page -->\r
- \r
- <!-- general.http.cookie -->\r
- <option name="cookie_prefix">\r
- <categoryname>general.http.cookie</categoryname>\r
- <optiontype>text</optiontype>\r
- <defaultvalue>wcf_</defaultvalue>\r
- <validationpattern>.+</validationpattern>\r
- </option>\r
- <option name="cookie_path">\r
- <categoryname>general.http.cookie</categoryname>\r
- <optiontype>text</optiontype>\r
- <defaultvalue></defaultvalue>\r
- </option>\r
- <option name="cookie_domain">\r
- <categoryname>general.http.cookie</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <!-- /general.http.cookie-->\r
- \r
- <!-- general.http.http -->\r
- <option name="http_enable_no_cache_headers">\r
- <categoryname>general.http.http</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>0</defaultvalue>\r
- </option>\r
- <option name="http_enable_gzip">\r
- <categoryname>general.http.http</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>1</defaultvalue>\r
- <enableoptions><![CDATA[http_gzip_level]]></enableoptions>\r
- </option>\r
- <option name="http_gzip_level">\r
- <categoryname>general.http.http</categoryname>\r
- <optiontype>integer</optiontype>\r
- <defaultvalue>1</defaultvalue>\r
- </option>\r
- <!-- /general.http.http -->\r
- \r
- <!-- general.http.proxy -->\r
- <option name="proxy_server_http">\r
- <categoryname>general.http.proxy</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <!-- /general.http.proxy -->\r
- \r
- <!-- general.session -->\r
- <option name="session_timeout">\r
- <categoryname>security.general.session</categoryname>\r
- <optiontype>integer</optiontype>\r
- <defaultvalue>1800</defaultvalue>\r
- <validationpattern>^[^0]</validationpattern>\r
- </option>\r
- <option name="user_online_timeout">\r
- <categoryname>security.general.session</categoryname>\r
- <optiontype>integer</optiontype>\r
- <defaultvalue>900</defaultvalue>\r
- </option>\r
- <option name="session_validate_ip_address">\r
- <categoryname>security.general.session</categoryname>\r
- <optiontype>select</optiontype>\r
- <selectoptions>0\r
-1\r
-2\r
-3\r
-4</selectoptions>\r
- <defaultvalue>2</defaultvalue>\r
- </option>\r
- <option name="session_validate_user_agent">\r
- <categoryname>security.general.session</categoryname>\r
- <optiontype>boolean</optiontype>\r
- <defaultvalue>1</defaultvalue>\r
- </option>\r
- <!-- /general.session -->\r
- \r
- <!-- security.blacklist -->\r
- <option name="blacklist_ip_addresses">\r
- <categoryname>security.blacklist</categoryname>\r
- <optiontype>textarea</optiontype>\r
- </option>\r
- <option name="blacklist_user_agents">\r
- <categoryname>security.blacklist</categoryname>\r
- <optiontype>textarea</optiontype>\r
- </option>\r
- <option name="blacklist_hostnames">\r
- <categoryname>security.blacklist</categoryname>\r
- <optiontype>textarea</optiontype>\r
- </option>\r
- <!-- /security.blacklist -->\r
- \r
- <!-- general.date -->\r
- <option name="timezone">\r
- <categoryname>general.date</categoryname>\r
- <optiontype>timezone</optiontype>\r
- <defaultvalue>Europe/London</defaultvalue>\r
- </option>\r
- <!-- /general.date -->\r
- \r
- <!-- mail.general -->\r
- <option name="mail_from_name">\r
- <categoryname>general.mail.general</categoryname>\r
- <optiontype>text</optiontype>\r
- <defaultvalue><![CDATA[]]></defaultvalue>\r
- </option>\r
- <option name="mail_from_address">\r
- <categoryname>general.mail.general</categoryname>\r
- <optiontype>text</optiontype>\r
- <defaultvalue><![CDATA[]]></defaultvalue>\r
- </option>\r
- <option name="mail_admin_address">\r
- <categoryname>general.mail.general</categoryname>\r
- <optiontype>text</optiontype>\r
- <defaultvalue><![CDATA[]]></defaultvalue>\r
- </option>\r
- <option name="mail_signature">\r
- <categoryname>general.mail.general</categoryname>\r
- <optiontype>textarea</optiontype>\r
- <defaultvalue><![CDATA[]]></defaultvalue>\r
- </option>\r
- <!-- /mail.general -->\r
- \r
- <!-- mail.send -->\r
- <option name="mail_send_method">\r
- <categoryname>general.mail.send</categoryname>\r
- <optiontype>radiobuttons</optiontype>\r
- <defaultvalue><![CDATA[php]]></defaultvalue>\r
- <selectoptions><![CDATA[php:wcf.acp.option.mail_send_method.php\r
-smtp:wcf.acp.option.mail_send_method.smtp\r
-debug:wcf.acp.option.mail_send_method.debug]]></selectoptions>\r
- <enableoptions><![CDATA[php:mail_use_f_param,!mail_debug_logfile_path,!mail_smtp_host,!mail_smtp_port,!mail_smtp_user,!mail_smtp_password\r
-smtp:!mail_debug_logfile_path,!mail_use_f_param,mail_smtp_host,mail_smtp_port,mail_smtp_user,mail_smtp_password\r
-debug:mail_debug_logfile_path,!mail_use_f_param,!mail_smtp_host,!mail_smtp_port,!mail_smtp_user,!mail_smtp_password]]></enableoptions>\r
- </option>\r
- <option name="mail_debug_logfile_path">\r
- <categoryname>general.mail.send</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <option name="mail_smtp_host">\r
- <categoryname>general.mail.send</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <option name="mail_smtp_port">\r
- <categoryname>general.mail.send</categoryname>\r
- <optiontype>integer</optiontype>\r
- <defaultvalue><![CDATA[25]]></defaultvalue>\r
- </option>\r
- <option name="mail_smtp_user">\r
- <categoryname>general.mail.send</categoryname>\r
- <optiontype>text</optiontype>\r
- </option>\r
- <option name="mail_smtp_password">\r
- <categoryname>general.mail.send</categoryname>\r
- <optiontype>password</optiontype>\r
- </option>\r
- <option name="mail_use_f_param">\r
- <categoryname>general.mail.send</categoryname>\r
- <optiontype>boolean</optiontype>\r
- </option>\r
- <option name="mail_use_formatted_address">\r
- <categoryname>general.mail.send</categoryname>\r
- <optiontype>boolean</optiontype>\r
- </option>\r
- <!-- /mail.send -->\r
- \r
- <!-- general.cache -->\r
- <option name="cache_source_type">\r
- <categoryname>general.cache.general</categoryname>\r
- <optiontype>radiobuttons</optiontype>\r
- <defaultvalue><![CDATA[disk]]></defaultvalue>\r
- <selectoptions><![CDATA[disk:wcf.acp.option.cache_source_type.disk\r
-memcache:wcf.acp.option.cache_source_type.memcache\r
-apc:wcf.acp.option.cache_source_type.apc]]></selectoptions>\r
- <enableoptions><![CDATA[disk:!cache_source_memcache_host,!cache_source_memcache_use_pconnect,!enable_session_data_cache\r
-memcache:cache_source_memcache_host,cache_source_memcache_use_pconnect,enable_session_data_cache\r
-apc:!cache_source_memcache_host,!cache_source_memcache_use_pconnect,!enable_session_data_cache]]></enableoptions>\r
- </option>\r
- \r
- <option name="enable_session_data_cache">\r
- <categoryname>general.cache.general</categoryname>\r
- <optiontype>boolean</optiontype>\r
- </option>\r
- \r
- <option name="cache_source_memcache_host">\r
- <categoryname>general.cache.memcache</categoryname>\r
- <optiontype>textarea</optiontype>\r
- </option>\r
- \r
- <option name="cache_source_memcache_use_pconnect">\r
- <categoryname>general.cache.memcache</categoryname>\r
- <optiontype>boolean</optiontype>\r
- </option>\r
- <!-- /general.cache -->\r
- </options>\r
- </import>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/options.xsd">
+ <import>
+ <categories>
+ <!-- modules -->
+ <category name="module">
+ <showorder>1</showorder>
+ </category>
+ <category name="module.system">
+ <parent>module</parent>
+ </category>
+ <category name="module.user">
+ <parent>module</parent>
+ </category>
+ <category name="module.display">
+ <parent>module</parent>
+ </category>
+ <category name="module.content">
+ <parent>module</parent>
+ </category>
+
+ <category name="message"></category>
+
+ <category name="message.general">
+ <parent>message</parent>
+ </category>
+ <!-- /modules -->
+
+ <!-- general -->
+ <category name="general">
+ <showorder>2</showorder>
+ </category>
+ <category name="general.page">
+ <parent>general</parent>
+ </category>
+ <category name="general.offline">
+ <parent>general</parent>
+ </category>
+ <category name="general.http">
+ <parent>general</parent>
+ </category>
+ <category name="general.http.cookie">
+ <parent>general.http</parent>
+ </category>
+ <category name="general.http.http">
+ <parent>general.http</parent>
+ </category>
+ <category name="general.http.proxy">
+ <parent>general.http</parent>
+ </category>
+ <category name="general.date">
+ <parent>general</parent>
+ </category>
+ <category name="general.mail">
+ <parent>general</parent>
+ </category>
+ <category name="general.mail.general">
+ <parent>general.mail</parent>
+ </category>
+ <category name="general.mail.send">
+ <parent>general.mail</parent>
+ </category>
+ <category name="general.cache">
+ <parent>general</parent>
+ </category>
+ <category name="general.cache.general">
+ <parent>general.cache</parent>
+ </category>
+ <category name="general.cache.memcache">
+ <parent>general.cache</parent>
+ </category>
+ <!-- /general -->
+
+ <!-- user -->
+ <category name="user">
+ <showorder>3</showorder>
+ </category>
+ <!-- /user -->
+
+ <!-- security -->
+ <category name="security">
+ <showorder>4</showorder>
+ </category>
+ <category name="security.general">
+ <parent>security</parent>
+ </category>
+ <category name="security.general.session">
+ <parent>security.general</parent>
+ </category>
+ <category name="security.blacklist">
+ <parent>security</parent>
+ </category>
+ <category name="security.antispam">
+ <parent>security</parent>
+ </category>
+ <category name="security.censorship">
+ <parent>security</parent>
+ </category>
+ <!-- /security -->
+ </categories>
+
+ <options>
+ <option name="module_master_password">
+ <categoryname>module.system</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ </option>
+
+ <!-- general.page -->
+ <option name="page_title">
+ <categoryname>general.page</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <option name="page_description">
+ <categoryname>general.page</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <option name="page_url">
+ <categoryname>general.page</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <option name="page_urls">
+ <categoryname>general.page</categoryname>
+ <optiontype>textarea</optiontype>
+ </option>
+ <option name="meta_keywords">
+ <categoryname>general.page</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <option name="meta_description">
+ <categoryname>general.page</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <!-- /general.page -->
+
+ <!-- general.http.cookie -->
+ <option name="cookie_prefix">
+ <categoryname>general.http.cookie</categoryname>
+ <optiontype>text</optiontype>
+ <defaultvalue>wcf_</defaultvalue>
+ <validationpattern>.+</validationpattern>
+ </option>
+ <option name="cookie_path">
+ <categoryname>general.http.cookie</categoryname>
+ <optiontype>text</optiontype>
+ <defaultvalue></defaultvalue>
+ </option>
+ <option name="cookie_domain">
+ <categoryname>general.http.cookie</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <!-- /general.http.cookie-->
+
+ <!-- general.http.http -->
+ <option name="http_enable_no_cache_headers">
+ <categoryname>general.http.http</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>0</defaultvalue>
+ </option>
+ <option name="http_enable_gzip">
+ <categoryname>general.http.http</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>1</defaultvalue>
+ <enableoptions><![CDATA[http_gzip_level]]></enableoptions>
+ </option>
+ <option name="http_gzip_level">
+ <categoryname>general.http.http</categoryname>
+ <optiontype>integer</optiontype>
+ <defaultvalue>1</defaultvalue>
+ </option>
+ <!-- /general.http.http -->
+
+ <!-- general.http.proxy -->
+ <option name="proxy_server_http">
+ <categoryname>general.http.proxy</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <!-- /general.http.proxy -->
+
+ <!-- general.session -->
+ <option name="session_timeout">
+ <categoryname>security.general.session</categoryname>
+ <optiontype>integer</optiontype>
+ <defaultvalue>1800</defaultvalue>
+ <validationpattern>^[^0]</validationpattern>
+ </option>
+ <option name="user_online_timeout">
+ <categoryname>security.general.session</categoryname>
+ <optiontype>integer</optiontype>
+ <defaultvalue>900</defaultvalue>
+ </option>
+ <option name="session_validate_ip_address">
+ <categoryname>security.general.session</categoryname>
+ <optiontype>select</optiontype>
+ <selectoptions>0
+1
+2
+3
+4</selectoptions>
+ <defaultvalue>2</defaultvalue>
+ </option>
+ <option name="session_validate_user_agent">
+ <categoryname>security.general.session</categoryname>
+ <optiontype>boolean</optiontype>
+ <defaultvalue>1</defaultvalue>
+ </option>
+ <!-- /general.session -->
+
+ <!-- security.blacklist -->
+ <option name="blacklist_ip_addresses">
+ <categoryname>security.blacklist</categoryname>
+ <optiontype>textarea</optiontype>
+ </option>
+ <option name="blacklist_user_agents">
+ <categoryname>security.blacklist</categoryname>
+ <optiontype>textarea</optiontype>
+ </option>
+ <option name="blacklist_hostnames">
+ <categoryname>security.blacklist</categoryname>
+ <optiontype>textarea</optiontype>
+ </option>
+ <!-- /security.blacklist -->
+
+ <!-- general.date -->
+ <option name="timezone">
+ <categoryname>general.date</categoryname>
+ <optiontype>timezone</optiontype>
+ <defaultvalue>Europe/London</defaultvalue>
+ </option>
+ <!-- /general.date -->
+
+ <!-- mail.general -->
+ <option name="mail_from_name">
+ <categoryname>general.mail.general</categoryname>
+ <optiontype>text</optiontype>
+ <defaultvalue><![CDATA[]]></defaultvalue>
+ </option>
+ <option name="mail_from_address">
+ <categoryname>general.mail.general</categoryname>
+ <optiontype>text</optiontype>
+ <defaultvalue><![CDATA[]]></defaultvalue>
+ </option>
+ <option name="mail_admin_address">
+ <categoryname>general.mail.general</categoryname>
+ <optiontype>text</optiontype>
+ <defaultvalue><![CDATA[]]></defaultvalue>
+ </option>
+ <option name="mail_signature">
+ <categoryname>general.mail.general</categoryname>
+ <optiontype>textarea</optiontype>
+ <defaultvalue><![CDATA[]]></defaultvalue>
+ </option>
+ <!-- /mail.general -->
+
+ <!-- mail.send -->
+ <option name="mail_send_method">
+ <categoryname>general.mail.send</categoryname>
+ <optiontype>radiobuttons</optiontype>
+ <defaultvalue><![CDATA[php]]></defaultvalue>
+ <selectoptions><![CDATA[php:wcf.acp.option.mail_send_method.php
+smtp:wcf.acp.option.mail_send_method.smtp
+debug:wcf.acp.option.mail_send_method.debug]]></selectoptions>
+ <enableoptions><![CDATA[php:mail_use_f_param,!mail_debug_logfile_path,!mail_smtp_host,!mail_smtp_port,!mail_smtp_user,!mail_smtp_password
+smtp:!mail_debug_logfile_path,!mail_use_f_param,mail_smtp_host,mail_smtp_port,mail_smtp_user,mail_smtp_password
+debug:mail_debug_logfile_path,!mail_use_f_param,!mail_smtp_host,!mail_smtp_port,!mail_smtp_user,!mail_smtp_password]]></enableoptions>
+ </option>
+ <option name="mail_debug_logfile_path">
+ <categoryname>general.mail.send</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <option name="mail_smtp_host">
+ <categoryname>general.mail.send</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <option name="mail_smtp_port">
+ <categoryname>general.mail.send</categoryname>
+ <optiontype>integer</optiontype>
+ <defaultvalue><![CDATA[25]]></defaultvalue>
+ </option>
+ <option name="mail_smtp_user">
+ <categoryname>general.mail.send</categoryname>
+ <optiontype>text</optiontype>
+ </option>
+ <option name="mail_smtp_password">
+ <categoryname>general.mail.send</categoryname>
+ <optiontype>password</optiontype>
+ </option>
+ <option name="mail_use_f_param">
+ <categoryname>general.mail.send</categoryname>
+ <optiontype>boolean</optiontype>
+ </option>
+ <option name="mail_use_formatted_address">
+ <categoryname>general.mail.send</categoryname>
+ <optiontype>boolean</optiontype>
+ </option>
+ <!-- /mail.send -->
+
+ <!-- general.cache -->
+ <option name="cache_source_type">
+ <categoryname>general.cache.general</categoryname>
+ <optiontype>radiobuttons</optiontype>
+ <defaultvalue><![CDATA[disk]]></defaultvalue>
+ <selectoptions><![CDATA[disk:wcf.acp.option.cache_source_type.disk
+memcache:wcf.acp.option.cache_source_type.memcache
+apc:wcf.acp.option.cache_source_type.apc]]></selectoptions>
+ <enableoptions><![CDATA[disk:!cache_source_memcache_host,!cache_source_memcache_use_pconnect,!enable_session_data_cache
+memcache:cache_source_memcache_host,cache_source_memcache_use_pconnect,enable_session_data_cache
+apc:!cache_source_memcache_host,!cache_source_memcache_use_pconnect,!enable_session_data_cache]]></enableoptions>
+ </option>
+
+ <option name="enable_session_data_cache">
+ <categoryname>general.cache.general</categoryname>
+ <optiontype>boolean</optiontype>
+ </option>
+
+ <option name="cache_source_memcache_host">
+ <categoryname>general.cache.memcache</categoryname>
+ <optiontype>textarea</optiontype>
+ </option>
+
+ <option name="cache_source_memcache_use_pconnect">
+ <categoryname>general.cache.memcache</categoryname>
+ <optiontype>boolean</optiontype>
+ </option>
+ <!-- /general.cache -->
+ </options>
+ </import>
</data>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>\r
-<package name="com.woltlab.wcf" xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/package.xsd">\r
- <packageinformation>\r
- <packagename>WoltLab Community Framework</packagename>\r
- <packagedescription>Free web-framework, designed and developed for complex community applications.</packagedescription>\r
- <standalone>1</standalone>\r
- <isunique>1</isunique>\r
- <version>2.0.0 Alpha 1</version> <!-- codename: maelstrom -->\r
- <date>2011-05-19</date>\r
- </packageinformation>\r
- \r
- <authorinformation>\r
- <author>WoltLab GmbH</author>\r
- <authorurl>http://www.woltlab.com</authorurl>\r
- </authorinformation>\r
- \r
- <instructions type="install">\r
- <instruction type="packageinstallationplugins">pip.xml</instruction>\r
- <instruction type="acpmenu">acpmenu.xml</instruction>\r
- <instruction type="groupoptions">groupoptions.xml</instruction>\r
- <instruction type="options">options.xml</instruction>\r
- <instruction type="useroptions">useroptions.xml</instruction>\r
- <instruction type="templates">templates.tar</instruction>\r
- <instruction type="eventlistener">eventlistener.xml</instruction>\r
- <instruction type="script">acp/install.php</instruction>\r
- <instruction type="cronjobs">cronjobs.xml</instruction>\r
- <instruction type="coreobject">coreobject.xml</instruction>\r
- </instructions>\r
-</package>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="com.woltlab.wcf" xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/package.xsd">
+ <packageinformation>
+ <packagename>WoltLab Community Framework</packagename>
+ <packagedescription>Free web-framework, designed and developed for complex community applications.</packagedescription>
+ <standalone>1</standalone>
+ <isunique>1</isunique>
+ <version>2.0.0 Alpha 1</version> <!-- codename: maelstrom -->
+ <date>2011-05-19</date>
+ </packageinformation>
+
+ <authorinformation>
+ <author>WoltLab GmbH</author>
+ <authorurl>http://www.woltlab.com</authorurl>
+ </authorinformation>
+
+ <instructions type="install">
+ <instruction type="packageinstallationplugins">pip.xml</instruction>
+ <instruction type="acpmenu">acpmenu.xml</instruction>
+ <instruction type="groupoptions">groupoptions.xml</instruction>
+ <instruction type="options">options.xml</instruction>
+ <instruction type="useroptions">useroptions.xml</instruction>
+ <instruction type="templates">templates.tar</instruction>
+ <instruction type="eventlistener">eventlistener.xml</instruction>
+ <instruction type="script">acp/install.php</instruction>
+ <instruction type="cronjobs">cronjobs.xml</instruction>
+ <instruction type="coreobject">coreobject.xml</instruction>
+ </instructions>
+</package>
-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/styleattributes.xsd">\r
- <import>\r
- <attribute>\r
- <selector><![CDATA[]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[user.additional.style.input1.use]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[user.additional.style.input2.use]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[page.header.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[page.header.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[background-position]]></name>\r
- <value><![CDATA[page.header.background.image.alignment]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[background-repeat]]></name>\r
- <value><![CDATA[page.header.background.image.repeat]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo]]></selector>\r
- <name><![CDATA[border-bottom-width]]></name>\r
- <value><![CDATA[menu.main.bar.divider.show]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo]]></selector>\r
- <name><![CDATA[height]]></name>\r
- <value><![CDATA[page.header.height]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo .pageLogo]]></selector>\r
- <name><![CDATA[text-align]]></name>\r
- <value><![CDATA[page.logo.image.alignment]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo .pageLogo img]]></selector>\r
- <name><![CDATA[margin-left]]></name>\r
- <value><![CDATA[page.logo.image.padding.left]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo .pageLogo img]]></selector>\r
- <name><![CDATA[margin-right]]></name>\r
- <value><![CDATA[page.logo.image.padding.right]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo .pageLogo img]]></selector>\r
- <name><![CDATA[margin-top]]></name>\r
- <value><![CDATA[page.logo.image.padding.top]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1]]></selector>\r
- <name><![CDATA[font-family]]></name>\r
- <value><![CDATA[global.title.font]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1]]></selector>\r
- <name><![CDATA[text-align]]></name>\r
- <value><![CDATA[global.title.font.alignment]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[global.title.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[global.title.font.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1]]></selector>\r
- <name><![CDATA[font-style]]></name>\r
- <value><![CDATA[global.title.font.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1]]></selector>\r
- <name><![CDATA[font-weight]]></name>\r
- <value><![CDATA[global.title.font.weight]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[global.title.hide]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1 a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[global.title.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1 a]]></selector>\r
- <name><![CDATA[padding-left]]></name>\r
- <value><![CDATA[global.title.font.padding.left]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1 a]]></selector>\r
- <name><![CDATA[padding-right]]></name>\r
- <value><![CDATA[global.title.font.padding.right]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#logo h1 a]]></selector>\r
- <name><![CDATA[padding-top]]></name>\r
- <value><![CDATA[global.title.font.padding.top]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#userPanel]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[page.alignment.margin]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[page.alignment.margin]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footer]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[page.alignment.margin]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#main]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[page.alignment.margin]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#userPanel]]></selector>\r
- <name><![CDATA[width]]></name>\r
- <value><![CDATA[page.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[width]]></name>\r
- <value><![CDATA[page.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footer]]></selector>\r
- <name><![CDATA[width]]></name>\r
- <value><![CDATA[page.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.footerOptions li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.footerOptions li.extraButton]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.footerMenu li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#main]]></selector>\r
- <name><![CDATA[width]]></name>\r
- <value><![CDATA[page.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#userPanel]]></selector>\r
- <name><![CDATA[max-width]]></name>\r
- <value><![CDATA[page.width.max]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[max-width]]></name>\r
- <value><![CDATA[page.width.max]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footer]]></selector>\r
- <name><![CDATA[max-width]]></name>\r
- <value><![CDATA[page.width.max]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#main]]></selector>\r
- <name><![CDATA[max-width]]></name>\r
- <value><![CDATA[page.width.max]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#userPanel]]></selector>\r
- <name><![CDATA[min-width]]></name>\r
- <value><![CDATA[page.width.min]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[min-width]]></name>\r
- <value><![CDATA[page.width.min]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footer]]></selector>\r
- <name><![CDATA[min-width]]></name>\r
- <value><![CDATA[page.width.min]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#main]]></selector>\r
- <name><![CDATA[min-width]]></name>\r
- <value><![CDATA[page.width.min]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footer]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[body]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.columnContainer]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[* a.externalURL]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.external.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[* a.externalURL:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.external.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[selection.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[selection.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeContainer a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeMessage]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.activeMessage]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[selection.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.attachmentFile ul li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.attachmentPreview ul li a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.attachmentPreview ul li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.attachmentPreview ul li:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarDisplay div]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarDisplay div]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarDisplay div]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect li label]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect li label]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect li label]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect li label:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[selection.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect li label:hover]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect li label:hover]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.boardlistCounter]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.boardlistDescription]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.boardlistLastPost]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.boardlistSubboards]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.boardlistUsersOnline]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border .container-1 a:active]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.active]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border .container-2 a:active]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.active]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border .container-3 a:active]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.active]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border .containerHead a:active]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.active]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border .tableList td]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.border .tableList th]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.breadCrumbs]]></selector>\r
- <name><![CDATA[line-height]]></name>\r
- <value><![CDATA[page.font.line.height]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.dynBoxInner]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .signature]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-1:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-1:hover a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-1:hover .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-1:hover .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-1:hover .columnTitle a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-1:hover .columnTopic .topic a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-1:hover .columnUsername a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container2.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 fieldset fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 fieldset fieldset.noJavaScript fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container2.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 legend]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .formFieldDesc]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.color-1 legend]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container2.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 .formFieldDesc]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 .signature]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-2:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-2:hover a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-2:hover .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-2:hover .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-2:hover .columnTitle a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-2:hover .columnTopic .topic a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-2:hover .columnUsername a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 fieldset fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container2.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 legend]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.color-2 legend]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container3.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container2.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 fieldset fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container3.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-4]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container4.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-4]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container4.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-4 .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container4.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-4 .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container4.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-4 a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container4.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-4 a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container4.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.itemList .itemListCategory]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container3.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.itemList .itemListTitle]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.itemList .itemListTitle]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.itemList .itemListTitle]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>\r
- <name><![CDATA[border-top-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>\r
- <name><![CDATA[border-top-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>\r
- <name><![CDATA[border-top-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>\r
- <name><![CDATA[border-top-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>\r
- <name><![CDATA[border-top-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>\r
- <name><![CDATA[border-top-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>\r
- <name><![CDATA[border-top-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>\r
- <name><![CDATA[border-top-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>\r
- <name><![CDATA[border-top-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.simpleBar ul]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container3.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.simpleBar ul li]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.simpleBar ul li a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.simpleBar ul li a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.simpleBar ul li a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container4.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.simpleBar ul li.selected a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container4.background.color]]></value>\r
- </attribute> \r
- <attribute>\r
- <selector><![CDATA[.containerHead]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.head.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.containerHead]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[container.head.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.containerHead]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.containerHead .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.containerHead .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.containerHead a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.containerHead a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 .containerHead a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 .containerHead a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footer]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.dividers .messageAuthor]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.dividers .userAvatar]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.dividers .userCredits]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.dividers .userMessenger]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.dividers .userSymbols]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.editNote]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.editNote]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.editNote]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.editNote]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.deleteNote]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.deleteNote]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.deleteNote]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.deleteNote]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.editor textarea]]></selector>\r
- <name><![CDATA[font-family]]></name>\r
- <value><![CDATA[input.font]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.editor textarea]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[input.font.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.editor textarea]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.editor textarea:focus]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.error]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.error]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.error]]></selector>\r
- <name><![CDATA[line-height]]></name>\r
- <value><![CDATA[page.font.line.height]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.firstPost]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.formField label]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.formFieldDesc]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.formFieldDesc]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.iframeBody]]></selector>\r
- <name><![CDATA[font-family]]></name>\r
- <value><![CDATA[page.font]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.iframeBody]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.iframeBody]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.info]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.info]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.info]]></selector>\r
- <name><![CDATA[line-height]]></name>\r
- <value><![CDATA[page.font.line.height]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarFooter]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarFooter]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarFooter]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarFooter td]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.head.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarFooter td]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[container.head.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarFooter td a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarFooter td a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarFooter td span]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarFooter td span]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarHeader]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarHeader]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarHeader]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarHeader td]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.head.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarHeader td]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[container.head.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarHeader td a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarHeader td a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarHeader td span]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarHeader td span]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarTable]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarTable]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarTable]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarTable]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarTable]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarTable a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[selection.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[input.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[input.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[input.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[input.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText]]></selector>\r
- <name><![CDATA[font-family]]></name>\r
- <value><![CDATA[input.font]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[input.font.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText:focus]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[input.background.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText:focus]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[input.border.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText:focus]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[input.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.inputText:focus]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.large.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.large.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.large.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.large.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.large.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.large.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.large.border.inner.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.large.border.inner.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.large.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a span]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[buttons.large.caption.hide]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.large.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.large.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.large.border.inner.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.large.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.large.border.outer.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainMenu]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[page.alignment.margin]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainMenu]]></selector>\r
- <name><![CDATA[width]]></name>\r
- <value><![CDATA[page.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainMenu]]></selector>\r
- <name><![CDATA[max-width]]></name>\r
- <value><![CDATA[page.width.max]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainMenu]]></selector>\r
- <name><![CDATA[min-width]]></name>\r
- <value><![CDATA[page.width.min]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.main.bar.hide]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .active a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.main.active.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .active a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.main.active.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .active a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.main.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .active a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.main.active.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .active a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.main.active.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .firstActive a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.main.active.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .firstActive a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.main.active.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .firstActive a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.main.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .firstActive a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.main.active.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .firstActive a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.main.active.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .lastActive a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.main.active.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .lastActive a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.main.active.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .lastActive a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.main.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .lastActive a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.main.active.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .lastActive a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.main.active.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.main.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.main.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.main.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.main.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.main.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.main.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu .mainMenuInner]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[menu.main.position]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[selection.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>\r
- <name><![CDATA[border-bottom-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>\r
- <name><![CDATA[border-top-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mainMenu span]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[menu.main.caption.hide]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.marked]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.markedDayField a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.markedDayField a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[selection.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.markedDayField a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[selection.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.markedDayField a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.markedDayField a]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.markedDayField a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mceEditor .mceColors li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mceResizeBox]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.mceResizeBox]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li .memberName]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li .memberName]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li .memberName]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li .memberName]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li .memberName:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li .memberName:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li .memberName:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li .memberRemove]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li .memberRemove:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.memberList li:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.message]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.message]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.message]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.message .messageSidebar]]></selector>\r
- <name><![CDATA[text-align]]></name>\r
- <value><![CDATA[messages.sidebar.text.alignment]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.message h3]]></selector>\r
- <name><![CDATA[line-height]]></name>\r
- <value><![CDATA[page.font.line.height]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.message h4]]></selector>\r
- <name><![CDATA[line-height]]></name>\r
- <value><![CDATA[page.font.line.height]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageBody]]></selector>\r
- <name><![CDATA[line-height]]></name>\r
- <value><![CDATA[page.font.line.height]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageContainer]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container3.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageContainerFooter]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container3.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageContent]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageContentInner]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageFooter]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageFooter]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageFooter]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageFooterLeft]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageFooterLeft]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageFooterLeft]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageFooterRight]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageFooterRight]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageFooterRight]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageHeader]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageHeader]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageHeader]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1 .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1 .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1 .signature]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1 .smallButtons a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1 .smallButtons a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1 .memberName]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1 .memberName:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2 .memberName]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2 .memberName:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1 a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-1 a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container2.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2 .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2 .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2 .signature]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2 .smallButtons a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2 .smallButtons a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2 a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageInner .color-2 a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.moderators]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons li span]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.inner.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.inner.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons li]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons li]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons li div.pageMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons li div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons li:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .optionButtons a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .optionButtons a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation .active]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[selection.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation .active]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation .active]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation .active span]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation .active span]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[selection.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation .active span]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.inner.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.inner.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation input]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li span]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li span]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.inner.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li span]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.inner.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li span]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li span:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li ul]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li ul]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li ul]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li ul]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li.children span]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li.children span]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li.children span]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li.children:hover > span]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li.children:hover > span]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li.children:hover span]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li.children:hover span]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pageNavigation li:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.large.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.large.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.large.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.large.border.inner.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.large.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.large.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.large.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.large.border.inner.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmEditFolders a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.large.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmMove p]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmUsage]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmUsageBar]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmUsageBar]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.pmUsageBar]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.popupMenu]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.popupMenu]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.popupMenu]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.popupMenu]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#userCardCredits]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.friendsConnection]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.friendsNetwork]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.friendsNone]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.guestAdvice]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.buttonBar]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.buttonBar]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu li.container-1 a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu li.container-2 a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container2.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .twoRows a span]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .twoRows a:hover span]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .twoRows a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.quoteBox]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.quoteBox]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.quoteBox]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.quoteBox]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.signature]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.signature]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.signature]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons span]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[buttons.small.caption.hide]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.inner.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.inner.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .smallButtons a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .smallButtons a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 .smallButtons a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 .smallButtons a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 .smallButtons a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-3 .smallButtons a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li span]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.extraButton span]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.inner.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.inner.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.inner.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[li.extraButton]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallFont]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.loginPopup]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.statusDisplay]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subHeadline]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subHeadline]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subHeadline]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu div.containerHead]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.tab.button.active.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.button.active.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[menu.tab.button.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[menu.tab.button.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.tab.button.active.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.button.active.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[menu.tab.button.border.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul li]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul li a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.tab.button.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul li a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[menu.tab.button.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul li a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.button.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.tab.button.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[menu.tab.button.border.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[menu.tab.button.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.button.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.success]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.success]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.success]]></selector>\r
- <name><![CDATA[line-height]]></name>\r
- <value><![CDATA[page.font.line.height]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active .emptyHead]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[table.head.active.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active .emptyHead]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[table.head.active.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active .emptyHead]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[table.head.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active .emptyHead]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[table.head.active.border.bottom.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[table.head.active.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[table.head.active.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[table.head.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[table.head.active.border.bottom.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[table.head.active.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[table.head.active.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[table.head.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[table.head.active.border.bottom.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .emptyHead]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[table.head.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .emptyHead]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[table.head.border.bottom.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .emptyHead]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[table.head.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .emptyHead]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[table.head.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[table.head.border.bottom.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[table.head.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[table.head.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[table.head.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[table.head.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[table.head.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[table.head.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead a:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[table.head.border.bottom.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableList th]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.tab.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.tab.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.tab.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.tab.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.tab.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.tab.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.head.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.tab.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li.activeTabMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.head.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu li.activeTabMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container.head.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu ul li.activeTabMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.tab.active.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu ul li.activeTabMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.active.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.tab.active.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.active.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.tab.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.threadStarterPost .poll .container-3]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container3.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableList tbody tr:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container3.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userAvatar]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userAvatar a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userAvatarFramed]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userAvatarFramed]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container4.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userAvatarFramed a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userCredits]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userExtras]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userPanel]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userPanel a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userPanel a:active]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.active]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.warning]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.warning]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.warning]]></selector>\r
- <name><![CDATA[line-height]]></name>\r
- <value><![CDATA[page.font.line.height]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.weekDays]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container2.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.weekDays]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[a:active]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.active]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container4.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[body]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[page.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[body]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[page.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[body]]></selector>\r
- <name><![CDATA[background-position]]></name>\r
- <value><![CDATA[page.background.image.alignment]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[body]]></selector>\r
- <name><![CDATA[background-attachment]]></name>\r
- <value><![CDATA[page.background.image.attachment]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[body]]></selector>\r
- <name><![CDATA[background-repeat]]></name>\r
- <value><![CDATA[page.background.image.repeat]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[body]]></selector>\r
- <name><![CDATA[font-family]]></name>\r
- <value><![CDATA[page.font]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[body]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.inlineCalendar]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu li.active a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu li.active a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[selection.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu li.active a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>\r
- <name><![CDATA[border-bottom-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>\r
- <name><![CDATA[border-top-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>\r
- <name><![CDATA[border-top-color]]></name>\r
- <value><![CDATA[divider.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>\r
- <name><![CDATA[border-top-style]]></name>\r
- <value><![CDATA[divider.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>\r
- <name><![CDATA[border-top-width]]></name>\r
- <value><![CDATA[divider.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableList tr div.pageMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableList tr div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[menu.dropdown.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[fieldset]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[fieldset]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[fieldset]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container1.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[fieldset fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container2.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[h2]]></selector>\r
- <name><![CDATA[font-family]]></name>\r
- <value><![CDATA[page.title.font]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[h2]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.title.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[h2]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.title.font.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[h2]]></selector>\r
- <name><![CDATA[font-style]]></name>\r
- <value><![CDATA[page.title.font.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[h2]]></selector>\r
- <name><![CDATA[font-weight]]></name>\r
- <value><![CDATA[page.title.font.weight]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[h2 a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.title.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[h2 a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.title.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[html]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[page.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[html]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[page.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[html]]></selector>\r
- <name><![CDATA[background-position]]></name>\r
- <value><![CDATA[page.background.image.alignment]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[html]]></selector>\r
- <name><![CDATA[background-attachment]]></name>\r
- <value><![CDATA[page.background.image.attachment]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[html]]></selector>\r
- <name><![CDATA[background-repeat]]></name>\r
- <value><![CDATA[page.background.image.repeat]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[legend]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[input.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[input.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[input.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[input.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select]]></selector>\r
- <name><![CDATA[font-family]]></name>\r
- <value><![CDATA[input.font]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[input.font.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select:focus]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[input.background.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select:focus]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[input.border.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select:focus]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[input.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[select:focus]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[td.columnLastActivity]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[td.columnLocation]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[td.columnRegistrationDate]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[td.columnUserAgent]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[input.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[input.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[input.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[input.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea]]></selector>\r
- <name><![CDATA[font-family]]></name>\r
- <value><![CDATA[input.font]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[input.font.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea]]></selector>\r
- <name><![CDATA[font-family]]></name>\r
- <value><![CDATA[page.font]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea:focus]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[input.background.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea:focus]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[input.border.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea:focus]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[input.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[textarea:focus]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color.focus]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[buttons.small.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[buttons.small.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[buttons.small.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.messageNumber:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[buttons.small.border.outer.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#search]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#search .searchContainer p a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.button.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#search .searchContainer p a]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#search .searchContainer p a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.tab.button.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.searchContainer]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.searchContainer]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.searchContainer]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[page.frame.general]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[page.frame.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[page.frame.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[border-top-width]]></name>\r
- <value><![CDATA[page.frame.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[border-right-width]]></name>\r
- <value><![CDATA[page.frame.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[border-left-width]]></name>\r
- <value><![CDATA[page.frame.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[page.frame.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[margin-top]]></name>\r
- <value><![CDATA[page.frame.margin]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[padding-top]]></name>\r
- <value><![CDATA[page.frame.padding.vertical]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[padding-right]]></name>\r
- <value><![CDATA[page.frame.padding.horizontal]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#headerContainer]]></selector>\r
- <name><![CDATA[padding-left]]></name>\r
- <value><![CDATA[page.frame.padding.horizontal]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainContainer]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[page.frame.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainContainer]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[page.frame.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainContainer]]></selector>\r
- <name><![CDATA[border-right-width]]></name>\r
- <value><![CDATA[page.frame.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainContainer]]></selector>\r
- <name><![CDATA[border-left-width]]></name>\r
- <value><![CDATA[page.frame.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainContainer]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[page.frame.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainContainer]]></selector>\r
- <name><![CDATA[padding-right]]></name>\r
- <value><![CDATA[page.frame.padding.horizontal]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#mainContainer]]></selector>\r
- <name><![CDATA[padding-left]]></name>\r
- <value><![CDATA[page.frame.padding.horizontal]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[page.frame.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[page.frame.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[border-right-width]]></name>\r
- <value><![CDATA[page.frame.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[border-bottom-width]]></name>\r
- <value><![CDATA[page.frame.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[border-left-width]]></name>\r
- <value><![CDATA[page.frame.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[page.frame.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[margin-bottom]]></name>\r
- <value><![CDATA[page.frame.margin]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[padding-right]]></name>\r
- <value><![CDATA[page.frame.padding.horizontal]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[padding-bottom]]></name>\r
- <value><![CDATA[page.frame.padding.vertical]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#footerContainer]]></selector>\r
- <name><![CDATA[padding-left]]></name>\r
- <value><![CDATA[page.frame.padding.horizontal]]></value>\r
- </attribute>\r
- </import>\r
- \r
- <!-- these obsolete declarations will be deleted -->\r
- <delete>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[table.head.active.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[table.head.active.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead .active]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[table.head.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[table.head.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[table.head.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[table.head.caption.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead label:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[table.head.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead label:hover]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[table.head.background.image.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead label:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[table.head.caption.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead div]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[table.head.border.bottom.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead div]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[table.head.border.bottom.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableHead div:hover]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[table.head.border.bottom.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableList tbody tr:hover .columnUsername a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableList tbody tr:hover .columnTopic .topic a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableList tbody tr:hover .columnTitle a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-1:hover .columnUsername a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-1:hover .columnTopic .topic a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-2:hover .columnUsername a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-2:hover .columnTopic .topic a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-3:hover .columnUsername a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr.container-3:hover .columnTopic .topic a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr:hover .columnTopic .topic a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr:hover .columnUsername a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr:hover a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr:hover .light]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr:hover .light a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[tr:hover .columnTitle a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[page.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .active a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .active a]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[selection.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[div.pageMenu .active a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.copyright]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#header]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#page]]></selector>\r
- <name><![CDATA[]]></name>\r
- <value><![CDATA[page.alignment.margin]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#page]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#page]]></selector>\r
- <name><![CDATA[width]]></name>\r
- <value><![CDATA[page.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#page]]></selector>\r
- <name><![CDATA[max-width]]></name>\r
- <value><![CDATA[page.width.max]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[#page]]></selector>\r
- <name><![CDATA[min-width]]></name>\r
- <value><![CDATA[page.width.min]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallPages]]></selector>\r
- <name><![CDATA[font-size]]></name>\r
- <value><![CDATA[page.font.2nd.size]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[body]]></selector>\r
- <name><![CDATA[text-align]]></name>\r
- <value><![CDATA[page.alignment]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[buttons.small.background.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.profileDisplay fieldset]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userProfileBox #userProfileAvatar fieldset div]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .disabled]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-1 .disabled a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container1.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 .disabled]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.container-2 .disabled a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container2.font.2nd.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.codeBox]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[input.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.codeBox]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.codeBox]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[messages.boxes.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.codeBox]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[messages.boxes.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.quoteBox]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[input.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.quoteBox]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[input.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.quoteBox]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[messages.boxes.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.attachmentPreview ul li a:hover]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarDisplay div]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userAvatarFramed]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[input.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userAvatarFramed]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[messages.boxes.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.codeLineNumbers]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container3.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.codeLineNumbers]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[container3.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.codeBox]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.codeBox]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[container.border.outer.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.codeBox]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[container.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userProfileContent .fieldTitle]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.userProfileContent .fieldValue]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect li label]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container.border.inner.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
- <name><![CDATA[background-image]]></name>\r
- <value><![CDATA[selection.background.image]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[selection.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.avatarSelect .selected label]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li.selected]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[selection.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li.selected]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li.selected]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li.selected > a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.largeButtons li.selected > a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li.selected]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[selection.border.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li.selected]]></selector>\r
- <name><![CDATA[border-style]]></name>\r
- <value><![CDATA[selection.border.style]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li.selected]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[selection.border.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li.selected > a]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[selection.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.smallButtons li.selected > a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[selection.link.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.optionButtons li]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[menu.dropdown.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.li.extraButton]]></selector>\r
- <name><![CDATA[border-width]]></name>\r
- <value><![CDATA[buttons.small.border.outer.width]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.attachmentPreview ul li a]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container.border.outer.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.galleryAlbumCover img]]></selector>\r
- <name><![CDATA[background-color]]></name>\r
- <value><![CDATA[container4.background.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[blockquote.wysiwygQuote]]></selector>\r
- <name><![CDATA[border-color]]></name>\r
- <value><![CDATA[container1.font.color]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableList div.pageMenu a:hover]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color.hover]]></value>\r
- </attribute>\r
- <attribute>\r
- <selector><![CDATA[.tableList div.pageMenu a]]></selector>\r
- <name><![CDATA[color]]></name>\r
- <value><![CDATA[menu.dropdown.link.color]]></value>\r
- </attribute>\r
- </delete>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/styleattributes.xsd">
+ <import>
+ <attribute>
+ <selector><![CDATA[]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[user.additional.style.input1.use]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[user.additional.style.input2.use]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[page.header.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[page.header.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[background-position]]></name>
+ <value><![CDATA[page.header.background.image.alignment]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[background-repeat]]></name>
+ <value><![CDATA[page.header.background.image.repeat]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo]]></selector>
+ <name><![CDATA[border-bottom-width]]></name>
+ <value><![CDATA[menu.main.bar.divider.show]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo]]></selector>
+ <name><![CDATA[height]]></name>
+ <value><![CDATA[page.header.height]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo .pageLogo]]></selector>
+ <name><![CDATA[text-align]]></name>
+ <value><![CDATA[page.logo.image.alignment]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo .pageLogo img]]></selector>
+ <name><![CDATA[margin-left]]></name>
+ <value><![CDATA[page.logo.image.padding.left]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo .pageLogo img]]></selector>
+ <name><![CDATA[margin-right]]></name>
+ <value><![CDATA[page.logo.image.padding.right]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo .pageLogo img]]></selector>
+ <name><![CDATA[margin-top]]></name>
+ <value><![CDATA[page.logo.image.padding.top]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1]]></selector>
+ <name><![CDATA[font-family]]></name>
+ <value><![CDATA[global.title.font]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1]]></selector>
+ <name><![CDATA[text-align]]></name>
+ <value><![CDATA[global.title.font.alignment]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[global.title.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[global.title.font.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1]]></selector>
+ <name><![CDATA[font-style]]></name>
+ <value><![CDATA[global.title.font.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1]]></selector>
+ <name><![CDATA[font-weight]]></name>
+ <value><![CDATA[global.title.font.weight]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[global.title.hide]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1 a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[global.title.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1 a]]></selector>
+ <name><![CDATA[padding-left]]></name>
+ <value><![CDATA[global.title.font.padding.left]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1 a]]></selector>
+ <name><![CDATA[padding-right]]></name>
+ <value><![CDATA[global.title.font.padding.right]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#logo h1 a]]></selector>
+ <name><![CDATA[padding-top]]></name>
+ <value><![CDATA[global.title.font.padding.top]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#userPanel]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[page.alignment.margin]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[page.alignment.margin]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footer]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[page.alignment.margin]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#main]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[page.alignment.margin]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#userPanel]]></selector>
+ <name><![CDATA[width]]></name>
+ <value><![CDATA[page.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[width]]></name>
+ <value><![CDATA[page.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footer]]></selector>
+ <name><![CDATA[width]]></name>
+ <value><![CDATA[page.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.footerOptions li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.footerOptions li.extraButton]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.footerMenu li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#main]]></selector>
+ <name><![CDATA[width]]></name>
+ <value><![CDATA[page.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#userPanel]]></selector>
+ <name><![CDATA[max-width]]></name>
+ <value><![CDATA[page.width.max]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[max-width]]></name>
+ <value><![CDATA[page.width.max]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footer]]></selector>
+ <name><![CDATA[max-width]]></name>
+ <value><![CDATA[page.width.max]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#main]]></selector>
+ <name><![CDATA[max-width]]></name>
+ <value><![CDATA[page.width.max]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#userPanel]]></selector>
+ <name><![CDATA[min-width]]></name>
+ <value><![CDATA[page.width.min]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[min-width]]></name>
+ <value><![CDATA[page.width.min]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footer]]></selector>
+ <name><![CDATA[min-width]]></name>
+ <value><![CDATA[page.width.min]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#main]]></selector>
+ <name><![CDATA[min-width]]></name>
+ <value><![CDATA[page.width.min]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footer]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[body]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.columnContainer]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[* a.externalURL]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.external.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[* a.externalURL:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.external.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[selection.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[selection.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeContainer a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeMessage]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.activeMessage]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[selection.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.attachmentFile ul li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.attachmentPreview ul li a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.attachmentPreview ul li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.attachmentPreview ul li:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarDisplay div]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarDisplay div]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarDisplay div]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect li label]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect li label]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect li label]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect li label:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[selection.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect li label:hover]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect li label:hover]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.boardlistCounter]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.boardlistDescription]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.boardlistLastPost]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.boardlistSubboards]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.boardlistUsersOnline]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border .container-1 a:active]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.active]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border .container-2 a:active]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.active]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border .container-3 a:active]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.active]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border .containerHead a:active]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.active]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border .tableList td]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.border .tableList th]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.breadCrumbs]]></selector>
+ <name><![CDATA[line-height]]></name>
+ <value><![CDATA[page.font.line.height]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.dynBoxInner]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .signature]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-1:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-1:hover a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-1:hover .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-1:hover .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-1:hover .columnTitle a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-1:hover .columnTopic .topic a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-1:hover .columnUsername a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container2.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 fieldset fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 fieldset fieldset.noJavaScript fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container2.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 legend]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .formFieldDesc]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.color-1 legend]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container2.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 .formFieldDesc]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 .signature]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-2:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-2:hover a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-2:hover .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-2:hover .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-2:hover .columnTitle a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-2:hover .columnTopic .topic a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-2:hover .columnUsername a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 fieldset fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container2.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 legend]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.color-2 legend]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container3.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container2.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 fieldset fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container3.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-4]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container4.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-4]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container4.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-4 .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container4.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-4 .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container4.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-4 a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container4.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-4 a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container4.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.itemList .itemListCategory]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container3.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.itemList .itemListTitle]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.itemList .itemListTitle]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.itemList .itemListTitle]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>
+ <name><![CDATA[border-top-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>
+ <name><![CDATA[border-top-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blogBoxArchive > .border > .itemList > li:last-child > .itemListTitle]]></selector>
+ <name><![CDATA[border-top-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>
+ <name><![CDATA[border-top-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>
+ <name><![CDATA[border-top-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemListTitle]]></selector>
+ <name><![CDATA[border-top-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>
+ <name><![CDATA[border-top-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>
+ <name><![CDATA[border-top-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blogBoxArchive .itemList > li > .itemList > li > .itemList]]></selector>
+ <name><![CDATA[border-top-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.simpleBar ul]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container3.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.simpleBar ul li]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.simpleBar ul li a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.simpleBar ul li a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.simpleBar ul li a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container4.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.simpleBar ul li.selected a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container4.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.containerHead]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.head.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.containerHead]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[container.head.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.containerHead]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.containerHead .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.containerHead .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.containerHead a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.containerHead a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 .containerHead a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 .containerHead a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footer]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.dividers .messageAuthor]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.dividers .userAvatar]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.dividers .userCredits]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.dividers .userMessenger]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.dividers .userSymbols]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.editNote]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.editNote]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.editNote]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.editNote]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.deleteNote]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.deleteNote]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.deleteNote]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.deleteNote]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.editor textarea]]></selector>
+ <name><![CDATA[font-family]]></name>
+ <value><![CDATA[input.font]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.editor textarea]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[input.font.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.editor textarea]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.editor textarea:focus]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.error]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.error]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.error]]></selector>
+ <name><![CDATA[line-height]]></name>
+ <value><![CDATA[page.font.line.height]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.firstPost]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.formField label]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.formFieldDesc]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.formFieldDesc]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.iframeBody]]></selector>
+ <name><![CDATA[font-family]]></name>
+ <value><![CDATA[page.font]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.iframeBody]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.iframeBody]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.info]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.info]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.info]]></selector>
+ <name><![CDATA[line-height]]></name>
+ <value><![CDATA[page.font.line.height]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarFooter]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarFooter]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarFooter]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarFooter td]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.head.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarFooter td]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[container.head.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarFooter td a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarFooter td a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarFooter td span]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarFooter td span]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarHeader]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarHeader]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarHeader]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarHeader td]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.head.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarHeader td]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[container.head.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarHeader td a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarHeader td a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarHeader td span]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarHeader td span]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarTable]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarTable]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarTable]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarTable]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarTable]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarTable a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[selection.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inlineCalendarTable a:hover]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[input.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[input.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[input.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[input.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText]]></selector>
+ <name><![CDATA[font-family]]></name>
+ <value><![CDATA[input.font]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[input.font.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText:focus]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[input.background.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText:focus]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[input.border.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText:focus]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[input.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.inputText:focus]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.large.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.large.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.large.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.large.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.large.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.large.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.large.border.inner.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.large.border.inner.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.large.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a span]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[buttons.large.caption.hide]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.large.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.large.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.large.border.inner.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.large.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.large.border.outer.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainMenu]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[page.alignment.margin]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainMenu]]></selector>
+ <name><![CDATA[width]]></name>
+ <value><![CDATA[page.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainMenu]]></selector>
+ <name><![CDATA[max-width]]></name>
+ <value><![CDATA[page.width.max]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainMenu]]></selector>
+ <name><![CDATA[min-width]]></name>
+ <value><![CDATA[page.width.min]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.main.bar.hide]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .active a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.main.active.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .active a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.main.active.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .active a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.main.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .active a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.main.active.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .active a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.main.active.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .firstActive a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.main.active.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .firstActive a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.main.active.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .firstActive a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.main.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .firstActive a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.main.active.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .firstActive a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.main.active.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .lastActive a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.main.active.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .lastActive a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.main.active.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .lastActive a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.main.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .lastActive a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.main.active.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .lastActive a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.main.active.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.main.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.main.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.main.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.main.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.main.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.main.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu .mainMenuInner]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[menu.main.position]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[selection.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu .active a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu .bottomSeparator a]]></selector>
+ <name><![CDATA[border-bottom-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu .topSeparator a]]></selector>
+ <name><![CDATA[border-top-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu div.pageMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mainMenu span]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[menu.main.caption.hide]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.marked]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.markedDayField a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.markedDayField a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[selection.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.markedDayField a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[selection.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.markedDayField a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.markedDayField a]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.markedDayField a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mceEditor .mceColors li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mceResizeBox]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.mceResizeBox]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li .memberName]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li .memberName]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li .memberName]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li .memberName]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li .memberName:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li .memberName:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li .memberName:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li .memberRemove]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li .memberRemove:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.memberList li:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.message]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.message]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.message]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.message .messageSidebar]]></selector>
+ <name><![CDATA[text-align]]></name>
+ <value><![CDATA[messages.sidebar.text.alignment]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.message h3]]></selector>
+ <name><![CDATA[line-height]]></name>
+ <value><![CDATA[page.font.line.height]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.message h4]]></selector>
+ <name><![CDATA[line-height]]></name>
+ <value><![CDATA[page.font.line.height]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageBody]]></selector>
+ <name><![CDATA[line-height]]></name>
+ <value><![CDATA[page.font.line.height]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageContainer]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container3.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageContainerFooter]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container3.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageContent]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageContentInner]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageFooter]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageFooter]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageFooter]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageFooterLeft]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageFooterLeft]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageFooterLeft]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageFooterRight]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageFooterRight]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageFooterRight]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageHeader]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageHeader]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageHeader]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1 .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1 .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1 .signature]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1 .smallButtons a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1 .smallButtons a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1 .memberName]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1 .memberName:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2 .memberName]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2 .memberName:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1 a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-1 a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container2.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2 .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2 .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2 .signature]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2 .smallButtons a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2 .smallButtons a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2 a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageInner .color-2 a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.moderators]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons li span]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.inner.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.inner.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons li]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons li]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons li div.pageMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons li div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons li:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .optionButtons a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .optionButtons a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation .active]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[selection.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation .active]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation .active]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation .active span]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation .active span]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[selection.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation .active span]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.inner.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.inner.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation input]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li span]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li span]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.inner.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li span]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.inner.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li span]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li span:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li ul]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li ul]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li ul]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li ul]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li.children span]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li.children span]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li.children span]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li.children:hover > span]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li.children:hover > span]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li.children:hover span]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li.children:hover span]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pageNavigation li:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.large.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.large.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.large.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.large.border.inner.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.large.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.large.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.large.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.large.border.inner.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmEditFolders a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.large.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmMove p]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmUsage]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmUsageBar]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmUsageBar]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.pmUsageBar]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.popupMenu]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.popupMenu]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.popupMenu]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.popupMenu]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#userCardCredits]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.friendsConnection]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.friendsNetwork]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.friendsNone]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.guestAdvice]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.buttonBar]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.buttonBar]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu li.container-1 a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu li.container-2 a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container2.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .twoRows a span]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .twoRows a:hover span]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .twoRows a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.quoteBox]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.quoteBox]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.quoteBox]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.quoteBox]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.signature]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.signature]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.signature]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons span]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[buttons.small.caption.hide]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.inner.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.inner.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .smallButtons a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .smallButtons a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 .smallButtons a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 .smallButtons a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 .smallButtons a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-3 .smallButtons a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li span]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.extraButton span]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.inner.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.inner.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.inner.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[li.extraButton]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallFont]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.loginPopup]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.statusDisplay]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subHeadline]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subHeadline]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subHeadline]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu div.containerHead]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.tab.button.active.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.button.active.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[menu.tab.button.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[menu.tab.button.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.tab.button.active.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.button.active.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul .activeSubTabMenu a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[menu.tab.button.border.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul li]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul li a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.tab.button.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul li a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[menu.tab.button.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul li a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.button.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.tab.button.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[menu.tab.button.border.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[menu.tab.button.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.subTabMenu ul li a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.button.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.success]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.success]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.success]]></selector>
+ <name><![CDATA[line-height]]></name>
+ <value><![CDATA[page.font.line.height]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active .emptyHead]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[table.head.active.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active .emptyHead]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[table.head.active.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active .emptyHead]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[table.head.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active .emptyHead]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[table.head.active.border.bottom.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[table.head.active.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[table.head.active.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[table.head.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[table.head.active.border.bottom.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[table.head.active.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[table.head.active.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[table.head.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[table.head.active.border.bottom.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .emptyHead]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[table.head.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .emptyHead]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[table.head.border.bottom.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .emptyHead]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[table.head.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .emptyHead]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[table.head.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[table.head.border.bottom.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[table.head.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[table.head.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[table.head.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[table.head.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[table.head.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[table.head.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead a:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[table.head.border.bottom.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableList th]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.tab.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.tab.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.tab.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.tab.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li.disabled a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.tab.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.tab.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.head.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li.activeTabMenu a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.tab.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li.activeTabMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.head.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu li.activeTabMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container.head.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu ul li.activeTabMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.tab.active.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu ul li.activeTabMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.active.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.tab.active.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.active.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tabMenu ul li.activeTabMenu a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.tab.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.threadStarterPost .poll .container-3]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container3.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableList tbody tr:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container3.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userAvatar]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userAvatar a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userAvatarFramed]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userAvatarFramed]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container4.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userAvatarFramed a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userCredits]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userExtras]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userPanel]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userPanel a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userPanel a:active]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.active]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.warning]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.warning]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.warning]]></selector>
+ <name><![CDATA[line-height]]></name>
+ <value><![CDATA[page.font.line.height]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.weekDays]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container2.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.weekDays]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[a:active]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.active]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container4.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[body]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[page.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[body]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[page.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[body]]></selector>
+ <name><![CDATA[background-position]]></name>
+ <value><![CDATA[page.background.image.alignment]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[body]]></selector>
+ <name><![CDATA[background-attachment]]></name>
+ <value><![CDATA[page.background.image.attachment]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[body]]></selector>
+ <name><![CDATA[background-repeat]]></name>
+ <value><![CDATA[page.background.image.repeat]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[body]]></selector>
+ <name><![CDATA[font-family]]></name>
+ <value><![CDATA[page.font]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[body]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.inlineCalendar]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.pageMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.pageMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.messageInner div.smallButtons div.pageMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu li.active a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu li.active a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[selection.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu li.active a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .bottomSeparator a]]></selector>
+ <name><![CDATA[border-bottom-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .topSeparator a]]></selector>
+ <name><![CDATA[border-top-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>
+ <name><![CDATA[border-top-color]]></name>
+ <value><![CDATA[divider.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>
+ <name><![CDATA[border-top-style]]></name>
+ <value><![CDATA[divider.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.blog .userBlogCategoryAdd]]></selector>
+ <name><![CDATA[border-top-width]]></name>
+ <value><![CDATA[divider.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableList tr div.pageMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableList tr div.pageMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.smallButtons div.pageMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[menu.dropdown.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.smallButtons div.pageMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[fieldset]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[fieldset]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[fieldset]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container1.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[fieldset fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container2.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[h2]]></selector>
+ <name><![CDATA[font-family]]></name>
+ <value><![CDATA[page.title.font]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[h2]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.title.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[h2]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.title.font.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[h2]]></selector>
+ <name><![CDATA[font-style]]></name>
+ <value><![CDATA[page.title.font.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[h2]]></selector>
+ <name><![CDATA[font-weight]]></name>
+ <value><![CDATA[page.title.font.weight]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[h2 a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.title.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[h2 a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.title.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[html]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[page.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[html]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[page.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[html]]></selector>
+ <name><![CDATA[background-position]]></name>
+ <value><![CDATA[page.background.image.alignment]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[html]]></selector>
+ <name><![CDATA[background-attachment]]></name>
+ <value><![CDATA[page.background.image.attachment]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[html]]></selector>
+ <name><![CDATA[background-repeat]]></name>
+ <value><![CDATA[page.background.image.repeat]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[legend]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[input.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[input.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[input.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[input.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select]]></selector>
+ <name><![CDATA[font-family]]></name>
+ <value><![CDATA[input.font]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[input.font.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select:focus]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[input.background.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select:focus]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[input.border.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select:focus]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[input.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[select:focus]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[td.columnLastActivity]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[td.columnLocation]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[td.columnRegistrationDate]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[td.columnUserAgent]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[input.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[input.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[input.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[input.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea]]></selector>
+ <name><![CDATA[font-family]]></name>
+ <value><![CDATA[input.font]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[input.font.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea]]></selector>
+ <name><![CDATA[font-family]]></name>
+ <value><![CDATA[page.font]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea:focus]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[input.background.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea:focus]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[input.border.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea:focus]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[input.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[textarea:focus]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color.focus]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[buttons.small.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[buttons.small.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[buttons.small.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.messageNumber:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[buttons.small.border.outer.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#search]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#search .searchContainer p a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.button.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#search .searchContainer p a]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#search .searchContainer p a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.tab.button.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.searchContainer]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.searchContainer]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.searchContainer]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[page.frame.general]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[page.frame.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[page.frame.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[border-top-width]]></name>
+ <value><![CDATA[page.frame.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[border-right-width]]></name>
+ <value><![CDATA[page.frame.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[border-left-width]]></name>
+ <value><![CDATA[page.frame.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[page.frame.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[margin-top]]></name>
+ <value><![CDATA[page.frame.margin]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[padding-top]]></name>
+ <value><![CDATA[page.frame.padding.vertical]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[padding-right]]></name>
+ <value><![CDATA[page.frame.padding.horizontal]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#headerContainer]]></selector>
+ <name><![CDATA[padding-left]]></name>
+ <value><![CDATA[page.frame.padding.horizontal]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainContainer]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[page.frame.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainContainer]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[page.frame.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainContainer]]></selector>
+ <name><![CDATA[border-right-width]]></name>
+ <value><![CDATA[page.frame.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainContainer]]></selector>
+ <name><![CDATA[border-left-width]]></name>
+ <value><![CDATA[page.frame.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainContainer]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[page.frame.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainContainer]]></selector>
+ <name><![CDATA[padding-right]]></name>
+ <value><![CDATA[page.frame.padding.horizontal]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#mainContainer]]></selector>
+ <name><![CDATA[padding-left]]></name>
+ <value><![CDATA[page.frame.padding.horizontal]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[page.frame.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[page.frame.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[border-right-width]]></name>
+ <value><![CDATA[page.frame.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[border-bottom-width]]></name>
+ <value><![CDATA[page.frame.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[border-left-width]]></name>
+ <value><![CDATA[page.frame.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[page.frame.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[margin-bottom]]></name>
+ <value><![CDATA[page.frame.margin]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[padding-right]]></name>
+ <value><![CDATA[page.frame.padding.horizontal]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[padding-bottom]]></name>
+ <value><![CDATA[page.frame.padding.vertical]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#footerContainer]]></selector>
+ <name><![CDATA[padding-left]]></name>
+ <value><![CDATA[page.frame.padding.horizontal]]></value>
+ </attribute>
+ </import>
+
+ <!-- these obsolete declarations will be deleted -->
+ <delete>
+ <attribute>
+ <selector><![CDATA[.tableHead .active]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[table.head.active.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[table.head.active.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead .active]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[table.head.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[table.head.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[table.head.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[table.head.caption.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead label:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[table.head.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead label:hover]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[table.head.background.image.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead label:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[table.head.caption.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead div]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[table.head.border.bottom.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead div]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[table.head.border.bottom.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableHead div:hover]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[table.head.border.bottom.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableList tbody tr:hover .columnUsername a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableList tbody tr:hover .columnTopic .topic a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableList tbody tr:hover .columnTitle a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-1:hover .columnUsername a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-1:hover .columnTopic .topic a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-2:hover .columnUsername a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-2:hover .columnTopic .topic a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-3:hover .columnUsername a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr.container-3:hover .columnTopic .topic a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr:hover .columnTopic .topic a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr:hover .columnUsername a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr:hover a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr:hover .light]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr:hover .light a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[tr:hover .columnTitle a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[page.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .active a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .active a]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[selection.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[div.pageMenu .active a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.copyright]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#header]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#page]]></selector>
+ <name><![CDATA[]]></name>
+ <value><![CDATA[page.alignment.margin]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#page]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#page]]></selector>
+ <name><![CDATA[width]]></name>
+ <value><![CDATA[page.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#page]]></selector>
+ <name><![CDATA[max-width]]></name>
+ <value><![CDATA[page.width.max]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[#page]]></selector>
+ <name><![CDATA[min-width]]></name>
+ <value><![CDATA[page.width.min]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallPages]]></selector>
+ <name><![CDATA[font-size]]></name>
+ <value><![CDATA[page.font.2nd.size]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[body]]></selector>
+ <name><![CDATA[text-align]]></name>
+ <value><![CDATA[page.alignment]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[buttons.small.background.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.profileDisplay fieldset]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userProfileBox #userProfileAvatar fieldset div]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .disabled]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-1 .disabled a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container1.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 .disabled]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.container-2 .disabled a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container2.font.2nd.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.codeBox]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[input.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.codeBox]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.codeBox]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[messages.boxes.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.codeBox]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[messages.boxes.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.quoteBox]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[input.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.quoteBox]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[input.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.quoteBox]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[messages.boxes.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.attachmentPreview ul li a:hover]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarDisplay div]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userAvatarFramed]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[input.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userAvatarFramed]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[messages.boxes.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.codeLineNumbers]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container3.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.codeLineNumbers]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[container3.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.codeBox]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.codeBox]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[container.border.outer.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.codeBox]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[container.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userProfileContent .fieldTitle]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.userProfileContent .fieldValue]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect li label]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container.border.inner.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect .selected label]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect .selected label]]></selector>
+ <name><![CDATA[background-image]]></name>
+ <value><![CDATA[selection.background.image]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect .selected label]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[selection.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect .selected label]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.avatarSelect .selected label]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li.selected]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[selection.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li.selected]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li.selected]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li.selected > a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.largeButtons li.selected > a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li.selected]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[selection.border.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li.selected]]></selector>
+ <name><![CDATA[border-style]]></name>
+ <value><![CDATA[selection.border.style]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li.selected]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[selection.border.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li.selected > a]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[selection.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.smallButtons li.selected > a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[selection.link.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.optionButtons li]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[menu.dropdown.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.li.extraButton]]></selector>
+ <name><![CDATA[border-width]]></name>
+ <value><![CDATA[buttons.small.border.outer.width]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.attachmentPreview ul li a]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container.border.outer.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.galleryAlbumCover img]]></selector>
+ <name><![CDATA[background-color]]></name>
+ <value><![CDATA[container4.background.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[blockquote.wysiwygQuote]]></selector>
+ <name><![CDATA[border-color]]></name>
+ <value><![CDATA[container1.font.color]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableList div.pageMenu a:hover]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color.hover]]></value>
+ </attribute>
+ <attribute>
+ <selector><![CDATA[.tableList div.pageMenu a]]></selector>
+ <name><![CDATA[color]]></name>
+ <value><![CDATA[menu.dropdown.link.color]]></value>
+ </attribute>
+ </delete>
</data>
\ No newline at end of file
-<!DOCTYPE html>\r
-<html dir="{lang}wcf.global.pageDirection{/lang}" lang="{@LANGUAGE_CODE}">\r
+<!DOCTYPE html>
+<html dir="{lang}wcf.global.pageDirection{/lang}" lang="{@LANGUAGE_CODE}">
-<div id="footerContainer">\r
- <div id="footer">\r
- {include file=footerMenu}\r
- </div>\r
+<div id="footerContainer">
+ <div id="footer">
+ {include file=footerMenu}
+ </div>
</div>
\ No newline at end of file
-<meta charset="utf-8" />\r
-<meta http-equiv="content-type" content="text/html; charset=UTF-8" />\r
-<meta name="description" content="{META_DESCRIPTION}" />\r
-<meta name="keywords" content="{META_KEYWORDS}" />\r
+<meta charset="utf-8" />
+<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+<meta name="description" content="{META_DESCRIPTION}" />
+<meta name="keywords" content="{META_KEYWORDS}" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
\ No newline at end of file
-<a id="top" name="top"></a>\r
-<div id="page">\r
- <div id="header" class="border">\r
- {include file=headerMenu}\r
+<a id="top" name="top"></a>
+<div id="page">
+ <div id="header" class="border">
+ {include file=headerMenu}
</div>
\ No newline at end of file
-{if $__wcf->getPageMenu()->getMenuItems('header')|count > 0}\r
- <div id="mainMenu" class="mainMenu">\r
- <div class="mainMenuInner">\r
- <ul>\r
- {foreach from=$__wcf->getPageMenu()->getMenuItems('header') item=menuItem}\r
- <li><a href="{$menuItem->menuItemLink}">{$menuItem->menuItem} ({#$menuItem->getProvider()->getNotifications()})</a>\r
- \r
- {if $__wcf->getPageMenu()->getMenuItems($menuItem->menuItem)|count > 0}\r
- <ul>\r
- {foreach from=$__wcf->getPageMenu()->getMenuItems($menuItem->menuItem) item=subMenuItem}\r
- <li><a href="{$subMenuItem->menuItemLink}">{$subMenuItem->menuItem} ({#$subMenuItem->getProvider()->getNotifications()})</a></li>\r
- {/foreach}\r
- </ul>\r
- {/if}\r
- \r
- </li>\r
- {/foreach}\r
- </ul>\r
- </div>\r
- </div>\r
-{/if}\r
+{if $__wcf->getPageMenu()->getMenuItems('header')|count > 0}
+ <div id="mainMenu" class="mainMenu">
+ <div class="mainMenuInner">
+ <ul>
+ {foreach from=$__wcf->getPageMenu()->getMenuItems('header') item=menuItem}
+ <li><a href="{$menuItem->menuItemLink}">{$menuItem->menuItem} ({#$menuItem->getProvider()->getNotifications()})</a>
+
+ {if $__wcf->getPageMenu()->getMenuItems($menuItem->menuItem)|count > 0}
+ <ul>
+ {foreach from=$__wcf->getPageMenu()->getMenuItems($menuItem->menuItem) item=subMenuItem}
+ <li><a href="{$subMenuItem->menuItemLink}">{$subMenuItem->menuItem} ({#$subMenuItem->getProvider()->getNotifications()})</a></li>
+ {/foreach}
+ </ul>
+ {/if}
+
+ </li>
+ {/foreach}
+ </ul>
+ </div>
+ </div>
+{/if}
-<input {if $optionData.enableOptions}onclick="{@$optionData.enableOptions}" {/if}\r
-id="{$optionData.optionName}" type="checkbox" name="values[{$optionData.optionName}]" value="1"\r
+<input {if $optionData.enableOptions}onclick="{@$optionData.enableOptions}" {/if}
+id="{$optionData.optionName}" type="checkbox" name="values[{$optionData.optionName}]" value="1"
{if $optionData.optionValue}checked="checked" {/if}/>
\ No newline at end of file
-<div class="floatContainer">\r
- {foreach from=$dateInputOrder item=element}\r
- <div class="floatedElement">\r
- <label for="{$optionData.optionName}{$element|ucfirst}">{lang}wcf.global.date.{$element}{/lang}</label>\r
- \r
- {if $element == 'day'}\r
- <select id="{$optionData.optionName}Day" name="values[{$optionData.optionName}][day]">\r
- {htmlOptions options=$days selected=$day}\r
- </select>\r
- {/if}\r
- \r
- {if $element == 'month'}\r
- <select id="{$optionData.optionName}Month" name="values[{$optionData.optionName}][month]">\r
- {htmlOptions options=$months selected=$month}\r
- </select>\r
- {/if}\r
- \r
- {if $element == 'year'}\r
- <input id="{$optionData.optionName}Year" class="inputText fourDigitInput" type="text" name="values[{$optionData.optionName}][year]" value="{$year}" maxlength="4" />\r
- {/if}\r
- </div>\r
- {/foreach}\r
-</div>\r
-{if !$yearRequired}\r
- <p class="smallFont light">{lang}wcf.global.date.year.notRequired{/lang}</p>\r
+<div class="floatContainer">
+ {foreach from=$dateInputOrder item=element}
+ <div class="floatedElement">
+ <label for="{$optionData.optionName}{$element|ucfirst}">{lang}wcf.global.date.{$element}{/lang}</label>
+
+ {if $element == 'day'}
+ <select id="{$optionData.optionName}Day" name="values[{$optionData.optionName}][day]">
+ {htmlOptions options=$days selected=$day}
+ </select>
+ {/if}
+
+ {if $element == 'month'}
+ <select id="{$optionData.optionName}Month" name="values[{$optionData.optionName}][month]">
+ {htmlOptions options=$months selected=$month}
+ </select>
+ {/if}
+
+ {if $element == 'year'}
+ <input id="{$optionData.optionName}Year" class="inputText fourDigitInput" type="text" name="values[{$optionData.optionName}][year]" value="{$year}" maxlength="4" />
+ {/if}
+ </div>
+ {/foreach}
+</div>
+{if !$yearRequired}
+ <p class="smallFont light">{lang}wcf.global.date.year.notRequired{/lang}</p>
{/if}
\ No newline at end of file
-<select name="values[{$optionData.optionName}][]" id="{$optionData.optionName}" multiple="multiple" size="{if $options|count > 10}10{else}{@$options|count}{/if}">\r
-{foreach from=$options item=option key=key}\r
- <option value="{$key}"{if $key|in_array:$optionData.optionValue} selected="selected"{/if}>{lang}{@$option}{/lang}</option>\r
-{/foreach}\r
+<select name="values[{$optionData.optionName}][]" id="{$optionData.optionName}" multiple="multiple" size="{if $options|count > 10}10{else}{@$options|count}{/if}">
+{foreach from=$options item=option key=key}
+ <option value="{$key}"{if $key|in_array:$optionData.optionValue} selected="selected"{/if}>{lang}{@$option}{/lang}</option>
+{/foreach}
</select>
\ No newline at end of file
-<ul class="formOptionsLong">\r
- {foreach from=$options item=option key=key}\r
- <li>\r
- <label><input {if $option.enableOptions}onclick="if (IS_SAFARI) {@$option.enableOptions}" onfocus="{@$option.enableOptions}" {/if}\r
- type="radio" name="values[{$optionData.optionName}]" value="{$key}"\r
- {if $optionData.optionValue == $key}checked="checked" {/if}/>\r
- {lang}{@$option.value}{/lang}</label>\r
- </li>\r
- {/foreach}\r
+<ul class="formOptionsLong">
+ {foreach from=$options item=option key=key}
+ <li>
+ <label><input {if $option.enableOptions}onclick="if (IS_SAFARI) {@$option.enableOptions}" onfocus="{@$option.enableOptions}" {/if}
+ type="radio" name="values[{$optionData.optionName}]" value="{$key}"
+ {if $optionData.optionValue == $key}checked="checked" {/if}/>
+ {lang}{@$option.value}{/lang}</label>
+ </li>
+ {/foreach}
</ul>
\ No newline at end of file
-<select name="values[{$optionData.optionName}]" id="{$optionData.optionName}">\r
-{foreach from=$options item=option key=key}\r
- <option value="{$key}"{if $optionData.optionValue == $key} selected="selected"{/if}>{lang}{@$option}{/lang}</option>\r
-{/foreach}\r
+<select name="values[{$optionData.optionName}]" id="{$optionData.optionName}">
+{foreach from=$options item=option key=key}
+ <option value="{$key}"{if $optionData.optionValue == $key} selected="selected"{/if}>{lang}{@$option}{/lang}</option>
+{/foreach}
</select>
\ No newline at end of file
-{include file="documentHeader"}\r
-<head>\r
- <title>{lang}wcf.global.error.permissionDenied.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>\r
- {include file='headInclude' sandbox=false}\r
-</head>\r
-<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>\r
-{include file='header' sandbox=false}\r
-\r
-<div id="main">\r
- \r
- <p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>\r
-\r
-</div>\r
-\r
-{include file='footer' sandbox=false}\r
-</body>\r
+{include file="documentHeader"}
+<head>
+ <title>{lang}wcf.global.error.permissionDenied.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>
+ {include file='headInclude' sandbox=false}
+</head>
+<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>
+{include file='header' sandbox=false}
+
+<div id="main">
+
+ <p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>
+
+</div>
+
+{include file='footer' sandbox=false}
+</body>
</html>
\ No newline at end of file
-{include file="documentHeader"}\r
-<head>\r
- <title>{lang}wcf.global.redirect.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>\r
- {include file='headInclude' sandbox=false}\r
- <meta http-equiv="refresh" content="{if $wait|isset}{@$wait}{else}10{/if};URL={$url}" />\r
-</head>\r
-<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>\r
-{include file='header' sandbox=false}\r
-\r
-<div id="main">\r
- \r
- <div class="success">\r
- <p>{@$message}</p>\r
- <p><a href="{$url}">{lang}wcf.global.redirect.url{/lang}</a></p>\r
- </div>\r
-\r
-</div>\r
-\r
-{include file='footer' sandbox=false}\r
-</body>\r
+{include file="documentHeader"}
+<head>
+ <title>{lang}wcf.global.redirect.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>
+ {include file='headInclude' sandbox=false}
+ <meta http-equiv="refresh" content="{if $wait|isset}{@$wait}{else}10{/if};URL={$url}" />
+</head>
+<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>
+{include file='header' sandbox=false}
+
+<div id="main">
+
+ <div class="success">
+ <p>{@$message}</p>
+ <p><a href="{$url}">{lang}wcf.global.redirect.url{/lang}</a></p>
+ </div>
+
+</div>
+
+{include file='footer' sandbox=false}
+</body>
</html>
\ No newline at end of file
-{include file="documentHeader"}\r
-<head>\r
- <title>{lang}wcf.global.error.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>\r
- {include file='headInclude' sandbox=false}\r
- <script type="text/javascript">\r
- //<![CDATA[\r
- if (document.referrer) {\r
- onloadEvents.push(function() { document.getElementById('errorMessage').innerHTML += "<br /><a href=\"" + document.referrer + "\">{lang}wcf.global.error.backward{/lang}</a>"; });\r
- }\r
- //]]>\r
- </script>\r
-</head>\r
-<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>\r
-{include file='header' sandbox=false}\r
-\r
-<div id="main">\r
- <p class="error" id="errorMessage">\r
- {@$message}\r
- </p>\r
-</div>\r
-\r
-<!-- \r
-{$name} thrown in {$file} ({@$line})\r
-Stracktrace:\r
-{$stacktrace}\r
--->\r
-\r
-{include file='footer' sandbox=false}\r
-</body>\r
+{include file="documentHeader"}
+<head>
+ <title>{lang}wcf.global.error.title{/lang} - {lang}{PAGE_TITLE}{/lang}</title>
+ {include file='headInclude' sandbox=false}
+ <script type="text/javascript">
+ //<![CDATA[
+ if (document.referrer) {
+ onloadEvents.push(function() { document.getElementById('errorMessage').innerHTML += "<br /><a href=\"" + document.referrer + "\">{lang}wcf.global.error.backward{/lang}</a>"; });
+ }
+ //]]>
+ </script>
+</head>
+<body{if $templateName|isset} id="tpl{$templateName|ucfirst}"{/if}>
+{include file='header' sandbox=false}
+
+<div id="main">
+ <p class="error" id="errorMessage">
+ {@$message}
+ </p>
+</div>
+
+<!--
+{$name} thrown in {$file} ({@$line})
+Stracktrace:
+{$stacktrace}
+-->
+
+{include file='footer' sandbox=false}
+</body>
</html>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>\r
-<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/useroptions.xsd">\r
- <import>\r
- <categories>\r
- <category name="hidden"></category>\r
- </categories>\r
- \r
- <options>\r
- <option name="inlineHelpStatus">\r
- <categoryname>hidden</categoryname>\r
- <optiontype>text</optiontype>\r
- <visible>4</visible>\r
- <editable>4</editable>\r
- <defaultvalue>all</defaultvalue>\r
- </option>\r
- </options>\r
- </import>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/useroptions.xsd">
+ <import>
+ <categories>
+ <category name="hidden"></category>
+ </categories>
+
+ <options>
+ <option name="inlineHelpStatus">
+ <categoryname>hidden</categoryname>
+ <optiontype>text</optiontype>
+ <visible>4</visible>
+ <editable>4</editable>
+ <defaultvalue>all</defaultvalue>
+ </option>
+ </options>
+ </import>
</data>
\ No newline at end of file
-<?php\r
-/**\r
- * This script tries to find the temp folder and unzip all setup files into.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-// define constants\r
-define('INSTALL_SCRIPT_DIR', dirname(__FILE__).'/');\r
-define('SETUP_FILE', INSTALL_SCRIPT_DIR . 'WCFSetup.tar.gz');\r
-define('NO_IMPORTS', 1);\r
-\r
-// set exception handler\r
-set_exception_handler('handleException');\r
-// set php error handler\r
-set_error_handler('handleError', E_ALL);\r
-\r
-// define list of needed file\r
-$neededFilesPattern = array(\r
- '!^setup/.*!',\r
- '!^install/files/lib/data/.*!',\r
- '!^install/files/lib/system/.*!',\r
- '!^install/files/lib/util/.*!',\r
- '!^install/files/acp/images/setup.*!',\r
- '!^install/lang/.*!',\r
- '!^install/packages/.*!');\r
- \r
-// define needed functions and classes\r
-/**\r
- * WCF::handleException() calls the show method on exceptions that implement this interface.\r
- *\r
- * @package com.woltlab.wcf.system.exception\r
- * @author Marcel Werk\r
- */\r
-interface IPrintableException {\r
- public function show();\r
-}\r
-\r
-// define needed classes\r
-// needed are:\r
-// SystemException, PrintableException, BasicFileUtil, Tar, File, ZipFile\r
-/**\r
- * A SystemException is thrown when an unexpected error occurs.\r
- *\r
- * @package com.woltlab.wcf.system.exception\r
- * @author Marcel Werk\r
- */\r
-class SystemException extends \Exception implements IPrintableException {\r
- protected $description;\r
- protected $information = '';\r
- protected $functions = '';\r
- \r
- /**\r
- * Creates a new SystemException.\r
- *\r
- * @param message string error message\r
- * @param code integer error code\r
- * @param description string description of the error\r
- */\r
- public function __construct($message = '', $code = 0, $description = '') {\r
- parent::__construct($message, $code);\r
- $this->description = $description;\r
- }\r
- \r
- /**\r
- * Returns the description of this exception.\r
- *\r
- * @return string\r
- */\r
- public function getDescription() {\r
- return $this->description;\r
- }\r
- \r
- /**\r
- * Prints this exception.\r
- * This method is called by WCF::handleException().\r
- */\r
- public function show() {\r
- ?>\r
-<html>\r
-<head>\r
-<title>Fatal error: <?php echo htmlspecialchars($this->getMessage()); ?></title>\r
-<style type="text/css">\r
-body {\r
- font-family: Verdana, Helvetica, sans-serif;\r
- font-size: 0.8em;\r
-}\r
-div {\r
- border: 1px outset lightgrey;\r
- padding: 3px;\r
- background-color: lightgrey;\r
-}\r
-\r
-div div {\r
- border: 1px inset lightgrey;\r
- padding: 4px;\r
-}\r
-\r
-h1 {\r
- background-color: #154268;\r
- padding: 4px;\r
- color: #fff;\r
- margin: 0 0 3px 0;\r
- font-size: 1.15em;\r
-}\r
-h2 {\r
- font-size: 1.1em;\r
- margin-bottom: 0;\r
-}\r
-\r
-pre, p {\r
- margin: 0;\r
-}\r
-</style>\r
-</head>\r
-<body>\r
- <div>\r
- <h1>Fatal error: <?php echo htmlspecialchars($this->getMessage()); ?></h1>\r
- \r
- <div>\r
- <p><?php echo $this->getDescription(); ?></p>\r
- <?php if ($this->getCode()) { ?><p>You get more information about the problem in our knowledge base: <a href="http://www.woltlab.com/help/?code=<?php echo intval($this->getCode()); ?>">http://www.woltlab.com/help/?code=<?php echo intval($this->getCode()); ?></a></p><?php } ?>\r
- \r
- <h2>Information:</h2>\r
- <p>\r
- <b>error message:</b> <?php echo htmlspecialchars($this->getMessage()); ?><br />\r
- <b>error code:</b> <?php echo intval($this->getCode()); ?><br />\r
- <?php echo $this->information; ?>\r
- <b>file:</b> <?php echo htmlspecialchars($this->getFile()); ?> (<?php echo $this->getLine(); ?>)<br />\r
- <b>php version:</b> <?php echo htmlspecialchars(phpversion()); ?><br />\r
- <b>wcf version:</b> <?php if (defined('WCF_VERSION')) echo WCF_VERSION; ?><br />\r
- <b>date:</b> <?php echo gmdate('r'); ?><br />\r
- <b>request:</b> <?php if (isset($_SERVER['REQUEST_URI'])) echo htmlspecialchars($_SERVER['REQUEST_URI']); ?><br />\r
- <b>referer:</b> <?php if (isset($_SERVER['HTTP_REFERER'])) echo htmlspecialchars($_SERVER['HTTP_REFERER']); ?><br />\r
- </p>\r
- \r
- <h2>Stacktrace:</h2>\r
- <pre><?php echo htmlspecialchars($this->getTraceAsString()); ?></pre>\r
- </div>\r
- \r
- <?php echo $this->functions; ?>\r
- </div>\r
-</body>\r
-</html>\r
-\r
-<?php\r
- }\r
-}\r
-\r
-\r
-/**\r
- * Loads the required classes automatically.\r
- */\r
-function __autoload($className) {\r
- $namespaces = explode('\\', $className);\r
- if (count($namespaces) > 1) {\r
- // remove 'wcf' component\r
- array_shift($namespaces);\r
- \r
- $className = implode('/', $namespaces);\r
- $classPath = TMP_DIR . 'install/files/lib/' . $className . '.class.php';\r
- if (file_exists($classPath)) {\r
- require_once($classPath);\r
- }\r
- }\r
-}\r
-\r
-/**\r
- * Escapes strings for execution in sql queries.\r
- */\r
-function escapeString($string) {\r
- return \wcf\system\WCF::getDB()->escapeString($string);\r
-}\r
-\r
-/**\r
- * Calls the show method on the given exception.\r
- *\r
- * @param Exception $e\r
- */\r
-function handleException(\Exception $e) {\r
- if ($e instanceof IPrintableException || $e instanceof \wcf\system\exception\IPrintableException) {\r
- $e->show();\r
- exit;\r
- }\r
- \r
- print $e;\r
-}\r
-\r
-/**\r
- * Catches php errors and throws instead a system exception.\r
- *\r
- * @param integer $errorNo\r
- * @param string $message\r
- * @param string $filename\r
- * @param integer $lineNo\r
- */\r
-function handleError($errorNo, $message, $filename, $lineNo) {\r
- if (error_reporting() != 0) {\r
- $type = 'error';\r
- switch ($errorNo) {\r
- case 2: $type = 'warning';\r
- break;\r
- case 8: $type = 'notice';\r
- break;\r
- }\r
- \r
- throw new SystemException('PHP '.$type.' in file '.$filename.' ('.$lineNo.'): '.$message, 0);\r
- }\r
-}\r
-\r
-/**\r
- * BasicFileUtil contains file-related functions.\r
- *\r
- * @package com.woltlab.wcf.util\r
- * @author Marcel Werk\r
- */\r
-class BasicFileUtil {\r
- /**\r
- * Tries to find the temp folder.\r
- *\r
- * @return string\r
- */\r
- public static function getTempFolder() {\r
- $tmpDirName = TMP_FILE_PREFIX.'/';\r
- \r
- // use tmp folder in document root by default\r
- if (!empty($_SERVER['DOCUMENT_ROOT'])) {\r
- if (!@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName)) {\r
- @mkdir($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName, 0777, true);\r
- @chmod($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName, 0777);\r
- }\r
- \r
- if (@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName) && @is_writable($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName)) {\r
- return $_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName;\r
- }\r
- }\r
- \r
- foreach (array('TMP', 'TEMP', 'TMPDIR') as $tmpDir) {\r
- if (isset($_ENV[$tmpDir]) && @is_writable($_ENV[$tmpDir])) {\r
- $dir = $_ENV[$tmpDir] . '/' . $tmpDirName;\r
- @mkdir($dir, 0777);\r
- @chmod($dir, 0777);\r
- \r
- if (@file_exists($dir) && @is_writable($dir)) {\r
- return $dir;\r
- }\r
- }\r
- }\r
- \r
- $dir = INSTALL_SCRIPT_DIR . 'tmp/' . $tmpDirName;\r
- @mkdir($dir, 0777);\r
- @chmod($dir, 0777);\r
- \r
- if (!@file_exists($dir) || !@is_writable($dir)) {\r
- $tmpDir = explode('/', $dir);\r
- array_pop($tmpDir);\r
- $dir = implode('/', $tmpDir);\r
- \r
- throw new SystemException('There is no access to the system temporary folder due to an unknown reason and no user specific temporary folder exists in '.INSTALL_SCRIPT_DIR.'! This is a misconfiguration of your webserver software! Please create a folder called '.$dir.' using your favorite ftp program, make it writable and then retry this installation.', 10000);\r
- }\r
- \r
- return $dir;\r
- }\r
-}\r
-\r
-/**\r
- * Opens tar or tar.gz archives.\r
- *\r
- * Usage:\r
- * ------\r
- * $tar = new Tar('archive.tar');\r
- * $contentList = $tar->getContentList();\r
- * foreach ($contentList as $key => $val) {\r
- * $tar->extract($key, DESTINATION);\r
- * }\r
- */\r
-class Tar {\r
- protected $archiveName = '';\r
- protected $contentList = array();\r
- protected $opened = false;\r
- protected $read = false;\r
- protected $file = null;\r
- protected $isZipped = false;\r
- protected $mode = 'rb';\r
- \r
- /**\r
- * Creates a new Tar object.\r
- * archiveName must be tarball or gzipped tarball\r
- *\r
- * @param string $archiveName\r
- */\r
- public function __construct($archiveName) {\r
- $match = array();\r
- if (!is_file($archiveName)) {\r
- throw new SystemException("unable to find tar archive '".$archiveName."'", 11002);\r
- }\r
- \r
- $this->archiveName = $archiveName;\r
- $this->open();\r
- $this->readContent();\r
- }\r
- \r
- /**\r
- * Destructor of this class, closes tar archive.\r
- */\r
- public function __destruct() {\r
- $this->close();\r
- }\r
- \r
- /**\r
- * Opens the tar archive and stores filehandle.\r
- */\r
- public function open() {\r
- if (!$this->opened) {\r
- if ($this->isZipped) $this->file = new ZipFile($this->archiveName, $this->mode);\r
- else {\r
- // test compression\r
- $this->file = new File($this->archiveName, $this->mode);\r
- if ($this->file->read(2) == "\37\213") {\r
- $this->file->close();\r
- $this->isZipped = true;\r
- $this->file = new ZipFile($this->archiveName, $this->mode);\r
- }\r
- else {\r
- $this->file->seek(0);\r
- }\r
- }\r
- $this->opened = true;\r
- }\r
- }\r
-\r
- /**\r
- * Closes the opened file.\r
- */\r
- public function close() {\r
- if ($this->opened) {\r
- $this->file->close();\r
- $this->opened = false;\r
- }\r
- }\r
- \r
- /**\r
- * Returns the table of contents (TOC) list for this tar archive.\r
- *\r
- * @return array list of content\r
- */\r
- public function getContentList() {\r
- if (!$this->read) {\r
- $this->open();\r
- $this->readContent();\r
- }\r
- return $this->contentList;\r
- }\r
- \r
- /**\r
- * Returns an associative array with information\r
- * about a specific file in the archive.\r
- *\r
- * @param mixed $fileindex index or name of the requested file\r
- * @return array $fileInfo\r
- */\r
- public function getFileInfo($fileIndex) {\r
- if (!is_int($fileIndex)) {\r
- $fileIndex = $this->getIndexByFilename($fileIndex);\r
- }\r
- \r
- if (!isset($this->contentList[$fileIndex])) {\r
- throw new SystemException("Tar: could find file '$index' in archive", 11013);\r
- }\r
- return $this->contentList[$fileIndex];\r
- }\r
- \r
- /**\r
- * Searchs a file in the tar archive\r
- * and returns the numeric fileindex.\r
- * Returns false if not found.\r
- *\r
- * @param string $filename\r
- * @return integer index of the requested file\r
- */\r
- public function getIndexByFilename($filename) {\r
- foreach ($this->contentList as $index => $file) {\r
- if ($file['filename'] == $filename) {\r
- return $index;\r
- }\r
- }\r
- return false;\r
- }\r
- \r
- /**\r
- * Extracts a specific file and returns the content as string.\r
- * Returns false if extraction failed.\r
- *\r
- * @param mixed $index index or name of the requested file\r
- * @return string content of the requested file\r
- */\r
- public function extractToString($index) {\r
- if (!$this->read) {\r
- $this->open();\r
- $this->readContent();\r
- }\r
- $header = $this->getFileInfo($index);\r
- \r
- // can not extract a folder\r
- if ($header['type'] != 'file') {\r
- return false;\r
- }\r
- \r
- // seek to offset\r
- $this->file->seek($header['offset']);\r
- \r
- // read data\r
- $content = '';\r
- $n = floor($header['size'] / 512);\r
- for($i = 0; $i < $n; $i++) {\r
- $content .= $this->file->read(512);\r
- }\r
- if(($header['size'] % 512) != 0) {\r
- $buffer = $this->file->read(512);\r
- $content .= substr($buffer, 0, ($header['size'] % 512));\r
- }\r
- \r
- return $content;\r
- }\r
- \r
- /**\r
- * Extracts a specific file and writes it's content\r
- * to the file specified with $destination.\r
- *\r
- * @param mixed $index index or name of the requested file\r
- * @param string $destination\r
- * @return boolean $success\r
- */\r
- public function extract($index, $destination) {\r
- if (!$this->read) {\r
- $this->open();\r
- $this->readContent();\r
- }\r
- $header = $this->getFileInfo($index);\r
- \r
- // can not extract a folder\r
- if ($header['type'] != 'file') {\r
- return false;\r
- }\r
- \r
- // seek to offset\r
- $this->file->seek($header['offset']);\r
- \r
- $targetFile = new File($destination);\r
- \r
- // read data\r
- $n = floor($header['size'] / 512);\r
- for ($i = 0; $i < $n; $i++) {\r
- $content = $this->file->read(512);\r
- $targetFile->write($content, 512);\r
- }\r
- if (($header['size'] % 512) != 0) {\r
- $content = $this->file->read(512);\r
- $targetFile->write($content, ($header['size'] % 512));\r
- }\r
- \r
- $targetFile->close();\r
- if (function_exists('apache_get_version') || !@$targetFile->is_writable()) {\r
- @$targetFile->chmod(0777);\r
- }\r
- else {\r
- @$targetFile->chmod(0755);\r
- }\r
- \r
- if ($header['mtime']) {\r
- @$targetFile->touch($header['mtime']);\r
- }\r
- \r
- // check filesize\r
- if (filesize($destination) != $header['size']) {\r
- throw new SystemException("Could not untar file '".$header['filename']."' to '".$destination."'. Maybe disk quota exceeded in folder '".dirname($destination)."'.", 11015);\r
- }\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * Reads table of contents (TOC) from tar archive.\r
- * This does not get the entire to memory but only parts of it.\r
- */\r
- protected function readContent() {\r
- $this->contentList = array();\r
- $this->read = true;\r
- $i = 0;\r
- \r
- // Read the 512 bytes header\r
- while (strlen($binaryData = $this->file->read(512)) != 0) {\r
- // read header\r
- $header = $this->readHeader($binaryData);\r
- if ($header === false) {\r
- continue;\r
- }\r
- $this->contentList[$i] = $header;\r
- $this->contentList[$i]['index'] = $i;\r
- $i++;\r
- \r
- $this->file->seek($this->file->tell() + (512 * ceil(($header['size'] / 512))));\r
- }\r
- }\r
- \r
- /**\r
- * Unpacks file header for one file entry.\r
- *\r
- * @param string $binaryData\r
- * @return array $fileheader\r
- */\r
- protected function readHeader($binaryData) {\r
- if (strlen($binaryData) != 512) {\r
- return false;\r
- }\r
-\r
- $header = array();\r
- $checksum = 0;\r
- // First part of the header\r
- for ($i = 0; $i < 148; $i++) {\r
- $checksum += ord(substr($binaryData, $i, 1));\r
- }\r
- // Calculate the checksum\r
- // Ignore the checksum value and replace it by ' ' (space)\r
- for ($i = 148; $i < 156; $i++) {\r
- $checksum += ord(' ');\r
- }\r
- // Last part of the header\r
- for ($i = 156; $i < 512; $i++) {\r
- $checksum += ord(substr($binaryData, $i, 1));\r
- }\r
-\r
- // Extract the values\r
- //$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $binaryData);\r
- $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $binaryData);\r
- \r
- // Extract the properties\r
- $header['checksum'] = octDec(trim($data['checksum']));\r
- if ($header['checksum'] == $checksum) {\r
- $header['filename'] = trim($data['filename']);\r
- $header['mode'] = octDec(trim($data['mode']));\r
- $header['uid'] = octDec(trim($data['uid']));\r
- $header['gid'] = octDec(trim($data['gid']));\r
- $header['size'] = octDec(trim($data['size']));\r
- $header['mtime'] = octDec(trim($data['mtime']));\r
- $header['prefix'] = trim($data['prefix']);\r
- if ($header['prefix']) {\r
- $header['filename'] = $header['prefix'].'/'.$header['filename'];\r
- }\r
- if (($header['typeflag'] = $data['typeflag']) == '5') {\r
- $header['size'] = 0;\r
- $header['type'] = 'folder';\r
- }\r
- else {\r
- $header['type'] = 'file';\r
- }\r
- $header['offset'] = $this->file->tell();\r
- \r
- return $header;\r
- }\r
- else {\r
- return false;\r
- }\r
- }\r
-}\r
-\r
-/**\r
- * The File class handles all file operations.\r
- *\r
- * Example:\r
- * using php functions:\r
- * $fp = fopen('filename', 'wb');\r
- * fwrite($fp, '...');\r
- * fclose($fp);\r
- *\r
- * using this class:\r
- * $file = new File('filename');\r
- * $file->write('...');\r
- * $file->close();\r
- *\r
- * @author Marcel Werk\r
- */\r
-class File {\r
- protected $resource = null;\r
- protected $filename;\r
- \r
- /**\r
- * Opens a new file.\r
- *\r
- * @param string $filename\r
- * @param string $mode\r
- */\r
- public function __construct($filename, $mode = 'wb') {\r
- $this->filename = $filename;\r
- $this->resource = fopen($filename, $mode);\r
- if ($this->resource === false) {\r
- throw new SystemException('Can not open file ' . $filename, 11012);\r
- }\r
- }\r
- \r
- /**\r
- * Calls the specified function on the open file.\r
- * Do not call this function directly. Use $file->write('') instead.\r
- *\r
- * @param string $function\r
- * @param array $arguments\r
- */\r
- public function __call($function, $arguments) {\r
- if (function_exists('f' . $function)) {\r
- array_unshift($arguments, $this->resource);\r
- return call_user_func_array('f' . $function, $arguments);\r
- }\r
- else if (function_exists($function)) {\r
- array_unshift($arguments, $this->filename);\r
- return call_user_func_array($function, $arguments);\r
- }\r
- else {\r
- throw new SystemException('Can not call file method ' . $function, 11003);\r
- }\r
- }\r
-}\r
-\r
-/**\r
- * The File class handles all file operations on a zipped file.\r
- *\r
- * @author Marcel Werk\r
- */\r
-class ZipFile extends File {\r
- /**\r
- * Opens a new zipped file.\r
- *\r
- * @param string $filename\r
- * @param string $mode\r
- */\r
- public function __construct($filename, $mode = 'wb') {\r
- $this->filename = $filename;\r
- if (!function_exists('gzopen')) {\r
- throw new SystemException('Can not find functions of the zlib extension', 11004);\r
- }\r
- $this->resource = @gzopen($filename, $mode);\r
- if ($this->resource === false) {\r
- throw new SystemException('Can not open file ' . $filename, 11012);\r
- }\r
- }\r
- \r
- /**\r
- * Calls the specified function on the open file.\r
- *\r
- * @param string $function\r
- * @param array $arguments\r
- */\r
- public function __call($function, $arguments) {\r
- if (function_exists('gz' . $function)) {\r
- array_unshift($arguments, $this->resource);\r
- return call_user_func_array('gz' . $function, $arguments);\r
- }\r
- else if (function_exists($function)) {\r
- array_unshift($arguments, $this->filename);\r
- return call_user_func_array($function, $arguments);\r
- }\r
- else {\r
- throw new SystemException('Can not call method ' . $function, 11003);\r
- }\r
- }\r
- \r
- /**\r
- * Returns the filesize of the unzipped file\r
- */\r
- public function getFileSize() {\r
- $byteBlock = 1<<14;\r
- $eof = $byteBlock;\r
- \r
- // the correction is for zip files that are too small\r
- // to get in the first while loop\r
- $correction = 1;\r
- while ($this->seek($eof) == 0) {\r
- $eof += $byteBlock;\r
- $correction = 0;\r
- }\r
- \r
- while ($byteBlock > 1) {\r
- $byteBlock >>= 1;\r
- $eof += $byteBlock * ($this->seek($eof) ? -1 : 1);\r
- }\r
- \r
- if ($this->seek($eof) == -1) $eof -= 1;\r
- \r
- $this->rewind();\r
- return $eof - $correction;\r
- }\r
-}\r
-\r
-// let's go\r
-// get temp file prefix\r
-if (isset($_REQUEST['tmpFilePrefix'])) {\r
- $prefix = preg_replace('/[^a-f0-9_]+/', '', $_REQUEST['tmpFilePrefix']);\r
-}\r
-else {\r
- $prefix = substr(sha1(uniqid(microtime())), 0, 8);\r
-}\r
-define('TMP_FILE_PREFIX', $prefix);\r
-\r
-// try to find the temp folder\r
-define('TMP_DIR', BasicFileUtil::getTempFolder());\r
-\r
-// show image from temp folder\r
-if (isset($_GET['showImage'])) {\r
- if (preg_match('~[\w\-]+\.(jpg|png)~', $_GET['showImage'], $match)) {\r
- if ($match[1] == 'jpg') header('Content-Type: image/jpg');\r
- else header('Content-Type: image/png');\r
- readfile(TMP_DIR . 'install/files/acp/images/' . $_GET['showImage']);\r
- }\r
- exit;\r
-}\r
-\r
-// check whether setup files already unzipped\r
-if (!file_exists(TMP_DIR . 'install/files/lib/system/WCFSetup.class.php')) {\r
- // try to unzip all setup files into temp folder\r
- $tar = new Tar(SETUP_FILE);\r
- $contentList = $tar->getContentList();\r
- if (!count($contentList)) {\r
- throw new SystemException("Can not unpack 'WCFSetup.tar.gz'. File is probably broken.", 11016);\r
- }\r
- \r
- foreach ($contentList as $file) {\r
- foreach ($neededFilesPattern as $pattern) {\r
- if (preg_match($pattern, $file['filename'])) {\r
- // create directory if not exists\r
- $dir = TMP_DIR . dirname($file['filename']);\r
- if (!@is_dir($dir)) {\r
- @mkdir($dir, 0777, true);\r
- @chmod($dir, 0777);\r
- }\r
- \r
- $tar->extract($file['index'], TMP_DIR . $file['filename']);\r
- }\r
- }\r
- }\r
- $tar->close();\r
- \r
- // create cache folders\r
- @mkdir(TMP_DIR . 'setup/lang/cache/', 0777);\r
- @chmod(TMP_DIR . 'setup/lang/cache/', 0777);\r
- \r
- @mkdir(TMP_DIR . 'setup/template/compiled/', 0777);\r
- @chmod(TMP_DIR . 'setup/template/compiled/', 0777);\r
-}\r
-\r
-if (!class_exists('wcf\system\WCFSetup')) {\r
- throw new SystemException("Can not find class 'WCFSetup'", 11006);\r
-}\r
-\r
-// start setup\r
+<?php
+/**
+ * This script tries to find the temp folder and unzip all setup files into.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+// define constants
+define('INSTALL_SCRIPT_DIR', dirname(__FILE__).'/');
+define('SETUP_FILE', INSTALL_SCRIPT_DIR . 'WCFSetup.tar.gz');
+define('NO_IMPORTS', 1);
+
+// set exception handler
+set_exception_handler('handleException');
+// set php error handler
+set_error_handler('handleError', E_ALL);
+
+// define list of needed file
+$neededFilesPattern = array(
+ '!^setup/.*!',
+ '!^install/files/lib/data/.*!',
+ '!^install/files/lib/system/.*!',
+ '!^install/files/lib/util/.*!',
+ '!^install/files/acp/images/setup.*!',
+ '!^install/lang/.*!',
+ '!^install/packages/.*!');
+
+// define needed functions and classes
+/**
+ * WCF::handleException() calls the show method on exceptions that implement this interface.
+ *
+ * @package com.woltlab.wcf.system.exception
+ * @author Marcel Werk
+ */
+interface IPrintableException {
+ public function show();
+}
+
+// define needed classes
+// needed are:
+// SystemException, PrintableException, BasicFileUtil, Tar, File, ZipFile
+/**
+ * A SystemException is thrown when an unexpected error occurs.
+ *
+ * @package com.woltlab.wcf.system.exception
+ * @author Marcel Werk
+ */
+class SystemException extends \Exception implements IPrintableException {
+ protected $description;
+ protected $information = '';
+ protected $functions = '';
+
+ /**
+ * Creates a new SystemException.
+ *
+ * @param message string error message
+ * @param code integer error code
+ * @param description string description of the error
+ */
+ public function __construct($message = '', $code = 0, $description = '') {
+ parent::__construct($message, $code);
+ $this->description = $description;
+ }
+
+ /**
+ * Returns the description of this exception.
+ *
+ * @return string
+ */
+ public function getDescription() {
+ return $this->description;
+ }
+
+ /**
+ * Prints this exception.
+ * This method is called by WCF::handleException().
+ */
+ public function show() {
+ ?>
+<html>
+<head>
+<title>Fatal error: <?php echo htmlspecialchars($this->getMessage()); ?></title>
+<style type="text/css">
+body {
+ font-family: Verdana, Helvetica, sans-serif;
+ font-size: 0.8em;
+}
+div {
+ border: 1px outset lightgrey;
+ padding: 3px;
+ background-color: lightgrey;
+}
+
+div div {
+ border: 1px inset lightgrey;
+ padding: 4px;
+}
+
+h1 {
+ background-color: #154268;
+ padding: 4px;
+ color: #fff;
+ margin: 0 0 3px 0;
+ font-size: 1.15em;
+}
+h2 {
+ font-size: 1.1em;
+ margin-bottom: 0;
+}
+
+pre, p {
+ margin: 0;
+}
+</style>
+</head>
+<body>
+ <div>
+ <h1>Fatal error: <?php echo htmlspecialchars($this->getMessage()); ?></h1>
+
+ <div>
+ <p><?php echo $this->getDescription(); ?></p>
+ <?php if ($this->getCode()) { ?><p>You get more information about the problem in our knowledge base: <a href="http://www.woltlab.com/help/?code=<?php echo intval($this->getCode()); ?>">http://www.woltlab.com/help/?code=<?php echo intval($this->getCode()); ?></a></p><?php } ?>
+
+ <h2>Information:</h2>
+ <p>
+ <b>error message:</b> <?php echo htmlspecialchars($this->getMessage()); ?><br />
+ <b>error code:</b> <?php echo intval($this->getCode()); ?><br />
+ <?php echo $this->information; ?>
+ <b>file:</b> <?php echo htmlspecialchars($this->getFile()); ?> (<?php echo $this->getLine(); ?>)<br />
+ <b>php version:</b> <?php echo htmlspecialchars(phpversion()); ?><br />
+ <b>wcf version:</b> <?php if (defined('WCF_VERSION')) echo WCF_VERSION; ?><br />
+ <b>date:</b> <?php echo gmdate('r'); ?><br />
+ <b>request:</b> <?php if (isset($_SERVER['REQUEST_URI'])) echo htmlspecialchars($_SERVER['REQUEST_URI']); ?><br />
+ <b>referer:</b> <?php if (isset($_SERVER['HTTP_REFERER'])) echo htmlspecialchars($_SERVER['HTTP_REFERER']); ?><br />
+ </p>
+
+ <h2>Stacktrace:</h2>
+ <pre><?php echo htmlspecialchars($this->getTraceAsString()); ?></pre>
+ </div>
+
+ <?php echo $this->functions; ?>
+ </div>
+</body>
+</html>
+
+<?php
+ }
+}
+
+
+/**
+ * Loads the required classes automatically.
+ */
+function __autoload($className) {
+ $namespaces = explode('\\', $className);
+ if (count($namespaces) > 1) {
+ // remove 'wcf' component
+ array_shift($namespaces);
+
+ $className = implode('/', $namespaces);
+ $classPath = TMP_DIR . 'install/files/lib/' . $className . '.class.php';
+ if (file_exists($classPath)) {
+ require_once($classPath);
+ }
+ }
+}
+
+/**
+ * Escapes strings for execution in sql queries.
+ */
+function escapeString($string) {
+ return \wcf\system\WCF::getDB()->escapeString($string);
+}
+
+/**
+ * Calls the show method on the given exception.
+ *
+ * @param Exception $e
+ */
+function handleException(\Exception $e) {
+ if ($e instanceof IPrintableException || $e instanceof \wcf\system\exception\IPrintableException) {
+ $e->show();
+ exit;
+ }
+
+ print $e;
+}
+
+/**
+ * Catches php errors and throws instead a system exception.
+ *
+ * @param integer $errorNo
+ * @param string $message
+ * @param string $filename
+ * @param integer $lineNo
+ */
+function handleError($errorNo, $message, $filename, $lineNo) {
+ if (error_reporting() != 0) {
+ $type = 'error';
+ switch ($errorNo) {
+ case 2: $type = 'warning';
+ break;
+ case 8: $type = 'notice';
+ break;
+ }
+
+ throw new SystemException('PHP '.$type.' in file '.$filename.' ('.$lineNo.'): '.$message, 0);
+ }
+}
+
+/**
+ * BasicFileUtil contains file-related functions.
+ *
+ * @package com.woltlab.wcf.util
+ * @author Marcel Werk
+ */
+class BasicFileUtil {
+ /**
+ * Tries to find the temp folder.
+ *
+ * @return string
+ */
+ public static function getTempFolder() {
+ $tmpDirName = TMP_FILE_PREFIX.'/';
+
+ // use tmp folder in document root by default
+ if (!empty($_SERVER['DOCUMENT_ROOT'])) {
+ if (!@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName)) {
+ @mkdir($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName, 0777, true);
+ @chmod($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName, 0777);
+ }
+
+ if (@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName) && @is_writable($_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName)) {
+ return $_SERVER['DOCUMENT_ROOT'].'/tmp/'.$tmpDirName;
+ }
+ }
+
+ foreach (array('TMP', 'TEMP', 'TMPDIR') as $tmpDir) {
+ if (isset($_ENV[$tmpDir]) && @is_writable($_ENV[$tmpDir])) {
+ $dir = $_ENV[$tmpDir] . '/' . $tmpDirName;
+ @mkdir($dir, 0777);
+ @chmod($dir, 0777);
+
+ if (@file_exists($dir) && @is_writable($dir)) {
+ return $dir;
+ }
+ }
+ }
+
+ $dir = INSTALL_SCRIPT_DIR . 'tmp/' . $tmpDirName;
+ @mkdir($dir, 0777);
+ @chmod($dir, 0777);
+
+ if (!@file_exists($dir) || !@is_writable($dir)) {
+ $tmpDir = explode('/', $dir);
+ array_pop($tmpDir);
+ $dir = implode('/', $tmpDir);
+
+ throw new SystemException('There is no access to the system temporary folder due to an unknown reason and no user specific temporary folder exists in '.INSTALL_SCRIPT_DIR.'! This is a misconfiguration of your webserver software! Please create a folder called '.$dir.' using your favorite ftp program, make it writable and then retry this installation.', 10000);
+ }
+
+ return $dir;
+ }
+}
+
+/**
+ * Opens tar or tar.gz archives.
+ *
+ * Usage:
+ * ------
+ * $tar = new Tar('archive.tar');
+ * $contentList = $tar->getContentList();
+ * foreach ($contentList as $key => $val) {
+ * $tar->extract($key, DESTINATION);
+ * }
+ */
+class Tar {
+ protected $archiveName = '';
+ protected $contentList = array();
+ protected $opened = false;
+ protected $read = false;
+ protected $file = null;
+ protected $isZipped = false;
+ protected $mode = 'rb';
+
+ /**
+ * Creates a new Tar object.
+ * archiveName must be tarball or gzipped tarball
+ *
+ * @param string $archiveName
+ */
+ public function __construct($archiveName) {
+ $match = array();
+ if (!is_file($archiveName)) {
+ throw new SystemException("unable to find tar archive '".$archiveName."'", 11002);
+ }
+
+ $this->archiveName = $archiveName;
+ $this->open();
+ $this->readContent();
+ }
+
+ /**
+ * Destructor of this class, closes tar archive.
+ */
+ public function __destruct() {
+ $this->close();
+ }
+
+ /**
+ * Opens the tar archive and stores filehandle.
+ */
+ public function open() {
+ if (!$this->opened) {
+ if ($this->isZipped) $this->file = new ZipFile($this->archiveName, $this->mode);
+ else {
+ // test compression
+ $this->file = new File($this->archiveName, $this->mode);
+ if ($this->file->read(2) == "\37\213") {
+ $this->file->close();
+ $this->isZipped = true;
+ $this->file = new ZipFile($this->archiveName, $this->mode);
+ }
+ else {
+ $this->file->seek(0);
+ }
+ }
+ $this->opened = true;
+ }
+ }
+
+ /**
+ * Closes the opened file.
+ */
+ public function close() {
+ if ($this->opened) {
+ $this->file->close();
+ $this->opened = false;
+ }
+ }
+
+ /**
+ * Returns the table of contents (TOC) list for this tar archive.
+ *
+ * @return array list of content
+ */
+ public function getContentList() {
+ if (!$this->read) {
+ $this->open();
+ $this->readContent();
+ }
+ return $this->contentList;
+ }
+
+ /**
+ * Returns an associative array with information
+ * about a specific file in the archive.
+ *
+ * @param mixed $fileindex index or name of the requested file
+ * @return array $fileInfo
+ */
+ public function getFileInfo($fileIndex) {
+ if (!is_int($fileIndex)) {
+ $fileIndex = $this->getIndexByFilename($fileIndex);
+ }
+
+ if (!isset($this->contentList[$fileIndex])) {
+ throw new SystemException("Tar: could find file '$index' in archive", 11013);
+ }
+ return $this->contentList[$fileIndex];
+ }
+
+ /**
+ * Searchs a file in the tar archive
+ * and returns the numeric fileindex.
+ * Returns false if not found.
+ *
+ * @param string $filename
+ * @return integer index of the requested file
+ */
+ public function getIndexByFilename($filename) {
+ foreach ($this->contentList as $index => $file) {
+ if ($file['filename'] == $filename) {
+ return $index;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Extracts a specific file and returns the content as string.
+ * Returns false if extraction failed.
+ *
+ * @param mixed $index index or name of the requested file
+ * @return string content of the requested file
+ */
+ public function extractToString($index) {
+ if (!$this->read) {
+ $this->open();
+ $this->readContent();
+ }
+ $header = $this->getFileInfo($index);
+
+ // can not extract a folder
+ if ($header['type'] != 'file') {
+ return false;
+ }
+
+ // seek to offset
+ $this->file->seek($header['offset']);
+
+ // read data
+ $content = '';
+ $n = floor($header['size'] / 512);
+ for($i = 0; $i < $n; $i++) {
+ $content .= $this->file->read(512);
+ }
+ if(($header['size'] % 512) != 0) {
+ $buffer = $this->file->read(512);
+ $content .= substr($buffer, 0, ($header['size'] % 512));
+ }
+
+ return $content;
+ }
+
+ /**
+ * Extracts a specific file and writes it's content
+ * to the file specified with $destination.
+ *
+ * @param mixed $index index or name of the requested file
+ * @param string $destination
+ * @return boolean $success
+ */
+ public function extract($index, $destination) {
+ if (!$this->read) {
+ $this->open();
+ $this->readContent();
+ }
+ $header = $this->getFileInfo($index);
+
+ // can not extract a folder
+ if ($header['type'] != 'file') {
+ return false;
+ }
+
+ // seek to offset
+ $this->file->seek($header['offset']);
+
+ $targetFile = new File($destination);
+
+ // read data
+ $n = floor($header['size'] / 512);
+ for ($i = 0; $i < $n; $i++) {
+ $content = $this->file->read(512);
+ $targetFile->write($content, 512);
+ }
+ if (($header['size'] % 512) != 0) {
+ $content = $this->file->read(512);
+ $targetFile->write($content, ($header['size'] % 512));
+ }
+
+ $targetFile->close();
+ if (function_exists('apache_get_version') || !@$targetFile->is_writable()) {
+ @$targetFile->chmod(0777);
+ }
+ else {
+ @$targetFile->chmod(0755);
+ }
+
+ if ($header['mtime']) {
+ @$targetFile->touch($header['mtime']);
+ }
+
+ // check filesize
+ if (filesize($destination) != $header['size']) {
+ throw new SystemException("Could not untar file '".$header['filename']."' to '".$destination."'. Maybe disk quota exceeded in folder '".dirname($destination)."'.", 11015);
+ }
+
+ return true;
+ }
+
+ /**
+ * Reads table of contents (TOC) from tar archive.
+ * This does not get the entire to memory but only parts of it.
+ */
+ protected function readContent() {
+ $this->contentList = array();
+ $this->read = true;
+ $i = 0;
+
+ // Read the 512 bytes header
+ while (strlen($binaryData = $this->file->read(512)) != 0) {
+ // read header
+ $header = $this->readHeader($binaryData);
+ if ($header === false) {
+ continue;
+ }
+ $this->contentList[$i] = $header;
+ $this->contentList[$i]['index'] = $i;
+ $i++;
+
+ $this->file->seek($this->file->tell() + (512 * ceil(($header['size'] / 512))));
+ }
+ }
+
+ /**
+ * Unpacks file header for one file entry.
+ *
+ * @param string $binaryData
+ * @return array $fileheader
+ */
+ protected function readHeader($binaryData) {
+ if (strlen($binaryData) != 512) {
+ return false;
+ }
+
+ $header = array();
+ $checksum = 0;
+ // First part of the header
+ for ($i = 0; $i < 148; $i++) {
+ $checksum += ord(substr($binaryData, $i, 1));
+ }
+ // Calculate the checksum
+ // Ignore the checksum value and replace it by ' ' (space)
+ for ($i = 148; $i < 156; $i++) {
+ $checksum += ord(' ');
+ }
+ // Last part of the header
+ for ($i = 156; $i < 512; $i++) {
+ $checksum += ord(substr($binaryData, $i, 1));
+ }
+
+ // Extract the values
+ //$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $binaryData);
+ $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $binaryData);
+
+ // Extract the properties
+ $header['checksum'] = octDec(trim($data['checksum']));
+ if ($header['checksum'] == $checksum) {
+ $header['filename'] = trim($data['filename']);
+ $header['mode'] = octDec(trim($data['mode']));
+ $header['uid'] = octDec(trim($data['uid']));
+ $header['gid'] = octDec(trim($data['gid']));
+ $header['size'] = octDec(trim($data['size']));
+ $header['mtime'] = octDec(trim($data['mtime']));
+ $header['prefix'] = trim($data['prefix']);
+ if ($header['prefix']) {
+ $header['filename'] = $header['prefix'].'/'.$header['filename'];
+ }
+ if (($header['typeflag'] = $data['typeflag']) == '5') {
+ $header['size'] = 0;
+ $header['type'] = 'folder';
+ }
+ else {
+ $header['type'] = 'file';
+ }
+ $header['offset'] = $this->file->tell();
+
+ return $header;
+ }
+ else {
+ return false;
+ }
+ }
+}
+
+/**
+ * The File class handles all file operations.
+ *
+ * Example:
+ * using php functions:
+ * $fp = fopen('filename', 'wb');
+ * fwrite($fp, '...');
+ * fclose($fp);
+ *
+ * using this class:
+ * $file = new File('filename');
+ * $file->write('...');
+ * $file->close();
+ *
+ * @author Marcel Werk
+ */
+class File {
+ protected $resource = null;
+ protected $filename;
+
+ /**
+ * Opens a new file.
+ *
+ * @param string $filename
+ * @param string $mode
+ */
+ public function __construct($filename, $mode = 'wb') {
+ $this->filename = $filename;
+ $this->resource = fopen($filename, $mode);
+ if ($this->resource === false) {
+ throw new SystemException('Can not open file ' . $filename, 11012);
+ }
+ }
+
+ /**
+ * Calls the specified function on the open file.
+ * Do not call this function directly. Use $file->write('') instead.
+ *
+ * @param string $function
+ * @param array $arguments
+ */
+ public function __call($function, $arguments) {
+ if (function_exists('f' . $function)) {
+ array_unshift($arguments, $this->resource);
+ return call_user_func_array('f' . $function, $arguments);
+ }
+ else if (function_exists($function)) {
+ array_unshift($arguments, $this->filename);
+ return call_user_func_array($function, $arguments);
+ }
+ else {
+ throw new SystemException('Can not call file method ' . $function, 11003);
+ }
+ }
+}
+
+/**
+ * The File class handles all file operations on a zipped file.
+ *
+ * @author Marcel Werk
+ */
+class ZipFile extends File {
+ /**
+ * Opens a new zipped file.
+ *
+ * @param string $filename
+ * @param string $mode
+ */
+ public function __construct($filename, $mode = 'wb') {
+ $this->filename = $filename;
+ if (!function_exists('gzopen')) {
+ throw new SystemException('Can not find functions of the zlib extension', 11004);
+ }
+ $this->resource = @gzopen($filename, $mode);
+ if ($this->resource === false) {
+ throw new SystemException('Can not open file ' . $filename, 11012);
+ }
+ }
+
+ /**
+ * Calls the specified function on the open file.
+ *
+ * @param string $function
+ * @param array $arguments
+ */
+ public function __call($function, $arguments) {
+ if (function_exists('gz' . $function)) {
+ array_unshift($arguments, $this->resource);
+ return call_user_func_array('gz' . $function, $arguments);
+ }
+ else if (function_exists($function)) {
+ array_unshift($arguments, $this->filename);
+ return call_user_func_array($function, $arguments);
+ }
+ else {
+ throw new SystemException('Can not call method ' . $function, 11003);
+ }
+ }
+
+ /**
+ * Returns the filesize of the unzipped file
+ */
+ public function getFileSize() {
+ $byteBlock = 1<<14;
+ $eof = $byteBlock;
+
+ // the correction is for zip files that are too small
+ // to get in the first while loop
+ $correction = 1;
+ while ($this->seek($eof) == 0) {
+ $eof += $byteBlock;
+ $correction = 0;
+ }
+
+ while ($byteBlock > 1) {
+ $byteBlock >>= 1;
+ $eof += $byteBlock * ($this->seek($eof) ? -1 : 1);
+ }
+
+ if ($this->seek($eof) == -1) $eof -= 1;
+
+ $this->rewind();
+ return $eof - $correction;
+ }
+}
+
+// let's go
+// get temp file prefix
+if (isset($_REQUEST['tmpFilePrefix'])) {
+ $prefix = preg_replace('/[^a-f0-9_]+/', '', $_REQUEST['tmpFilePrefix']);
+}
+else {
+ $prefix = substr(sha1(uniqid(microtime())), 0, 8);
+}
+define('TMP_FILE_PREFIX', $prefix);
+
+// try to find the temp folder
+define('TMP_DIR', BasicFileUtil::getTempFolder());
+
+// show image from temp folder
+if (isset($_GET['showImage'])) {
+ if (preg_match('~[\w\-]+\.(jpg|png)~', $_GET['showImage'], $match)) {
+ if ($match[1] == 'jpg') header('Content-Type: image/jpg');
+ else header('Content-Type: image/png');
+ readfile(TMP_DIR . 'install/files/acp/images/' . $_GET['showImage']);
+ }
+ exit;
+}
+
+// check whether setup files already unzipped
+if (!file_exists(TMP_DIR . 'install/files/lib/system/WCFSetup.class.php')) {
+ // try to unzip all setup files into temp folder
+ $tar = new Tar(SETUP_FILE);
+ $contentList = $tar->getContentList();
+ if (!count($contentList)) {
+ throw new SystemException("Can not unpack 'WCFSetup.tar.gz'. File is probably broken.", 11016);
+ }
+
+ foreach ($contentList as $file) {
+ foreach ($neededFilesPattern as $pattern) {
+ if (preg_match($pattern, $file['filename'])) {
+ // create directory if not exists
+ $dir = TMP_DIR . dirname($file['filename']);
+ if (!@is_dir($dir)) {
+ @mkdir($dir, 0777, true);
+ @chmod($dir, 0777);
+ }
+
+ $tar->extract($file['index'], TMP_DIR . $file['filename']);
+ }
+ }
+ }
+ $tar->close();
+
+ // create cache folders
+ @mkdir(TMP_DIR . 'setup/lang/cache/', 0777);
+ @chmod(TMP_DIR . 'setup/lang/cache/', 0777);
+
+ @mkdir(TMP_DIR . 'setup/template/compiled/', 0777);
+ @chmod(TMP_DIR . 'setup/template/compiled/', 0777);
+}
+
+if (!class_exists('wcf\system\WCFSetup')) {
+ throw new SystemException("Can not find class 'WCFSetup'", 11006);
+}
+
+// start setup
new \wcf\system\WCFSetup();
-<?php\r
-/**\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @category Community Framework\r
- */\r
-// get url\r
-$url = '';\r
-if (isset($_GET['url'])) $url = htmlspecialchars(str_replace(';', '', trim($_GET['url'])));\r
-if (empty($url)) exit;\r
-// check url\r
-$testURL = preg_replace('/[^a-z0-9:\/]+/', '', strtolower($url));\r
-if (strpos($testURL, 'script:') !== false || !preg_match('/^https?:\/\//', $testURL)) {\r
- exit;\r
-}\r
-echo '<?xml version="1.0" encoding="UTF-8"?>';\r
-?>\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="de"><head>\r
- <title>Dereferer</title>\r
- <meta http-equiv="refresh" content="0;URL=<?php echo $url; ?>" />\r
-</head>\r
-<body>\r
- <p><a href="<?php echo $url; ?>"><?php echo $url; ?></a></p>\r
-</body>\r
+<?php
+/**
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @category Community Framework
+ */
+// get url
+$url = '';
+if (isset($_GET['url'])) $url = htmlspecialchars(str_replace(';', '', trim($_GET['url'])));
+if (empty($url)) exit;
+// check url
+$testURL = preg_replace('/[^a-z0-9:\/]+/', '', strtolower($url));
+if (strpos($testURL, 'script:') !== false || !preg_match('/^https?:\/\//', $testURL)) {
+ exit;
+}
+echo '<?xml version="1.0" encoding="UTF-8"?>';
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="de"><head>
+ <title>Dereferer</title>
+ <meta http-equiv="refresh" content="0;URL=<?php echo $url; ?>" />
+</head>
+<body>
+ <p><a href="<?php echo $url; ?>"><?php echo $url; ?></a></p>
+</body>
</html>
\ No newline at end of file
-<?php\r
-/**\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @category Community Framework\r
- */\r
-// Constant to get relative path to the wcf-root-dir.\r
-// This constant is already set in each package which got an own config.inc.php \r
-if (!defined('RELATIVE_WCF_DIR')) define('RELATIVE_WCF_DIR', '../');\r
-\r
-// define the wcf-root-dir\r
-define('WCF_DIR', dirname(dirname(__FILE__)).'/');\r
-\r
-// starting wcf acp\r
-require_once(WCF_DIR.'lib/system/WCF.class.php');\r
-require_once(WCF_DIR.'lib/system/WCFACP.class.php');\r
+<?php
+/**
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @category Community Framework
+ */
+// Constant to get relative path to the wcf-root-dir.
+// This constant is already set in each package which got an own config.inc.php
+if (!defined('RELATIVE_WCF_DIR')) define('RELATIVE_WCF_DIR', '../');
+
+// define the wcf-root-dir
+define('WCF_DIR', dirname(dirname(__FILE__)).'/');
+
+// starting wcf acp
+require_once(WCF_DIR.'lib/system/WCF.class.php');
+require_once(WCF_DIR.'lib/system/WCFACP.class.php');
new wcf\system\WCFACP();
-<?xml version="1.0" encoding="utf-8"?>\r
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="83px" height="16px" viewBox="0 0 83 16" xml:space="preserve">\r
- <title>WoltLab Community Framework</title>\r
- <desc>WoltLab Community Framework Logo</desc>\r
- \r
- <defs>\r
- \r
- </defs>\r
- \r
- <g id="LogoWCF">\r
- <path id="Upper_2_" style="fill:#fff;" d="M21.7739258,6.6103516c0,0.0166016-0.0043945,0.0336914-0.012207,0.0498047\r
- l-0.6391602,1.3535156c-0.0385742,0.0786133-0.1000977,0.1201172-0.1831055,0.1201172\r
- c-0.0810547,0-0.1391602-0.0375977-0.1733398-0.1118164l-0.5107422-1.0942383l-0.5268555,1.097168\r
- c-0.0317383,0.0639648-0.0898438,0.0976562-0.171875,0.0976562c-0.0898438,0-0.1503906-0.0351562-0.1821289-0.1049805\r
- L18.7382812,6.659668c-0.0083008-0.0161133-0.0112305-0.03125-0.0112305-0.0454102\r
- c0-0.0351562,0.0175781-0.0634766,0.0537109-0.0839844c0.0307617-0.0166016,0.065918-0.0253906,0.1040039-0.0253906\r
- c0.0625,0,0.1054688,0.0209961,0.1269531,0.0649414l0.5449219,1.1606445l0.5175781-1.1152344\r
- c0.0371094-0.0786133,0.0961914-0.1201172,0.1782227-0.1201172c0.027832,0,0.0605469,0.012207,0.0961914,0.034668\r
- c0.0361328,0.0229492,0.0610352,0.0473633,0.0732422,0.0756836l0.5258789,1.125l0.5361328-1.1567383\r
- c0.0205078-0.0458984,0.0664062-0.0664062,0.1386719-0.0664062c0.0351562,0,0.0693359,0.0078125,0.0986328,0.0229492\r
- C21.7568359,6.5498047,21.7739258,6.5766602,21.7739258,6.6103516L21.7739258,6.6103516z M30.7270508,7.7226562\r
- c0,0.0849609-0.0458984,0.1386719-0.1396484,0.1611328c-0.0214844,0.003418-0.0507812,0.0078125-0.090332,0.0112305\r
- c-0.0390625,0.0014648-0.0893555,0.0039062-0.1508789,0.0039062h-0.3999023c-0.0424805,0-0.0854492-0.0024414-0.1279297-0.0073242\r
- c-0.0424805-0.0078125-0.0854492-0.0126953-0.128418-0.0224609c-0.1210938-0.0288086-0.1801758-0.0737305-0.1801758-0.1328125\r
- V7.1044922h0.8388672c0.2524414,0,0.378418,0.0551758,0.378418,0.1645508V7.7226562L30.7270508,7.7226562z M31.0083008,7.7314453\r
- V7.2641602c0-0.2636719-0.2216797-0.3955078-0.6640625-0.3955078h-0.8344727V6.6201172\r
- c0-0.0703125-0.0356445-0.1049805-0.1040039-0.1049805c-0.0698242,0-0.1103516,0.0029297-0.1210938,0.0078125\r
- c-0.0371094,0.0131836-0.0551758,0.0449219-0.0551758,0.0957031v1.1176758c0,0.1376953,0.0839844,0.2426758,0.253418,0.3134766\r
- c0.1303711,0.0551758,0.2749023,0.0839844,0.4321289,0.0839844h0.4291992C30.7866211,8.1337891,31.0083008,8,31.0083008,7.7314453\r
- L31.0083008,7.7314453z M28.7851562,7.684082c0,0.0947266-0.0268555,0.15625-0.0800781,0.1850586\r
- C28.6665039,7.887207,28.59375,7.8989258,28.4902344,7.8989258h-0.6948242c-0.0703125,0-0.1318359-0.0087891-0.1855469-0.0288086\r
- c-0.081543-0.0249023-0.1235352-0.0600586-0.1235352-0.1083984V7.6005859c0-0.0424805,0.0400391-0.0800781,0.1191406-0.1079102\r
- c0.0625-0.0209961,0.1230469-0.0332031,0.1821289-0.0332031h0.9931641L28.78125,7.5078125l0.0024414,0.0634766l0.0014648,0.0664062\r
- V7.684082L28.7851562,7.684082z M29.0600586,7.7490234V7.2495117c0-0.1728516-0.1010742-0.2866211-0.3051758-0.3452148\r
- c-0.1186523-0.0297852-0.2895508-0.0463867-0.5131836-0.0463867c-0.0693359,0-0.1040039,0.0341797-0.1040039,0.1030273\r
- c0,0.0878906,0.034668,0.1318359,0.1040039,0.1318359h0.0327148h0.0205078h0.0126953h0.0126953l0.0478516-0.0009766\r
- l0.0351562-0.0024414c0.2387695,0,0.3647461,0.0449219,0.3803711,0.137207H27.793457\r
- c-0.152832,0-0.2797852,0.0249023-0.3813477,0.0761719c-0.1376953,0.0678711-0.2070312,0.1655273-0.2070312,0.2988281v0.1625977\r
- c0,0.1230469,0.0732422,0.2197266,0.2172852,0.2871094c0.1064453,0.0546875,0.2333984,0.0825195,0.3798828,0.0825195h0.6855469\r
- C28.8691406,8.1337891,29.0600586,8.0048828,29.0600586,7.7490234L29.0600586,7.7490234z M27.0146484,8.0288086\r
- c0-0.0922852-0.0356445-0.137207-0.1044922-0.137207H25.980957c-0.1582031,0-0.2592773-0.0078125-0.3032227-0.0175781\r
- c-0.1347656-0.0263672-0.2041016-0.0825195-0.2041016-0.1679688V6.6162109c0-0.0517578-0.0219727-0.0834961-0.0625-0.0957031\r
- c-0.019043-0.0053711-0.0605469-0.0087891-0.1274414-0.0087891c-0.0693359,0-0.1040039,0.034668-0.1040039,0.1035156v1.0908203\r
- c0,0.1811523,0.0932617,0.3051758,0.2797852,0.3691406c0.121582,0.0390625,0.2895508,0.0585938,0.5058594,0.0585938h0.9448242\r
- C26.9790039,8.1337891,27.0146484,8.1000977,27.0146484,8.0288086L27.0146484,8.0288086z M25.0913086,6.9985352\r
- c0-0.0854492-0.0356445-0.1298828-0.1054688-0.1298828h-0.4438477V6.6166992c0-0.0488281-0.019043-0.0800781-0.0566406-0.09375\r
- c-0.012207-0.0068359-0.0517578-0.0112305-0.1201172-0.0112305S24.262207,6.5473633,24.262207,6.6162109v0.2524414\r
- c-0.0366211,0-0.0673828,0.0014648-0.090332,0.0019531c-0.0239258,0.0019531-0.0410156,0.0039062-0.0493164,0.0058594\r
- c-0.0458984,0.0136719-0.0668945,0.0512695-0.0668945,0.1098633s0.0209961,0.0952148,0.0668945,0.1103516\r
- c0.0083008,0.0014648,0.0253906,0.0043945,0.0493164,0.0053711c0.0229492,0.0024414,0.0537109,0.0024414,0.090332,0.0024414\r
- v0.921875c0,0.0498047,0.0180664,0.0830078,0.0571289,0.0961914c0.0117188,0.0073242,0.0507812,0.0112305,0.1196289,0.0112305\r
- c0.0693359,0,0.1030273-0.0336914,0.1030273-0.1049805V7.1044922h0.4438477\r
- C25.0556641,7.1044922,25.0913086,7.0683594,25.0913086,6.9985352L25.0913086,6.9985352z M23.9208984,8.0288086V6.6152344\r
- c0-0.0507812-0.0185547-0.0825195-0.0561523-0.0947266c-0.0161133-0.0053711-0.0561523-0.0087891-0.1206055-0.0087891\r
- c-0.0693359,0-0.1035156,0.034668-0.1035156,0.1035156v1.4111328c0,0.0498047,0.0185547,0.0830078,0.0576172,0.0961914\r
- C23.7080078,8.1298828,23.75,8.1337891,23.8168945,8.1337891C23.8857422,8.1337891,23.9208984,8.0976562,23.9208984,8.0288086\r
- L23.9208984,8.0288086z M23.1572266,7.7363281c0,0.0576172-0.0458984,0.1015625-0.1347656,0.1298828\r
- c-0.0664062,0.0209961-0.1357422,0.0327148-0.2094727,0.0327148h-0.4550781c-0.0869141,0-0.1621094-0.0087891-0.2275391-0.0288086\r
- c-0.0961914-0.0268555-0.1464844-0.0727539-0.1464844-0.1337891v-0.46875c0-0.0625,0.0483398-0.1079102,0.144043-0.1411133\r
- c0.0678711-0.0205078,0.144043-0.0322266,0.2280273-0.0322266h0.4550781c0.2304688,0,0.3461914,0.0527344,0.3461914,0.1513672\r
- V7.7363281L23.1572266,7.7363281z M23.4394531,7.7363281v-0.472168c0-0.2705078-0.206543-0.40625-0.6206055-0.40625h-0.4672852\r
- c-0.1655273,0-0.3051758,0.0288086-0.4165039,0.0859375c-0.1542969,0.0732422-0.2304688,0.1816406-0.2304688,0.3237305v0.46875\r
- c0,0.1425781,0.0761719,0.25,0.230957,0.3188477c0.1245117,0.0507812,0.2636719,0.0786133,0.4179688,0.0786133h0.465332\r
- c0.1689453,0,0.3041992-0.0244141,0.4057617-0.0761719C23.3681641,7.9887695,23.4394531,7.8828125,23.4394531,7.7363281\r
- L23.4394531,7.7363281z M31.5537109,6.1171875v0.0517578c0,0.0253906-0.0209961,0.0375977-0.0625,0.0375977h-0.1767578V6.0766602\r
- h0.1674805C31.5302734,6.0766602,31.5537109,6.0898438,31.5537109,6.1171875L31.5537109,6.1171875z M31.6123047,6.1689453\r
- V6.1171875c0-0.0639648-0.046875-0.0981445-0.140625-0.0981445h-0.2036133c-0.0112305,0-0.0166016,0.0068359-0.0166016,0.0195312\r
- v0.3613281c0,0.0219727,0.0097656,0.0332031,0.0292969,0.0332031c0.0224609,0,0.0336914-0.0112305,0.0336914-0.0332031v-0.140625\r
- l0.2519531,0.1723633c0.0102539,0.0019531,0.015625,0.003418,0.0166016,0.003418\r
- c0.0097656,0,0.0170898-0.0029297,0.0229492-0.0087891c0.0063477-0.0063477,0.0097656-0.0131836,0.0097656-0.0214844\r
- c0-0.0112305-0.0043945-0.0170898-0.0146484-0.0200195L31.4213867,6.262207h0.0629883\r
- C31.5698242,6.262207,31.6123047,6.2319336,31.6123047,6.1689453L31.6123047,6.1689453z M31.7441406,6.2324219\r
- c0,0.0888672-0.0292969,0.1650391-0.090332,0.2285156c-0.0585938,0.0625-0.1308594,0.0942383-0.2158203,0.0942383\r
- c-0.0820312,0-0.1552734-0.0317383-0.215332-0.0942383c-0.0600586-0.0629883-0.0888672-0.1376953-0.0888672-0.2285156\r
- c0-0.090332,0.0288086-0.1660156,0.0888672-0.2275391c0.0585938-0.0634766,0.1313477-0.0942383,0.215332-0.0942383\r
- c0.0849609,0,0.1572266,0.0307617,0.2158203,0.0942383C31.7148438,6.0683594,31.7441406,6.1455078,31.7441406,6.2324219\r
- L31.7441406,6.2324219z M31.8085938,6.2319336c0-0.1074219-0.0371094-0.1977539-0.1103516-0.2714844\r
- c-0.0722656-0.0751953-0.1577148-0.1142578-0.2602539-0.1142578c-0.1005859,0-0.1865234,0.0390625-0.2573242,0.1142578\r
- c-0.0712891,0.0756836-0.1069336,0.1660156-0.1069336,0.2714844c0,0.1074219,0.0356445,0.1992188,0.1069336,0.2753906\r
- c0.0708008,0.0737305,0.1582031,0.1103516,0.2573242,0.1103516c0.1025391,0,0.1889648-0.0366211,0.2612305-0.1103516\r
- C31.7714844,6.4311523,31.8085938,6.3393555,31.8085938,6.2319336L31.8085938,6.2319336z M15.5976562,9.6166992\r
- c0-0.1835938-0.0698242-0.2758789-0.2084961-0.2758789h-2.1367188c-0.1132812,0-0.2104492,0.003418-0.2939453,0.0083008\r
- c-0.0825195,0.0063477-0.1513672,0.0151367-0.2094727,0.0249023c-0.2246094,0.0415039-0.4169922,0.1240234-0.5727539,0.2426758\r
- c-0.1879883,0.1459961-0.2817383,0.3193359-0.2817383,0.5283203v1.6293945c0,0.1660156,0.0380859,0.3017578,0.1152344,0.4072266\r
- c0.0644531,0.0898438,0.1767578,0.1772461,0.3369141,0.2612305c0.1420898,0.0722656,0.2768555,0.1210938,0.4082031,0.1459961\r
- c0.1201172,0.0229492,0.3164062,0.0336914,0.5908203,0.0336914H15.375c0.1445312,0,0.2172852-0.0834961,0.2172852-0.2495117\r
- c0-0.1655273-0.0727539-0.246582-0.2172852-0.246582h-2.0292969c-0.5717773,0-0.8569336-0.1230469-0.8569336-0.3671875v-1.6176758\r
- c0-0.206543,0.2583008-0.3095703,0.7744141-0.3095703h2.1259766C15.527832,9.8320312,15.5976562,9.7602539,15.5976562,9.6166992\r
- L15.5976562,9.6166992z M19.5595703,11.8203125v-0.9550781c0-0.550293-0.4179688-0.8237305-1.2563477-0.8237305h-0.9443359\r
- c-0.3369141,0-0.6181641,0.0576172-0.8452148,0.1723633c-0.3100586,0.1474609-0.4643555,0.3657227-0.4643555,0.6572266v0.9492188\r
- c0,0.2875977,0.1552734,0.5039062,0.4672852,0.6435547c0.2514648,0.1049805,0.5341797,0.1586914,0.8447266,0.1586914h0.9418945\r
- c0.3422852,0,0.6166992-0.0537109,0.8217773-0.1572266C19.4150391,12.3291016,19.5595703,12.1152344,19.5595703,11.8203125\r
- L19.5595703,11.8203125z M18.9868164,11.8217773c0,0.1162109-0.0908203,0.2021484-0.2734375,0.2607422\r
- c-0.1328125,0.0439453-0.2719727,0.0654297-0.421875,0.0654297h-0.9208984c-0.175293,0-0.3286133-0.019043-0.4599609-0.0571289\r
- c-0.1967773-0.0581055-0.2939453-0.1469727-0.2939453-0.269043v-0.9506836c0-0.1269531,0.0957031-0.222168,0.2885742-0.2851562\r
- c0.1367188-0.0424805,0.2905273-0.0654297,0.4624023-0.0654297h0.9213867c0.4658203,0,0.6977539,0.1030273,0.6977539,0.3071289\r
- V11.8217773L18.9868164,11.8217773z M24.8198242,12.4101562v-1.527832c0-0.5595703-0.3964844-0.8408203-1.190918-0.8408203\r
- c-0.2954102,0-0.5058594,0.0078125-0.6308594,0.0214844c-0.2368164,0.0297852-0.4360352,0.0961914-0.5976562,0.1972656\r
- c-0.1806641-0.1064453-0.3769531-0.1762695-0.5908203-0.2026367c-0.050293-0.0073242-0.1274414-0.0083008-0.2299805-0.012207\r
- c-0.1035156-0.0039062-0.2353516-0.0039062-0.3994141-0.0039062c-0.8242188,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832\r
- c0,0.1411133,0.0698242,0.2124023,0.2104492,0.2124023c0.1386719,0,0.2202148-0.0073242,0.2441406-0.0234375\r
- c0.0742188-0.0263672,0.112793-0.090332,0.112793-0.1923828v-1.5839844c0-0.2080078,0.2431641-0.3129883,0.7285156-0.3129883\r
- c0.0185547,0,0.0415039,0.0014648,0.0673828,0.0014648c0.0273438,0,0.0581055,0.0039062,0.09375,0.0039062\r
- c0.0019531,0,0.0102539,0,0.0244141,0h0.0239258h0.0463867h0.0693359c0.1699219,0,0.2910156,0.0185547,0.3671875,0.0561523\r
- c0.109375,0.0561523,0.1625977,0.1582031,0.1625977,0.3110352v1.5268555c0,0.1420898,0.0712891,0.2133789,0.2128906,0.2133789\r
- c0.1401367,0,0.2211914-0.0073242,0.2446289-0.0234375c0.0771484-0.0263672,0.1162109-0.090332,0.1162109-0.1923828v-1.5185547\r
- c0-0.168457,0.0839844-0.2792969,0.2519531-0.3291016c0.0756836-0.0229492,0.2290039-0.0400391,0.4609375-0.0493164\r
- c0.0019531,0,0.012207,0,0.0317383,0h0.0351562h0.0751953c0.4819336,0,0.7236328,0.1030273,0.7236328,0.3071289v1.5898438\r
- c0,0.1020508,0.0390625,0.1660156,0.1162109,0.1923828c0.0234375,0.0161133,0.105957,0.0234375,0.2460938,0.0234375\r
- C24.7490234,12.6225586,24.8198242,12.5512695,24.8198242,12.4101562L24.8198242,12.4101562z M30.0795898,12.4101562v-1.527832\r
- c0-0.5595703-0.3969727-0.8408203-1.1914062-0.8408203c-0.2954102,0-0.5058594,0.0078125-0.6303711,0.0214844\r
- c-0.2373047,0.0297852-0.4360352,0.0961914-0.5976562,0.1972656c-0.1806641-0.1064453-0.3774414-0.1762695-0.5913086-0.2026367\r
- c-0.050293-0.0073242-0.1264648-0.0083008-0.2299805-0.012207c-0.1025391-0.0039062-0.2348633-0.0039062-0.3989258-0.0039062\r
- c-0.8232422,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832c0,0.1411133,0.0693359,0.2124023,0.2099609,0.2124023\r
- c0.1391602,0,0.2207031-0.0073242,0.2441406-0.0234375c0.0751953-0.0263672,0.1137695-0.090332,0.1137695-0.1923828v-1.5839844\r
- c0-0.2080078,0.2431641-0.3129883,0.7290039-0.3129883c0.0175781,0,0.0400391,0.0014648,0.0664062,0.0014648\r
- c0.0268555,0,0.0576172,0.0039062,0.09375,0.0039062c0.0019531,0,0.0097656,0,0.0249023,0h0.0229492h0.0463867h0.0708008\r
- c0.1694336,0,0.2905273,0.0185547,0.3662109,0.0561523c0.109375,0.0561523,0.1640625,0.1582031,0.1640625,0.3110352v1.5268555\r
- c0,0.1420898,0.0698242,0.2133789,0.2114258,0.2133789c0.1401367,0,0.2216797-0.0073242,0.2451172-0.0234375\r
- c0.0761719-0.0263672,0.1157227-0.090332,0.1157227-0.1923828v-1.5185547c0-0.168457,0.0844727-0.2792969,0.253418-0.3291016\r
- c0.0742188-0.0229492,0.2280273-0.0400391,0.4589844-0.0493164c0.0019531,0,0.0126953,0,0.0317383,0h0.0356445h0.0756836\r
- c0.4829102,0,0.7226562,0.1030273,0.7226562,0.3071289v1.5898438c0,0.1020508,0.0395508,0.1660156,0.1171875,0.1923828\r
- c0.0229492,0.0161133,0.1049805,0.0234375,0.2451172,0.0234375C30.0092773,12.6225586,30.0795898,12.5512695,30.0795898,12.4101562\r
- L30.0795898,12.4101562z M34.0786133,11.8505859v-1.5966797c0-0.1411133-0.0703125-0.2124023-0.2114258-0.2124023\r
- c-0.1401367,0-0.2226562,0.0048828-0.2456055,0.0161133c-0.0771484,0.0263672-0.1152344,0.0927734-0.1152344,0.1962891v1.6064453\r
- c0,0.1928711-0.2661133,0.2875977-0.7978516,0.2875977h-0.8476562c-0.5419922,0-0.8144531-0.0986328-0.8144531-0.2939453\r
- v-1.6000977c0-0.1035156-0.0375977-0.1699219-0.112793-0.1962891c-0.0234375-0.0112305-0.1049805-0.0161133-0.2436523-0.0161133\r
- c-0.1401367,0-0.2094727,0.0712891-0.2094727,0.2124023v1.5976562c0,0.5126953,0.4589844,0.7709961,1.3798828,0.7709961h0.1206055\r
- h0.078125h0.0429688h0.0244141c0.0131836,0,0.0195312,0,0.0214844,0c0.0649414,0.0014648,0.1201172,0.0039062,0.1699219,0.0048828\r
- c0.0483398,0,0.0878906,0,0.1171875,0C33.5302734,12.6274414,34.0786133,12.3676758,34.0786133,11.8505859L34.0786133,11.8505859z\r
- M37.9907227,12.4101562v-1.6391602c0-0.4858398-0.4277344-0.7294922-1.2851562-0.7294922h-0.9257812\r
- c-0.8671875,0-1.2998047,0.2436523-1.2998047,0.7333984v1.6318359c0,0.1020508,0.0380859,0.1660156,0.1123047,0.1923828\r
- c0.0234375,0.0161133,0.1049805,0.0234375,0.2446289,0.0234375c0.1401367,0,0.2094727-0.0712891,0.2094727-0.2124023v-1.6391602\r
- c0-0.1157227,0.0917969-0.1923828,0.2744141-0.2275391c0.0395508-0.0073242,0.0922852-0.012207,0.1591797-0.0161133\r
- c0.0673828-0.0039062,0.1508789-0.0068359,0.2485352-0.0068359h0.9770508c0.1074219,0,0.1953125,0.0024414,0.2661133,0.0043945\r
- c0.0712891,0.0024414,0.1230469,0.0073242,0.1572266,0.0151367c0.1933594,0.034668,0.2895508,0.1113281,0.2895508,0.2270508\r
- v1.6396484c0,0.1020508,0.0385742,0.1660156,0.1157227,0.1923828c0.0234375,0.0161133,0.1044922,0.0234375,0.2451172,0.0234375\r
- C37.9204102,12.6225586,37.9907227,12.5512695,37.9907227,12.4101562L37.9907227,12.4101562z M39.0961914,9.6855469\r
- c0-0.0927734-0.0395508-0.1645508-0.1181641-0.2182617c-0.0673828-0.0473633-0.1518555-0.0717773-0.2495117-0.0717773\r
- c-0.0996094,0-0.1821289,0.0244141-0.2495117,0.0717773c-0.0795898,0.0537109-0.1186523,0.1254883-0.1186523,0.2182617\r
- c0,0.0952148,0.0390625,0.1694336,0.1186523,0.2226562c0.0673828,0.0458984,0.1499023,0.0693359,0.2495117,0.0693359\r
- c0.0976562,0,0.1821289-0.0234375,0.2495117-0.0693359C39.0566406,9.8549805,39.0961914,9.7807617,39.0961914,9.6855469\r
- L39.0961914,9.6855469z M39.0185547,12.4067383v-2.1679688c0-0.1010742-0.0366211-0.1635742-0.1123047-0.1894531\r
- c-0.0239258-0.0151367-0.1035156-0.0205078-0.2407227-0.0205078c-0.1425781,0-0.2138672,0.0703125-0.2138672,0.2099609v2.1679688\r
- c0,0.1020508,0.0375977,0.1660156,0.1108398,0.1923828c0.0229492,0.0161133,0.1049805,0.0234375,0.2431641,0.0234375\r
- C38.9482422,12.6225586,39.0185547,12.5488281,39.0185547,12.4067383L39.0185547,12.4067383z M41.4208984,10.3276367\r
- c0-0.1762695-0.0703125-0.2646484-0.2124023-0.2646484h-0.8974609V9.5546875c0-0.1005859-0.0385742-0.1640625-0.1162109-0.1904297\r
- c-0.0229492-0.0151367-0.1030273-0.0234375-0.2407227-0.0234375c-0.140625,0-0.2099609,0.0708008-0.2099609,0.2124023v0.5097656\r
- c-0.0751953,0-0.1362305,0.0024414-0.184082,0.0053711c-0.0483398,0.0014648-0.081543,0.0053711-0.1010742,0.0092773\r
- c-0.0898438,0.0302734-0.1342773,0.1049805-0.1342773,0.2236328c0,0.1176758,0.0444336,0.1923828,0.1342773,0.222168\r
- c0.0195312,0.0039062,0.0527344,0.0078125,0.1010742,0.0087891c0.0478516,0.0039062,0.1088867,0.0053711,0.184082,0.0053711\r
- v1.8691406c0,0.0996094,0.0390625,0.1660156,0.1147461,0.1923828c0.0244141,0.0161133,0.1044922,0.0234375,0.2431641,0.0234375\r
- s0.2089844-0.0712891,0.2089844-0.2124023v-1.8725586h0.8974609\r
- C41.3505859,10.5375977,41.4208984,10.4663086,41.4208984,10.3276367L41.4208984,10.3276367z M45.2436523,12.5825195v-2.3286133\r
- c0-0.1035156-0.0375977-0.1699219-0.1113281-0.1962891c-0.0244141-0.0112305-0.1069336-0.0161133-0.2460938-0.0161133\r
- c-0.1425781,0-0.2133789,0.0712891-0.2133789,0.2124023v1.8725586h-1.6923828c-0.4760742,0-0.7128906-0.1000977-0.7128906-0.296875\r
- v-1.5756836c0-0.1411133-0.0693359-0.2124023-0.2089844-0.2124023s-0.2207031,0.0048828-0.2456055,0.0161133\r
- c-0.0742188,0.0263672-0.1118164,0.0927734-0.1118164,0.1938477v1.578125c0,0.5126953,0.425293,0.7695312,1.2792969,0.7695312\r
- h1.6923828c0,0.1660156-0.2519531,0.2480469-0.7583008,0.2480469c-0.019043,0-0.0439453-0.0009766-0.0708008-0.0009766\r
- c-0.027832,0-0.0615234-0.0014648-0.1010742-0.0039062c-0.0014648,0-0.0102539,0-0.0288086,0h-0.0273438h-0.0449219h-0.0727539\r
- c-0.1416016,0-0.2128906,0.0712891-0.2128906,0.2143555c0,0.097168,0.0126953,0.1630859,0.0351562,0.1977539\r
- c0.0297852,0.0527344,0.0898438,0.0791016,0.1777344,0.0791016c0.5351562,0,0.8833008-0.0224609,1.0375977-0.0678711\r
- C45.0327148,13.159668,45.2436523,12.9316406,45.2436523,12.5825195L45.2436523,12.5825195z M50.8115234,10.9975586\r
- c0-0.1625977-0.0742188-0.2441406-0.2231445-0.2441406h-2.855957v-0.6230469c0-0.1987305,0.4013672-0.2983398,1.2050781-0.2983398\r
- c0.1401367,0,0.2109375-0.0717773,0.2109375-0.215332c0-0.1835938-0.0708008-0.2758789-0.2109375-0.2758789h-0.4472656\r
- c-0.309082,0-0.5908203,0.0532227-0.8500977,0.1621094c-0.3344727,0.1401367-0.5029297,0.3398438-0.5029297,0.6025391v2.3012695\r
- c0,0.1020508,0.0424805,0.1660156,0.1289062,0.1923828c0.0229492,0.0161133,0.1098633,0.0234375,0.2563477,0.0234375\r
- c0.1381836,0,0.2099609-0.0712891,0.2099609-0.2124023v-1.1665039h2.855957\r
- C50.7373047,11.2436523,50.8115234,11.1616211,50.8115234,10.9975586L50.8115234,10.9975586z M52.4326172,10.3100586\r
- c0-0.1796875-0.0712891-0.2685547-0.2128906-0.2685547c-0.4179688,0-0.7324219,0.0375977-0.9428711,0.1123047\r
- c-0.347168,0.1210938-0.519043,0.3486328-0.519043,0.6860352v1.5668945c0,0.1445312,0.0668945,0.2158203,0.2026367,0.2158203\r
- c0.1323242,0,0.2128906-0.0063477,0.2446289-0.0161133c0.0805664-0.0288086,0.1191406-0.0922852,0.1191406-0.1972656v-1.5693359\r
- c0-0.2163086,0.2182617-0.324707,0.6533203-0.324707c0.0239258,0,0.0571289,0.0014648,0.1010742,0.0039062\r
- c0.0444336,0.0014648,0.078125,0.0014648,0.1010742,0.0014648C52.3466797,10.5205078,52.4326172,10.4511719,52.4326172,10.3100586\r
- L52.4326172,10.3100586z M56.5,11.8466797v-1.0117188c0-0.3500977-0.2060547-0.5810547-0.6171875-0.6982422\r
- c-0.2416992-0.0654297-0.5878906-0.0952148-1.0400391-0.0952148c-0.1411133,0-0.2094727,0.0698242-0.2094727,0.2099609\r
- c0,0.1762695,0.0683594,0.2636719,0.2094727,0.2636719h0.0673828h0.0424805h0.0244141c0.0136719,0,0.0224609,0,0.0263672,0\r
- c0.0361328,0,0.0673828-0.0039062,0.0947266-0.0039062s0.0527344-0.0014648,0.0712891-0.0014648\r
- c0.4824219,0,0.7397461,0.0932617,0.769043,0.277832H53.9375c-0.3105469,0-0.5698242,0.0488281-0.7744141,0.1533203\r
- c-0.277832,0.1357422-0.4174805,0.3374023-0.4174805,0.6044922v0.3305664c0,0.2480469,0.1479492,0.4418945,0.4389648,0.5830078\r
- c0.2167969,0.109375,0.4726562,0.1635742,0.7705078,0.1635742h1.3862305C56.1132812,12.6225586,56.5,12.3642578,56.5,11.8466797\r
- L56.5,11.8466797z M55.9448242,11.7128906c0,0.1938477-0.0546875,0.3173828-0.1660156,0.3720703\r
- c-0.0776367,0.0415039-0.222168,0.0629883-0.4350586,0.0629883h-1.4047852c-0.1401367,0-0.265625-0.0205078-0.3735352-0.0585938\r
- c-0.1674805-0.050293-0.2514648-0.1235352-0.2514648-0.21875v-0.3276367c0-0.0898438,0.081543-0.1621094,0.2426758-0.2172852\r
- c0.1264648-0.0449219,0.2470703-0.065918,0.3657227-0.065918h2.0097656c0,0.0249023,0,0.0571289,0.0014648,0.0947266\r
- c0.0024414,0.0375977,0.0024414,0.0810547,0.0048828,0.1323242c0,0.050293,0.0024414,0.0952148,0.0039062,0.1323242\r
- C55.9423828,11.6572266,55.9448242,11.6879883,55.9448242,11.7128906L55.9448242,11.7128906z M61.7548828,12.4101562v-1.527832\r
- c0-0.5595703-0.3979492-0.8408203-1.1904297-0.8408203c-0.2973633,0-0.5068359,0.0078125-0.6323242,0.0214844\r
- c-0.2353516,0.0297852-0.4360352,0.0961914-0.5961914,0.1972656c-0.1801758-0.1064453-0.3779297-0.1762695-0.5932617-0.2026367\r
- c-0.0473633-0.0073242-0.1259766-0.0083008-0.2265625-0.012207c-0.1054688-0.0039062-0.2373047-0.0039062-0.4003906-0.0039062\r
- c-0.8242188,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832c0,0.1411133,0.0693359,0.2124023,0.2104492,0.2124023\r
- c0.1386719,0,0.2192383-0.0073242,0.2441406-0.0234375c0.074707-0.0263672,0.1118164-0.090332,0.1118164-0.1923828v-1.5839844\r
- c0-0.2080078,0.2431641-0.3129883,0.7294922-0.3129883c0.0170898,0,0.0415039,0.0014648,0.0673828,0.0014648\r
- c0.0263672,0,0.0585938,0.0039062,0.0947266,0.0039062c0.0009766,0,0.0097656,0,0.0224609,0h0.0249023h0.0463867h0.0683594\r
- c0.1694336,0,0.2915039,0.0185547,0.3676758,0.0561523c0.1083984,0.0561523,0.1635742,0.1582031,0.1635742,0.3110352v1.5268555\r
- c0,0.1420898,0.0708008,0.2133789,0.2109375,0.2133789c0.140625,0,0.2216797-0.0073242,0.2456055-0.0234375\r
- c0.078125-0.0263672,0.1166992-0.090332,0.1166992-0.1923828v-1.5185547c0-0.168457,0.0839844-0.2792969,0.2524414-0.3291016\r
- c0.0742188-0.0229492,0.2294922-0.0400391,0.4594727-0.0493164c0.0009766,0,0.012207,0,0.0341797,0h0.0336914h0.0751953\r
- c0.4833984,0,0.722168,0.1030273,0.722168,0.3071289v1.5898438c0,0.1020508,0.0395508,0.1660156,0.1176758,0.1923828\r
- c0.0234375,0.0161133,0.1040039,0.0234375,0.2451172,0.0234375C61.6831055,12.6225586,61.7548828,12.5512695,61.7548828,12.4101562\r
- L61.7548828,12.4101562z M65.6176758,11.3735352v-0.6225586c0-0.2524414-0.1376953-0.440918-0.4057617-0.5668945\r
- c-0.1943359-0.1000977-0.4404297-0.1474609-0.737793-0.1474609h-1.0561523c-0.3637695,0-0.6547852,0.0512695-0.8754883,0.15625\r
- c-0.3203125,0.1420898-0.480957,0.3637695-0.480957,0.6616211v0.949707c0,0.2197266,0.1040039,0.4121094,0.3139648,0.5761719\r
- c0.1464844,0.1137695,0.3759766,0.1879883,0.6855469,0.21875c0.0625,0.0083008,0.1552734,0.0161133,0.2768555,0.0170898\r
- c0.1186523,0.0039062,0.2758789,0.0063477,0.465332,0.0063477c0.1396484,0,0.2094727-0.0712891,0.2094727-0.2124023\r
- c0-0.1757812-0.0698242-0.262207-0.2094727-0.262207c-0.184082,0-0.3354492-0.003418-0.4560547-0.012207\r
- c-0.1171875-0.0083008-0.2099609-0.0205078-0.2719727-0.0327148c-0.2866211-0.0727539-0.4287109-0.2294922-0.4287109-0.4760742\r
- v-0.0185547h2.8125C65.5634766,11.6083984,65.6176758,11.5307617,65.6176758,11.3735352L65.6176758,11.3735352z\r
- M65.0600586,11.1166992H62.628418v-0.2978516c0-0.1313477,0.1191406-0.2202148,0.3569336-0.2651367\r
- c0.1660156-0.0332031,0.4750977-0.050293,0.9277344-0.050293c0.765625,0,1.1469727,0.0996094,1.1469727,0.2939453V11.1166992\r
- L65.0600586,11.1166992z M70.9165039,10.2138672c0-0.1225586-0.0898438-0.1850586-0.269043-0.1850586\r
- c-0.1552734,0-0.2548828,0.0424805-0.2988281,0.1264648l-0.8676758,1.6845703l-0.8486328-1.5722656\r
- c-0.0673828-0.1225586-0.1757812-0.1845703-0.3237305-0.1845703c-0.1513672,0-0.2597656,0.0620117-0.3261719,0.1884766\r
- l-0.8505859,1.5683594l-0.8691406-1.6845703c-0.0483398-0.0839844-0.1464844-0.1264648-0.3012695-0.1264648\r
- c-0.1757812,0-0.2670898,0.0625-0.2670898,0.1850586c0,0.0200195,0.0131836,0.0649414,0.0400391,0.1337891l1.0273438,2.043457\r
- c0.0600586,0.1240234,0.1796875,0.1865234,0.3520508,0.1865234c0.168457,0,0.2822266-0.0585938,0.3476562-0.1772461\r
- l0.847168-1.5742188l0.8369141,1.5717773c0.0639648,0.1162109,0.1762695,0.1748047,0.3354492,0.1748047\r
- c0.1689453,0,0.2832031-0.0610352,0.3442383-0.1816406l1.0512695-2.0424805\r
- C70.902832,10.2973633,70.9165039,10.2539062,70.9165039,10.2138672L70.9165039,10.2138672z M74.6005859,11.8203125v-0.9550781\r
- c0-0.550293-0.4189453-0.8237305-1.2558594-0.8237305h-0.9448242c-0.3369141,0-0.6166992,0.0576172-0.8461914,0.1723633\r
- c-0.3081055,0.1474609-0.4628906,0.3657227-0.4628906,0.6572266v0.9492188c0,0.2875977,0.1557617,0.5039062,0.4667969,0.6435547\r
- c0.2509766,0.1049805,0.534668,0.1586914,0.8447266,0.1586914h0.9423828c0.3422852,0,0.6166992-0.0537109,0.8222656-0.1572266\r
- C74.4560547,12.3291016,74.6005859,12.1152344,74.6005859,11.8203125L74.6005859,11.8203125z M74.027832,11.8217773\r
- c0,0.1162109-0.0908203,0.2021484-0.2739258,0.2607422c-0.1308594,0.0439453-0.2729492,0.0654297-0.4208984,0.0654297h-0.921875\r
- c-0.1743164,0-0.3291016-0.019043-0.4575195-0.0571289c-0.1972656-0.0581055-0.2973633-0.1469727-0.2973633-0.269043v-0.9506836\r
- c0-0.1269531,0.0976562-0.222168,0.2910156-0.2851562c0.1347656-0.0424805,0.2895508-0.0654297,0.4614258-0.0654297h0.9213867\r
- c0.4672852,0,0.6977539,0.1030273,0.6977539,0.3071289V11.8217773L74.027832,11.8217773z M76.5820312,10.3100586\r
- c0-0.1796875-0.0693359-0.2685547-0.2104492-0.2685547c-0.418457,0-0.7333984,0.0375977-0.9458008,0.1123047\r
- c-0.3457031,0.1210938-0.5166016,0.3486328-0.5166016,0.6860352v1.5668945c0,0.1445312,0.0664062,0.2158203,0.2011719,0.2158203\r
- c0.1333008,0,0.2148438-0.0063477,0.2470703-0.0161133c0.0776367-0.0288086,0.1166992-0.0922852,0.1166992-0.1972656v-1.5693359\r
- c0-0.2163086,0.2177734-0.324707,0.6538086-0.324707c0.0224609,0,0.0561523,0.0014648,0.1010742,0.0039062\r
- c0.043457,0.0014648,0.0776367,0.0014648,0.1005859,0.0014648C76.4980469,10.5205078,76.5820312,10.4511719,76.5820312,10.3100586\r
- L76.5820312,10.3100586z M79.909668,12.4228516c0-0.0888672-0.0473633-0.15625-0.1459961-0.2036133l-1.7768555-0.8935547\r
- l1.7373047-0.8657227c0.0957031-0.0488281,0.144043-0.1162109,0.144043-0.2036133\r
- c0-0.128418-0.0800781-0.1948242-0.2387695-0.1948242c-0.1230469,0-0.2099609,0.0068359-0.2573242,0.0214844l-1.9106445,0.9580078\r
- h-0.0029297V9.5507812c0-0.1030273-0.0380859-0.168457-0.1098633-0.1914062\r
- c-0.0297852-0.0126953-0.1123047-0.0185547-0.2416992-0.0185547c-0.1401367,0-0.2114258,0.0708008-0.2114258,0.2099609v2.859375\r
- c0,0.1411133,0.0712891,0.2124023,0.2114258,0.2124023c0.1352539,0,0.2158203-0.0073242,0.237793-0.0234375\r
- c0.0742188-0.0263672,0.1137695-0.0927734,0.1137695-0.1923828v-0.7797852l1.9360352,0.972168\r
- c0.0336914,0.0161133,0.1240234,0.0234375,0.2758789,0.0234375C79.8291016,12.6225586,79.909668,12.5551758,79.909668,12.4228516\r
- L79.909668,12.4228516z M82,8.6796875V8.1425781c0-0.0795898-0.0385742-0.1186523-0.1171875-0.1186523\r
- c-0.0214844,0-0.0410156,0.0048828-0.0585938,0.0112305c-0.015625,0.0097656-0.0322266,0.0224609-0.0458984,0.0371094\r
- l-0.3515625,0.4414062l-0.3603516-0.4384766c-0.0258789-0.0341797-0.0629883-0.0512695-0.1049805-0.0512695h-0.7661133\r
- c-0.0390625,0-0.0639648,0.0146484-0.0776367,0.0439453c-0.0087891,0.0131836-0.0151367,0.0371094-0.0151367,0.065918\r
- c0,0.0629883,0.0327148,0.09375,0.0927734,0.09375h0.1992188v0.4521484c0,0.0249023,0.0048828,0.0439453,0.0141602,0.059082\r
- c0.0107422,0.0131836,0.0258789,0.0258789,0.050293,0.03125c0.0039062,0.0024414,0.0112305,0.003418,0.0200195,0.003418\r
- s0.0234375,0,0.0410156,0c0.03125,0,0.0537109-0.0063477,0.0693359-0.0229492\r
- c0.0146484-0.0141602,0.0205078-0.0400391,0.0205078-0.0708008V8.2275391h0.2348633v0.4521484\r
- c0,0.0463867,0.0234375,0.0756836,0.065918,0.090332c0.003418,0.0024414,0.012207,0.003418,0.0209961,0.003418\r
- c0.0112305,0,0.0234375,0,0.0410156,0c0.0600586,0,0.090332-0.0297852,0.090332-0.09375V8.4082031l0.2529297,0.3178711\r
- c0.0273438,0.0332031,0.0634766,0.0512695,0.1108398,0.0512695c0.0458984,0,0.0834961-0.0180664,0.1123047-0.0512695\r
- l0.2426758-0.3071289v0.2607422c0,0.0639648,0.0307617,0.09375,0.0913086,0.09375h0.0380859c0.0039062,0,0.0053711,0,0.0087891,0\r
- c0.0039062,0,0.0078125-0.0009766,0.0102539-0.003418C81.9760742,8.7553711,82,8.7260742,82,8.6796875L82,8.6796875z\r
- M10.1689453,9.0756836c-0.6611328,2.0117188-1.2885742,2.6499023-3.7602539,3.3994141\r
- C7.5439453,10.1674805,8.2143555,9.5195312,10.1689453,9.0756836L10.1689453,9.0756836z M10.4858398,8.7475586H5.2431641\r
- c-0.9643555,0-1.7470703,0.7841797-1.7470703,1.7509766v3.5019531h5.2426758c0.965332,0,1.7470703-0.7822266,1.7470703-1.75\r
- V8.7475586L10.4858398,8.7475586z M4.9526367,2.9604492c2.6518555,0.5991211,3.5625,1.4804688,5.1035156,4.6108398\r
- C6.7021484,6.5551758,5.8486328,5.6879883,4.9526367,2.9604492L4.9526367,2.9604492z M10.4858398,3.3769531\r
- C10.4858398,2.0639648,9.425293,1,8.1142578,1H1v4.7529297c0,1.3115234,1.0625,2.3769531,2.371582,2.3769531h7.1142578V3.3769531\r
- L10.4858398,3.3769531z M14.3266602,5.0581055c-0.5327148,1.6206055-1.0395508,2.1362305-3.0317383,2.7392578\r
- C12.2099609,5.9379883,12.7504883,5.4140625,14.3266602,5.0581055L14.3266602,5.0581055z M11.1020508,5.3056641v2.8242188\r
- h4.2275391c0.7783203,0,1.409668-0.6333008,1.409668-1.4121094v-2.824707H12.512207\r
- C11.7338867,3.8930664,11.1020508,4.5253906,11.1020508,5.3056641L11.1020508,5.3056641z"/>\r
- </g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="83px" height="16px" viewBox="0 0 83 16" xml:space="preserve">
+ <title>WoltLab Community Framework</title>
+ <desc>WoltLab Community Framework Logo</desc>
+
+ <defs>
+
+ </defs>
+
+ <g id="LogoWCF">
+ <path id="Upper_2_" style="fill:#fff;" d="M21.7739258,6.6103516c0,0.0166016-0.0043945,0.0336914-0.012207,0.0498047
+ l-0.6391602,1.3535156c-0.0385742,0.0786133-0.1000977,0.1201172-0.1831055,0.1201172
+ c-0.0810547,0-0.1391602-0.0375977-0.1733398-0.1118164l-0.5107422-1.0942383l-0.5268555,1.097168
+ c-0.0317383,0.0639648-0.0898438,0.0976562-0.171875,0.0976562c-0.0898438,0-0.1503906-0.0351562-0.1821289-0.1049805
+ L18.7382812,6.659668c-0.0083008-0.0161133-0.0112305-0.03125-0.0112305-0.0454102
+ c0-0.0351562,0.0175781-0.0634766,0.0537109-0.0839844c0.0307617-0.0166016,0.065918-0.0253906,0.1040039-0.0253906
+ c0.0625,0,0.1054688,0.0209961,0.1269531,0.0649414l0.5449219,1.1606445l0.5175781-1.1152344
+ c0.0371094-0.0786133,0.0961914-0.1201172,0.1782227-0.1201172c0.027832,0,0.0605469,0.012207,0.0961914,0.034668
+ c0.0361328,0.0229492,0.0610352,0.0473633,0.0732422,0.0756836l0.5258789,1.125l0.5361328-1.1567383
+ c0.0205078-0.0458984,0.0664062-0.0664062,0.1386719-0.0664062c0.0351562,0,0.0693359,0.0078125,0.0986328,0.0229492
+ C21.7568359,6.5498047,21.7739258,6.5766602,21.7739258,6.6103516L21.7739258,6.6103516z M30.7270508,7.7226562
+ c0,0.0849609-0.0458984,0.1386719-0.1396484,0.1611328c-0.0214844,0.003418-0.0507812,0.0078125-0.090332,0.0112305
+ c-0.0390625,0.0014648-0.0893555,0.0039062-0.1508789,0.0039062h-0.3999023c-0.0424805,0-0.0854492-0.0024414-0.1279297-0.0073242
+ c-0.0424805-0.0078125-0.0854492-0.0126953-0.128418-0.0224609c-0.1210938-0.0288086-0.1801758-0.0737305-0.1801758-0.1328125
+ V7.1044922h0.8388672c0.2524414,0,0.378418,0.0551758,0.378418,0.1645508V7.7226562L30.7270508,7.7226562z M31.0083008,7.7314453
+ V7.2641602c0-0.2636719-0.2216797-0.3955078-0.6640625-0.3955078h-0.8344727V6.6201172
+ c0-0.0703125-0.0356445-0.1049805-0.1040039-0.1049805c-0.0698242,0-0.1103516,0.0029297-0.1210938,0.0078125
+ c-0.0371094,0.0131836-0.0551758,0.0449219-0.0551758,0.0957031v1.1176758c0,0.1376953,0.0839844,0.2426758,0.253418,0.3134766
+ c0.1303711,0.0551758,0.2749023,0.0839844,0.4321289,0.0839844h0.4291992C30.7866211,8.1337891,31.0083008,8,31.0083008,7.7314453
+ L31.0083008,7.7314453z M28.7851562,7.684082c0,0.0947266-0.0268555,0.15625-0.0800781,0.1850586
+ C28.6665039,7.887207,28.59375,7.8989258,28.4902344,7.8989258h-0.6948242c-0.0703125,0-0.1318359-0.0087891-0.1855469-0.0288086
+ c-0.081543-0.0249023-0.1235352-0.0600586-0.1235352-0.1083984V7.6005859c0-0.0424805,0.0400391-0.0800781,0.1191406-0.1079102
+ c0.0625-0.0209961,0.1230469-0.0332031,0.1821289-0.0332031h0.9931641L28.78125,7.5078125l0.0024414,0.0634766l0.0014648,0.0664062
+ V7.684082L28.7851562,7.684082z M29.0600586,7.7490234V7.2495117c0-0.1728516-0.1010742-0.2866211-0.3051758-0.3452148
+ c-0.1186523-0.0297852-0.2895508-0.0463867-0.5131836-0.0463867c-0.0693359,0-0.1040039,0.0341797-0.1040039,0.1030273
+ c0,0.0878906,0.034668,0.1318359,0.1040039,0.1318359h0.0327148h0.0205078h0.0126953h0.0126953l0.0478516-0.0009766
+ l0.0351562-0.0024414c0.2387695,0,0.3647461,0.0449219,0.3803711,0.137207H27.793457
+ c-0.152832,0-0.2797852,0.0249023-0.3813477,0.0761719c-0.1376953,0.0678711-0.2070312,0.1655273-0.2070312,0.2988281v0.1625977
+ c0,0.1230469,0.0732422,0.2197266,0.2172852,0.2871094c0.1064453,0.0546875,0.2333984,0.0825195,0.3798828,0.0825195h0.6855469
+ C28.8691406,8.1337891,29.0600586,8.0048828,29.0600586,7.7490234L29.0600586,7.7490234z M27.0146484,8.0288086
+ c0-0.0922852-0.0356445-0.137207-0.1044922-0.137207H25.980957c-0.1582031,0-0.2592773-0.0078125-0.3032227-0.0175781
+ c-0.1347656-0.0263672-0.2041016-0.0825195-0.2041016-0.1679688V6.6162109c0-0.0517578-0.0219727-0.0834961-0.0625-0.0957031
+ c-0.019043-0.0053711-0.0605469-0.0087891-0.1274414-0.0087891c-0.0693359,0-0.1040039,0.034668-0.1040039,0.1035156v1.0908203
+ c0,0.1811523,0.0932617,0.3051758,0.2797852,0.3691406c0.121582,0.0390625,0.2895508,0.0585938,0.5058594,0.0585938h0.9448242
+ C26.9790039,8.1337891,27.0146484,8.1000977,27.0146484,8.0288086L27.0146484,8.0288086z M25.0913086,6.9985352
+ c0-0.0854492-0.0356445-0.1298828-0.1054688-0.1298828h-0.4438477V6.6166992c0-0.0488281-0.019043-0.0800781-0.0566406-0.09375
+ c-0.012207-0.0068359-0.0517578-0.0112305-0.1201172-0.0112305S24.262207,6.5473633,24.262207,6.6162109v0.2524414
+ c-0.0366211,0-0.0673828,0.0014648-0.090332,0.0019531c-0.0239258,0.0019531-0.0410156,0.0039062-0.0493164,0.0058594
+ c-0.0458984,0.0136719-0.0668945,0.0512695-0.0668945,0.1098633s0.0209961,0.0952148,0.0668945,0.1103516
+ c0.0083008,0.0014648,0.0253906,0.0043945,0.0493164,0.0053711c0.0229492,0.0024414,0.0537109,0.0024414,0.090332,0.0024414
+ v0.921875c0,0.0498047,0.0180664,0.0830078,0.0571289,0.0961914c0.0117188,0.0073242,0.0507812,0.0112305,0.1196289,0.0112305
+ c0.0693359,0,0.1030273-0.0336914,0.1030273-0.1049805V7.1044922h0.4438477
+ C25.0556641,7.1044922,25.0913086,7.0683594,25.0913086,6.9985352L25.0913086,6.9985352z M23.9208984,8.0288086V6.6152344
+ c0-0.0507812-0.0185547-0.0825195-0.0561523-0.0947266c-0.0161133-0.0053711-0.0561523-0.0087891-0.1206055-0.0087891
+ c-0.0693359,0-0.1035156,0.034668-0.1035156,0.1035156v1.4111328c0,0.0498047,0.0185547,0.0830078,0.0576172,0.0961914
+ C23.7080078,8.1298828,23.75,8.1337891,23.8168945,8.1337891C23.8857422,8.1337891,23.9208984,8.0976562,23.9208984,8.0288086
+ L23.9208984,8.0288086z M23.1572266,7.7363281c0,0.0576172-0.0458984,0.1015625-0.1347656,0.1298828
+ c-0.0664062,0.0209961-0.1357422,0.0327148-0.2094727,0.0327148h-0.4550781c-0.0869141,0-0.1621094-0.0087891-0.2275391-0.0288086
+ c-0.0961914-0.0268555-0.1464844-0.0727539-0.1464844-0.1337891v-0.46875c0-0.0625,0.0483398-0.1079102,0.144043-0.1411133
+ c0.0678711-0.0205078,0.144043-0.0322266,0.2280273-0.0322266h0.4550781c0.2304688,0,0.3461914,0.0527344,0.3461914,0.1513672
+ V7.7363281L23.1572266,7.7363281z M23.4394531,7.7363281v-0.472168c0-0.2705078-0.206543-0.40625-0.6206055-0.40625h-0.4672852
+ c-0.1655273,0-0.3051758,0.0288086-0.4165039,0.0859375c-0.1542969,0.0732422-0.2304688,0.1816406-0.2304688,0.3237305v0.46875
+ c0,0.1425781,0.0761719,0.25,0.230957,0.3188477c0.1245117,0.0507812,0.2636719,0.0786133,0.4179688,0.0786133h0.465332
+ c0.1689453,0,0.3041992-0.0244141,0.4057617-0.0761719C23.3681641,7.9887695,23.4394531,7.8828125,23.4394531,7.7363281
+ L23.4394531,7.7363281z M31.5537109,6.1171875v0.0517578c0,0.0253906-0.0209961,0.0375977-0.0625,0.0375977h-0.1767578V6.0766602
+ h0.1674805C31.5302734,6.0766602,31.5537109,6.0898438,31.5537109,6.1171875L31.5537109,6.1171875z M31.6123047,6.1689453
+ V6.1171875c0-0.0639648-0.046875-0.0981445-0.140625-0.0981445h-0.2036133c-0.0112305,0-0.0166016,0.0068359-0.0166016,0.0195312
+ v0.3613281c0,0.0219727,0.0097656,0.0332031,0.0292969,0.0332031c0.0224609,0,0.0336914-0.0112305,0.0336914-0.0332031v-0.140625
+ l0.2519531,0.1723633c0.0102539,0.0019531,0.015625,0.003418,0.0166016,0.003418
+ c0.0097656,0,0.0170898-0.0029297,0.0229492-0.0087891c0.0063477-0.0063477,0.0097656-0.0131836,0.0097656-0.0214844
+ c0-0.0112305-0.0043945-0.0170898-0.0146484-0.0200195L31.4213867,6.262207h0.0629883
+ C31.5698242,6.262207,31.6123047,6.2319336,31.6123047,6.1689453L31.6123047,6.1689453z M31.7441406,6.2324219
+ c0,0.0888672-0.0292969,0.1650391-0.090332,0.2285156c-0.0585938,0.0625-0.1308594,0.0942383-0.2158203,0.0942383
+ c-0.0820312,0-0.1552734-0.0317383-0.215332-0.0942383c-0.0600586-0.0629883-0.0888672-0.1376953-0.0888672-0.2285156
+ c0-0.090332,0.0288086-0.1660156,0.0888672-0.2275391c0.0585938-0.0634766,0.1313477-0.0942383,0.215332-0.0942383
+ c0.0849609,0,0.1572266,0.0307617,0.2158203,0.0942383C31.7148438,6.0683594,31.7441406,6.1455078,31.7441406,6.2324219
+ L31.7441406,6.2324219z M31.8085938,6.2319336c0-0.1074219-0.0371094-0.1977539-0.1103516-0.2714844
+ c-0.0722656-0.0751953-0.1577148-0.1142578-0.2602539-0.1142578c-0.1005859,0-0.1865234,0.0390625-0.2573242,0.1142578
+ c-0.0712891,0.0756836-0.1069336,0.1660156-0.1069336,0.2714844c0,0.1074219,0.0356445,0.1992188,0.1069336,0.2753906
+ c0.0708008,0.0737305,0.1582031,0.1103516,0.2573242,0.1103516c0.1025391,0,0.1889648-0.0366211,0.2612305-0.1103516
+ C31.7714844,6.4311523,31.8085938,6.3393555,31.8085938,6.2319336L31.8085938,6.2319336z M15.5976562,9.6166992
+ c0-0.1835938-0.0698242-0.2758789-0.2084961-0.2758789h-2.1367188c-0.1132812,0-0.2104492,0.003418-0.2939453,0.0083008
+ c-0.0825195,0.0063477-0.1513672,0.0151367-0.2094727,0.0249023c-0.2246094,0.0415039-0.4169922,0.1240234-0.5727539,0.2426758
+ c-0.1879883,0.1459961-0.2817383,0.3193359-0.2817383,0.5283203v1.6293945c0,0.1660156,0.0380859,0.3017578,0.1152344,0.4072266
+ c0.0644531,0.0898438,0.1767578,0.1772461,0.3369141,0.2612305c0.1420898,0.0722656,0.2768555,0.1210938,0.4082031,0.1459961
+ c0.1201172,0.0229492,0.3164062,0.0336914,0.5908203,0.0336914H15.375c0.1445312,0,0.2172852-0.0834961,0.2172852-0.2495117
+ c0-0.1655273-0.0727539-0.246582-0.2172852-0.246582h-2.0292969c-0.5717773,0-0.8569336-0.1230469-0.8569336-0.3671875v-1.6176758
+ c0-0.206543,0.2583008-0.3095703,0.7744141-0.3095703h2.1259766C15.527832,9.8320312,15.5976562,9.7602539,15.5976562,9.6166992
+ L15.5976562,9.6166992z M19.5595703,11.8203125v-0.9550781c0-0.550293-0.4179688-0.8237305-1.2563477-0.8237305h-0.9443359
+ c-0.3369141,0-0.6181641,0.0576172-0.8452148,0.1723633c-0.3100586,0.1474609-0.4643555,0.3657227-0.4643555,0.6572266v0.9492188
+ c0,0.2875977,0.1552734,0.5039062,0.4672852,0.6435547c0.2514648,0.1049805,0.5341797,0.1586914,0.8447266,0.1586914h0.9418945
+ c0.3422852,0,0.6166992-0.0537109,0.8217773-0.1572266C19.4150391,12.3291016,19.5595703,12.1152344,19.5595703,11.8203125
+ L19.5595703,11.8203125z M18.9868164,11.8217773c0,0.1162109-0.0908203,0.2021484-0.2734375,0.2607422
+ c-0.1328125,0.0439453-0.2719727,0.0654297-0.421875,0.0654297h-0.9208984c-0.175293,0-0.3286133-0.019043-0.4599609-0.0571289
+ c-0.1967773-0.0581055-0.2939453-0.1469727-0.2939453-0.269043v-0.9506836c0-0.1269531,0.0957031-0.222168,0.2885742-0.2851562
+ c0.1367188-0.0424805,0.2905273-0.0654297,0.4624023-0.0654297h0.9213867c0.4658203,0,0.6977539,0.1030273,0.6977539,0.3071289
+ V11.8217773L18.9868164,11.8217773z M24.8198242,12.4101562v-1.527832c0-0.5595703-0.3964844-0.8408203-1.190918-0.8408203
+ c-0.2954102,0-0.5058594,0.0078125-0.6308594,0.0214844c-0.2368164,0.0297852-0.4360352,0.0961914-0.5976562,0.1972656
+ c-0.1806641-0.1064453-0.3769531-0.1762695-0.5908203-0.2026367c-0.050293-0.0073242-0.1274414-0.0083008-0.2299805-0.012207
+ c-0.1035156-0.0039062-0.2353516-0.0039062-0.3994141-0.0039062c-0.8242188,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832
+ c0,0.1411133,0.0698242,0.2124023,0.2104492,0.2124023c0.1386719,0,0.2202148-0.0073242,0.2441406-0.0234375
+ c0.0742188-0.0263672,0.112793-0.090332,0.112793-0.1923828v-1.5839844c0-0.2080078,0.2431641-0.3129883,0.7285156-0.3129883
+ c0.0185547,0,0.0415039,0.0014648,0.0673828,0.0014648c0.0273438,0,0.0581055,0.0039062,0.09375,0.0039062
+ c0.0019531,0,0.0102539,0,0.0244141,0h0.0239258h0.0463867h0.0693359c0.1699219,0,0.2910156,0.0185547,0.3671875,0.0561523
+ c0.109375,0.0561523,0.1625977,0.1582031,0.1625977,0.3110352v1.5268555c0,0.1420898,0.0712891,0.2133789,0.2128906,0.2133789
+ c0.1401367,0,0.2211914-0.0073242,0.2446289-0.0234375c0.0771484-0.0263672,0.1162109-0.090332,0.1162109-0.1923828v-1.5185547
+ c0-0.168457,0.0839844-0.2792969,0.2519531-0.3291016c0.0756836-0.0229492,0.2290039-0.0400391,0.4609375-0.0493164
+ c0.0019531,0,0.012207,0,0.0317383,0h0.0351562h0.0751953c0.4819336,0,0.7236328,0.1030273,0.7236328,0.3071289v1.5898438
+ c0,0.1020508,0.0390625,0.1660156,0.1162109,0.1923828c0.0234375,0.0161133,0.105957,0.0234375,0.2460938,0.0234375
+ C24.7490234,12.6225586,24.8198242,12.5512695,24.8198242,12.4101562L24.8198242,12.4101562z M30.0795898,12.4101562v-1.527832
+ c0-0.5595703-0.3969727-0.8408203-1.1914062-0.8408203c-0.2954102,0-0.5058594,0.0078125-0.6303711,0.0214844
+ c-0.2373047,0.0297852-0.4360352,0.0961914-0.5976562,0.1972656c-0.1806641-0.1064453-0.3774414-0.1762695-0.5913086-0.2026367
+ c-0.050293-0.0073242-0.1264648-0.0083008-0.2299805-0.012207c-0.1025391-0.0039062-0.2348633-0.0039062-0.3989258-0.0039062
+ c-0.8232422,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832c0,0.1411133,0.0693359,0.2124023,0.2099609,0.2124023
+ c0.1391602,0,0.2207031-0.0073242,0.2441406-0.0234375c0.0751953-0.0263672,0.1137695-0.090332,0.1137695-0.1923828v-1.5839844
+ c0-0.2080078,0.2431641-0.3129883,0.7290039-0.3129883c0.0175781,0,0.0400391,0.0014648,0.0664062,0.0014648
+ c0.0268555,0,0.0576172,0.0039062,0.09375,0.0039062c0.0019531,0,0.0097656,0,0.0249023,0h0.0229492h0.0463867h0.0708008
+ c0.1694336,0,0.2905273,0.0185547,0.3662109,0.0561523c0.109375,0.0561523,0.1640625,0.1582031,0.1640625,0.3110352v1.5268555
+ c0,0.1420898,0.0698242,0.2133789,0.2114258,0.2133789c0.1401367,0,0.2216797-0.0073242,0.2451172-0.0234375
+ c0.0761719-0.0263672,0.1157227-0.090332,0.1157227-0.1923828v-1.5185547c0-0.168457,0.0844727-0.2792969,0.253418-0.3291016
+ c0.0742188-0.0229492,0.2280273-0.0400391,0.4589844-0.0493164c0.0019531,0,0.0126953,0,0.0317383,0h0.0356445h0.0756836
+ c0.4829102,0,0.7226562,0.1030273,0.7226562,0.3071289v1.5898438c0,0.1020508,0.0395508,0.1660156,0.1171875,0.1923828
+ c0.0229492,0.0161133,0.1049805,0.0234375,0.2451172,0.0234375C30.0092773,12.6225586,30.0795898,12.5512695,30.0795898,12.4101562
+ L30.0795898,12.4101562z M34.0786133,11.8505859v-1.5966797c0-0.1411133-0.0703125-0.2124023-0.2114258-0.2124023
+ c-0.1401367,0-0.2226562,0.0048828-0.2456055,0.0161133c-0.0771484,0.0263672-0.1152344,0.0927734-0.1152344,0.1962891v1.6064453
+ c0,0.1928711-0.2661133,0.2875977-0.7978516,0.2875977h-0.8476562c-0.5419922,0-0.8144531-0.0986328-0.8144531-0.2939453
+ v-1.6000977c0-0.1035156-0.0375977-0.1699219-0.112793-0.1962891c-0.0234375-0.0112305-0.1049805-0.0161133-0.2436523-0.0161133
+ c-0.1401367,0-0.2094727,0.0712891-0.2094727,0.2124023v1.5976562c0,0.5126953,0.4589844,0.7709961,1.3798828,0.7709961h0.1206055
+ h0.078125h0.0429688h0.0244141c0.0131836,0,0.0195312,0,0.0214844,0c0.0649414,0.0014648,0.1201172,0.0039062,0.1699219,0.0048828
+ c0.0483398,0,0.0878906,0,0.1171875,0C33.5302734,12.6274414,34.0786133,12.3676758,34.0786133,11.8505859L34.0786133,11.8505859z
+ M37.9907227,12.4101562v-1.6391602c0-0.4858398-0.4277344-0.7294922-1.2851562-0.7294922h-0.9257812
+ c-0.8671875,0-1.2998047,0.2436523-1.2998047,0.7333984v1.6318359c0,0.1020508,0.0380859,0.1660156,0.1123047,0.1923828
+ c0.0234375,0.0161133,0.1049805,0.0234375,0.2446289,0.0234375c0.1401367,0,0.2094727-0.0712891,0.2094727-0.2124023v-1.6391602
+ c0-0.1157227,0.0917969-0.1923828,0.2744141-0.2275391c0.0395508-0.0073242,0.0922852-0.012207,0.1591797-0.0161133
+ c0.0673828-0.0039062,0.1508789-0.0068359,0.2485352-0.0068359h0.9770508c0.1074219,0,0.1953125,0.0024414,0.2661133,0.0043945
+ c0.0712891,0.0024414,0.1230469,0.0073242,0.1572266,0.0151367c0.1933594,0.034668,0.2895508,0.1113281,0.2895508,0.2270508
+ v1.6396484c0,0.1020508,0.0385742,0.1660156,0.1157227,0.1923828c0.0234375,0.0161133,0.1044922,0.0234375,0.2451172,0.0234375
+ C37.9204102,12.6225586,37.9907227,12.5512695,37.9907227,12.4101562L37.9907227,12.4101562z M39.0961914,9.6855469
+ c0-0.0927734-0.0395508-0.1645508-0.1181641-0.2182617c-0.0673828-0.0473633-0.1518555-0.0717773-0.2495117-0.0717773
+ c-0.0996094,0-0.1821289,0.0244141-0.2495117,0.0717773c-0.0795898,0.0537109-0.1186523,0.1254883-0.1186523,0.2182617
+ c0,0.0952148,0.0390625,0.1694336,0.1186523,0.2226562c0.0673828,0.0458984,0.1499023,0.0693359,0.2495117,0.0693359
+ c0.0976562,0,0.1821289-0.0234375,0.2495117-0.0693359C39.0566406,9.8549805,39.0961914,9.7807617,39.0961914,9.6855469
+ L39.0961914,9.6855469z M39.0185547,12.4067383v-2.1679688c0-0.1010742-0.0366211-0.1635742-0.1123047-0.1894531
+ c-0.0239258-0.0151367-0.1035156-0.0205078-0.2407227-0.0205078c-0.1425781,0-0.2138672,0.0703125-0.2138672,0.2099609v2.1679688
+ c0,0.1020508,0.0375977,0.1660156,0.1108398,0.1923828c0.0229492,0.0161133,0.1049805,0.0234375,0.2431641,0.0234375
+ C38.9482422,12.6225586,39.0185547,12.5488281,39.0185547,12.4067383L39.0185547,12.4067383z M41.4208984,10.3276367
+ c0-0.1762695-0.0703125-0.2646484-0.2124023-0.2646484h-0.8974609V9.5546875c0-0.1005859-0.0385742-0.1640625-0.1162109-0.1904297
+ c-0.0229492-0.0151367-0.1030273-0.0234375-0.2407227-0.0234375c-0.140625,0-0.2099609,0.0708008-0.2099609,0.2124023v0.5097656
+ c-0.0751953,0-0.1362305,0.0024414-0.184082,0.0053711c-0.0483398,0.0014648-0.081543,0.0053711-0.1010742,0.0092773
+ c-0.0898438,0.0302734-0.1342773,0.1049805-0.1342773,0.2236328c0,0.1176758,0.0444336,0.1923828,0.1342773,0.222168
+ c0.0195312,0.0039062,0.0527344,0.0078125,0.1010742,0.0087891c0.0478516,0.0039062,0.1088867,0.0053711,0.184082,0.0053711
+ v1.8691406c0,0.0996094,0.0390625,0.1660156,0.1147461,0.1923828c0.0244141,0.0161133,0.1044922,0.0234375,0.2431641,0.0234375
+ s0.2089844-0.0712891,0.2089844-0.2124023v-1.8725586h0.8974609
+ C41.3505859,10.5375977,41.4208984,10.4663086,41.4208984,10.3276367L41.4208984,10.3276367z M45.2436523,12.5825195v-2.3286133
+ c0-0.1035156-0.0375977-0.1699219-0.1113281-0.1962891c-0.0244141-0.0112305-0.1069336-0.0161133-0.2460938-0.0161133
+ c-0.1425781,0-0.2133789,0.0712891-0.2133789,0.2124023v1.8725586h-1.6923828c-0.4760742,0-0.7128906-0.1000977-0.7128906-0.296875
+ v-1.5756836c0-0.1411133-0.0693359-0.2124023-0.2089844-0.2124023s-0.2207031,0.0048828-0.2456055,0.0161133
+ c-0.0742188,0.0263672-0.1118164,0.0927734-0.1118164,0.1938477v1.578125c0,0.5126953,0.425293,0.7695312,1.2792969,0.7695312
+ h1.6923828c0,0.1660156-0.2519531,0.2480469-0.7583008,0.2480469c-0.019043,0-0.0439453-0.0009766-0.0708008-0.0009766
+ c-0.027832,0-0.0615234-0.0014648-0.1010742-0.0039062c-0.0014648,0-0.0102539,0-0.0288086,0h-0.0273438h-0.0449219h-0.0727539
+ c-0.1416016,0-0.2128906,0.0712891-0.2128906,0.2143555c0,0.097168,0.0126953,0.1630859,0.0351562,0.1977539
+ c0.0297852,0.0527344,0.0898438,0.0791016,0.1777344,0.0791016c0.5351562,0,0.8833008-0.0224609,1.0375977-0.0678711
+ C45.0327148,13.159668,45.2436523,12.9316406,45.2436523,12.5825195L45.2436523,12.5825195z M50.8115234,10.9975586
+ c0-0.1625977-0.0742188-0.2441406-0.2231445-0.2441406h-2.855957v-0.6230469c0-0.1987305,0.4013672-0.2983398,1.2050781-0.2983398
+ c0.1401367,0,0.2109375-0.0717773,0.2109375-0.215332c0-0.1835938-0.0708008-0.2758789-0.2109375-0.2758789h-0.4472656
+ c-0.309082,0-0.5908203,0.0532227-0.8500977,0.1621094c-0.3344727,0.1401367-0.5029297,0.3398438-0.5029297,0.6025391v2.3012695
+ c0,0.1020508,0.0424805,0.1660156,0.1289062,0.1923828c0.0229492,0.0161133,0.1098633,0.0234375,0.2563477,0.0234375
+ c0.1381836,0,0.2099609-0.0712891,0.2099609-0.2124023v-1.1665039h2.855957
+ C50.7373047,11.2436523,50.8115234,11.1616211,50.8115234,10.9975586L50.8115234,10.9975586z M52.4326172,10.3100586
+ c0-0.1796875-0.0712891-0.2685547-0.2128906-0.2685547c-0.4179688,0-0.7324219,0.0375977-0.9428711,0.1123047
+ c-0.347168,0.1210938-0.519043,0.3486328-0.519043,0.6860352v1.5668945c0,0.1445312,0.0668945,0.2158203,0.2026367,0.2158203
+ c0.1323242,0,0.2128906-0.0063477,0.2446289-0.0161133c0.0805664-0.0288086,0.1191406-0.0922852,0.1191406-0.1972656v-1.5693359
+ c0-0.2163086,0.2182617-0.324707,0.6533203-0.324707c0.0239258,0,0.0571289,0.0014648,0.1010742,0.0039062
+ c0.0444336,0.0014648,0.078125,0.0014648,0.1010742,0.0014648C52.3466797,10.5205078,52.4326172,10.4511719,52.4326172,10.3100586
+ L52.4326172,10.3100586z M56.5,11.8466797v-1.0117188c0-0.3500977-0.2060547-0.5810547-0.6171875-0.6982422
+ c-0.2416992-0.0654297-0.5878906-0.0952148-1.0400391-0.0952148c-0.1411133,0-0.2094727,0.0698242-0.2094727,0.2099609
+ c0,0.1762695,0.0683594,0.2636719,0.2094727,0.2636719h0.0673828h0.0424805h0.0244141c0.0136719,0,0.0224609,0,0.0263672,0
+ c0.0361328,0,0.0673828-0.0039062,0.0947266-0.0039062s0.0527344-0.0014648,0.0712891-0.0014648
+ c0.4824219,0,0.7397461,0.0932617,0.769043,0.277832H53.9375c-0.3105469,0-0.5698242,0.0488281-0.7744141,0.1533203
+ c-0.277832,0.1357422-0.4174805,0.3374023-0.4174805,0.6044922v0.3305664c0,0.2480469,0.1479492,0.4418945,0.4389648,0.5830078
+ c0.2167969,0.109375,0.4726562,0.1635742,0.7705078,0.1635742h1.3862305C56.1132812,12.6225586,56.5,12.3642578,56.5,11.8466797
+ L56.5,11.8466797z M55.9448242,11.7128906c0,0.1938477-0.0546875,0.3173828-0.1660156,0.3720703
+ c-0.0776367,0.0415039-0.222168,0.0629883-0.4350586,0.0629883h-1.4047852c-0.1401367,0-0.265625-0.0205078-0.3735352-0.0585938
+ c-0.1674805-0.050293-0.2514648-0.1235352-0.2514648-0.21875v-0.3276367c0-0.0898438,0.081543-0.1621094,0.2426758-0.2172852
+ c0.1264648-0.0449219,0.2470703-0.065918,0.3657227-0.065918h2.0097656c0,0.0249023,0,0.0571289,0.0014648,0.0947266
+ c0.0024414,0.0375977,0.0024414,0.0810547,0.0048828,0.1323242c0,0.050293,0.0024414,0.0952148,0.0039062,0.1323242
+ C55.9423828,11.6572266,55.9448242,11.6879883,55.9448242,11.7128906L55.9448242,11.7128906z M61.7548828,12.4101562v-1.527832
+ c0-0.5595703-0.3979492-0.8408203-1.1904297-0.8408203c-0.2973633,0-0.5068359,0.0078125-0.6323242,0.0214844
+ c-0.2353516,0.0297852-0.4360352,0.0961914-0.5961914,0.1972656c-0.1801758-0.1064453-0.3779297-0.1762695-0.5932617-0.2026367
+ c-0.0473633-0.0073242-0.1259766-0.0083008-0.2265625-0.012207c-0.1054688-0.0039062-0.2373047-0.0039062-0.4003906-0.0039062
+ c-0.8242188,0-1.2363281,0.28125-1.2363281,0.8408203v1.527832c0,0.1411133,0.0693359,0.2124023,0.2104492,0.2124023
+ c0.1386719,0,0.2192383-0.0073242,0.2441406-0.0234375c0.074707-0.0263672,0.1118164-0.090332,0.1118164-0.1923828v-1.5839844
+ c0-0.2080078,0.2431641-0.3129883,0.7294922-0.3129883c0.0170898,0,0.0415039,0.0014648,0.0673828,0.0014648
+ c0.0263672,0,0.0585938,0.0039062,0.0947266,0.0039062c0.0009766,0,0.0097656,0,0.0224609,0h0.0249023h0.0463867h0.0683594
+ c0.1694336,0,0.2915039,0.0185547,0.3676758,0.0561523c0.1083984,0.0561523,0.1635742,0.1582031,0.1635742,0.3110352v1.5268555
+ c0,0.1420898,0.0708008,0.2133789,0.2109375,0.2133789c0.140625,0,0.2216797-0.0073242,0.2456055-0.0234375
+ c0.078125-0.0263672,0.1166992-0.090332,0.1166992-0.1923828v-1.5185547c0-0.168457,0.0839844-0.2792969,0.2524414-0.3291016
+ c0.0742188-0.0229492,0.2294922-0.0400391,0.4594727-0.0493164c0.0009766,0,0.012207,0,0.0341797,0h0.0336914h0.0751953
+ c0.4833984,0,0.722168,0.1030273,0.722168,0.3071289v1.5898438c0,0.1020508,0.0395508,0.1660156,0.1176758,0.1923828
+ c0.0234375,0.0161133,0.1040039,0.0234375,0.2451172,0.0234375C61.6831055,12.6225586,61.7548828,12.5512695,61.7548828,12.4101562
+ L61.7548828,12.4101562z M65.6176758,11.3735352v-0.6225586c0-0.2524414-0.1376953-0.440918-0.4057617-0.5668945
+ c-0.1943359-0.1000977-0.4404297-0.1474609-0.737793-0.1474609h-1.0561523c-0.3637695,0-0.6547852,0.0512695-0.8754883,0.15625
+ c-0.3203125,0.1420898-0.480957,0.3637695-0.480957,0.6616211v0.949707c0,0.2197266,0.1040039,0.4121094,0.3139648,0.5761719
+ c0.1464844,0.1137695,0.3759766,0.1879883,0.6855469,0.21875c0.0625,0.0083008,0.1552734,0.0161133,0.2768555,0.0170898
+ c0.1186523,0.0039062,0.2758789,0.0063477,0.465332,0.0063477c0.1396484,0,0.2094727-0.0712891,0.2094727-0.2124023
+ c0-0.1757812-0.0698242-0.262207-0.2094727-0.262207c-0.184082,0-0.3354492-0.003418-0.4560547-0.012207
+ c-0.1171875-0.0083008-0.2099609-0.0205078-0.2719727-0.0327148c-0.2866211-0.0727539-0.4287109-0.2294922-0.4287109-0.4760742
+ v-0.0185547h2.8125C65.5634766,11.6083984,65.6176758,11.5307617,65.6176758,11.3735352L65.6176758,11.3735352z
+ M65.0600586,11.1166992H62.628418v-0.2978516c0-0.1313477,0.1191406-0.2202148,0.3569336-0.2651367
+ c0.1660156-0.0332031,0.4750977-0.050293,0.9277344-0.050293c0.765625,0,1.1469727,0.0996094,1.1469727,0.2939453V11.1166992
+ L65.0600586,11.1166992z M70.9165039,10.2138672c0-0.1225586-0.0898438-0.1850586-0.269043-0.1850586
+ c-0.1552734,0-0.2548828,0.0424805-0.2988281,0.1264648l-0.8676758,1.6845703l-0.8486328-1.5722656
+ c-0.0673828-0.1225586-0.1757812-0.1845703-0.3237305-0.1845703c-0.1513672,0-0.2597656,0.0620117-0.3261719,0.1884766
+ l-0.8505859,1.5683594l-0.8691406-1.6845703c-0.0483398-0.0839844-0.1464844-0.1264648-0.3012695-0.1264648
+ c-0.1757812,0-0.2670898,0.0625-0.2670898,0.1850586c0,0.0200195,0.0131836,0.0649414,0.0400391,0.1337891l1.0273438,2.043457
+ c0.0600586,0.1240234,0.1796875,0.1865234,0.3520508,0.1865234c0.168457,0,0.2822266-0.0585938,0.3476562-0.1772461
+ l0.847168-1.5742188l0.8369141,1.5717773c0.0639648,0.1162109,0.1762695,0.1748047,0.3354492,0.1748047
+ c0.1689453,0,0.2832031-0.0610352,0.3442383-0.1816406l1.0512695-2.0424805
+ C70.902832,10.2973633,70.9165039,10.2539062,70.9165039,10.2138672L70.9165039,10.2138672z M74.6005859,11.8203125v-0.9550781
+ c0-0.550293-0.4189453-0.8237305-1.2558594-0.8237305h-0.9448242c-0.3369141,0-0.6166992,0.0576172-0.8461914,0.1723633
+ c-0.3081055,0.1474609-0.4628906,0.3657227-0.4628906,0.6572266v0.9492188c0,0.2875977,0.1557617,0.5039062,0.4667969,0.6435547
+ c0.2509766,0.1049805,0.534668,0.1586914,0.8447266,0.1586914h0.9423828c0.3422852,0,0.6166992-0.0537109,0.8222656-0.1572266
+ C74.4560547,12.3291016,74.6005859,12.1152344,74.6005859,11.8203125L74.6005859,11.8203125z M74.027832,11.8217773
+ c0,0.1162109-0.0908203,0.2021484-0.2739258,0.2607422c-0.1308594,0.0439453-0.2729492,0.0654297-0.4208984,0.0654297h-0.921875
+ c-0.1743164,0-0.3291016-0.019043-0.4575195-0.0571289c-0.1972656-0.0581055-0.2973633-0.1469727-0.2973633-0.269043v-0.9506836
+ c0-0.1269531,0.0976562-0.222168,0.2910156-0.2851562c0.1347656-0.0424805,0.2895508-0.0654297,0.4614258-0.0654297h0.9213867
+ c0.4672852,0,0.6977539,0.1030273,0.6977539,0.3071289V11.8217773L74.027832,11.8217773z M76.5820312,10.3100586
+ c0-0.1796875-0.0693359-0.2685547-0.2104492-0.2685547c-0.418457,0-0.7333984,0.0375977-0.9458008,0.1123047
+ c-0.3457031,0.1210938-0.5166016,0.3486328-0.5166016,0.6860352v1.5668945c0,0.1445312,0.0664062,0.2158203,0.2011719,0.2158203
+ c0.1333008,0,0.2148438-0.0063477,0.2470703-0.0161133c0.0776367-0.0288086,0.1166992-0.0922852,0.1166992-0.1972656v-1.5693359
+ c0-0.2163086,0.2177734-0.324707,0.6538086-0.324707c0.0224609,0,0.0561523,0.0014648,0.1010742,0.0039062
+ c0.043457,0.0014648,0.0776367,0.0014648,0.1005859,0.0014648C76.4980469,10.5205078,76.5820312,10.4511719,76.5820312,10.3100586
+ L76.5820312,10.3100586z M79.909668,12.4228516c0-0.0888672-0.0473633-0.15625-0.1459961-0.2036133l-1.7768555-0.8935547
+ l1.7373047-0.8657227c0.0957031-0.0488281,0.144043-0.1162109,0.144043-0.2036133
+ c0-0.128418-0.0800781-0.1948242-0.2387695-0.1948242c-0.1230469,0-0.2099609,0.0068359-0.2573242,0.0214844l-1.9106445,0.9580078
+ h-0.0029297V9.5507812c0-0.1030273-0.0380859-0.168457-0.1098633-0.1914062
+ c-0.0297852-0.0126953-0.1123047-0.0185547-0.2416992-0.0185547c-0.1401367,0-0.2114258,0.0708008-0.2114258,0.2099609v2.859375
+ c0,0.1411133,0.0712891,0.2124023,0.2114258,0.2124023c0.1352539,0,0.2158203-0.0073242,0.237793-0.0234375
+ c0.0742188-0.0263672,0.1137695-0.0927734,0.1137695-0.1923828v-0.7797852l1.9360352,0.972168
+ c0.0336914,0.0161133,0.1240234,0.0234375,0.2758789,0.0234375C79.8291016,12.6225586,79.909668,12.5551758,79.909668,12.4228516
+ L79.909668,12.4228516z M82,8.6796875V8.1425781c0-0.0795898-0.0385742-0.1186523-0.1171875-0.1186523
+ c-0.0214844,0-0.0410156,0.0048828-0.0585938,0.0112305c-0.015625,0.0097656-0.0322266,0.0224609-0.0458984,0.0371094
+ l-0.3515625,0.4414062l-0.3603516-0.4384766c-0.0258789-0.0341797-0.0629883-0.0512695-0.1049805-0.0512695h-0.7661133
+ c-0.0390625,0-0.0639648,0.0146484-0.0776367,0.0439453c-0.0087891,0.0131836-0.0151367,0.0371094-0.0151367,0.065918
+ c0,0.0629883,0.0327148,0.09375,0.0927734,0.09375h0.1992188v0.4521484c0,0.0249023,0.0048828,0.0439453,0.0141602,0.059082
+ c0.0107422,0.0131836,0.0258789,0.0258789,0.050293,0.03125c0.0039062,0.0024414,0.0112305,0.003418,0.0200195,0.003418
+ s0.0234375,0,0.0410156,0c0.03125,0,0.0537109-0.0063477,0.0693359-0.0229492
+ c0.0146484-0.0141602,0.0205078-0.0400391,0.0205078-0.0708008V8.2275391h0.2348633v0.4521484
+ c0,0.0463867,0.0234375,0.0756836,0.065918,0.090332c0.003418,0.0024414,0.012207,0.003418,0.0209961,0.003418
+ c0.0112305,0,0.0234375,0,0.0410156,0c0.0600586,0,0.090332-0.0297852,0.090332-0.09375V8.4082031l0.2529297,0.3178711
+ c0.0273438,0.0332031,0.0634766,0.0512695,0.1108398,0.0512695c0.0458984,0,0.0834961-0.0180664,0.1123047-0.0512695
+ l0.2426758-0.3071289v0.2607422c0,0.0639648,0.0307617,0.09375,0.0913086,0.09375h0.0380859c0.0039062,0,0.0053711,0,0.0087891,0
+ c0.0039062,0,0.0078125-0.0009766,0.0102539-0.003418C81.9760742,8.7553711,82,8.7260742,82,8.6796875L82,8.6796875z
+ M10.1689453,9.0756836c-0.6611328,2.0117188-1.2885742,2.6499023-3.7602539,3.3994141
+ C7.5439453,10.1674805,8.2143555,9.5195312,10.1689453,9.0756836L10.1689453,9.0756836z M10.4858398,8.7475586H5.2431641
+ c-0.9643555,0-1.7470703,0.7841797-1.7470703,1.7509766v3.5019531h5.2426758c0.965332,0,1.7470703-0.7822266,1.7470703-1.75
+ V8.7475586L10.4858398,8.7475586z M4.9526367,2.9604492c2.6518555,0.5991211,3.5625,1.4804688,5.1035156,4.6108398
+ C6.7021484,6.5551758,5.8486328,5.6879883,4.9526367,2.9604492L4.9526367,2.9604492z M10.4858398,3.3769531
+ C10.4858398,2.0639648,9.425293,1,8.1142578,1H1v4.7529297c0,1.3115234,1.0625,2.3769531,2.371582,2.3769531h7.1142578V3.3769531
+ L10.4858398,3.3769531z M14.3266602,5.0581055c-0.5327148,1.6206055-1.0395508,2.1362305-3.0317383,2.7392578
+ C12.2099609,5.9379883,12.7504883,5.4140625,14.3266602,5.0581055L14.3266602,5.0581055z M11.1020508,5.3056641v2.8242188
+ h4.2275391c0.7783203,0,1.409668-0.6333008,1.409668-1.4121094v-2.824707H12.512207
+ C11.7338867,3.8930664,11.1020508,4.5253906,11.1020508,5.3056641L11.1020508,5.3056641z"/>
+ </g>
+</svg>
-<?php\r
-/**\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @category Community Framework\r
- */\r
-require_once('./global.php');\r
+<?php
+/**
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @category Community Framework
+ */
+require_once('./global.php');
wcf\system\request\RequestHandler::getInstance()->handle('wcf', true);
-<?php\r
-namespace wcf\acp;\r
-use wcf\data\language\LanguageEditor;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\template\ACPTemplateEngine;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @category Community Framework\r
- */\r
-// make group names to language variables\r
-$groupNames = array(\r
- 'Everyone' => WCF::getLanguage()->get('wcf.acp.group.everyone'),\r
- 'Guests' => WCF::getLanguage()->get('wcf.acp.group.guests'),\r
- 'Users' => WCF::getLanguage()->get('wcf.acp.group.users'),\r
- 'Administrators' => WCF::getLanguage()->get('wcf.acp.group.administrators'),\r
- 'Moderators' => WCF::getLanguage()->get('wcf.acp.group.moderators'),\r
- 'Super Moderators' => WCF::getLanguage()->get('wcf.acp.group.superModerators')\r
-);\r
-\r
-$sql = "UPDATE wcf".WCF_N."_user_group\r
- SET groupName = ?\r
- WHERE groupName = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-foreach ($groupNames as $oldValue => $newValue) {\r
- $statement->execute(array($newValue, $oldValue));\r
-}\r
-\r
-// change the priority of the PIP's to "1"\r
-$sql = "UPDATE wcf".WCF_N."_package_installation_plugin\r
- SET priority = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// change group options from admin group to true\r
-$sql = "UPDATE wcf".WCF_N."_user_group_option_value\r
- SET optionValue = ?\r
- WHERE groupID = ?\r
- AND optionValue = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1, 4, '0'));\r
-\r
-// update accessible groups\r
-$sql = "UPDATE wcf".WCF_N."_user_group_option_value\r
- SET optionValue = ?\r
- WHERE groupID = ?\r
- AND optionValue = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array('1,2,3,4,5,6', 4, ''));\r
-\r
-// reset sessions\r
-SessionHandler::resetSessions();\r
-\r
-// update acp session\r
-$sql = "UPDATE wcf".WCF_N."_acp_session\r
- SET packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// update acp templates\r
-$sql = "UPDATE wcf".WCF_N."_acp_template\r
- SET packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// update language\r
-$sql = "UPDATE wcf".WCF_N."_language_item\r
- SET packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-$sql = "UPDATE wcf".WCF_N."_language_to_package\r
- SET packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// update installation logs\r
-$sql = "UPDATE wcf".WCF_N."_package_installation_file_log\r
- SET packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-$sql = "UPDATE wcf".WCF_N."_package_installation_sql_log\r
- SET packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// update pips\r
-$sql = "UPDATE wcf".WCF_N."_package_installation_plugin\r
- SET packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// group options\r
-$sql = "UPDATE wcf".WCF_N."_user_group_option\r
- SET packageID = ?";\r
-$statement = WCF::getDB()->prepareStatement($sql);\r
-$statement->execute(array(1));\r
-\r
-// reset all caches\r
-CacheHandler::getInstance()->clear(WCF_DIR.'cache/', '*');\r
-\r
-// delete language files\r
-LanguageEditor::deleteLanguageFiles();\r
-\r
-// delete all compiled templates\r
+<?php
+namespace wcf\acp;
+use wcf\data\language\LanguageEditor;
+use wcf\system\cache\CacheHandler;
+use wcf\system\session\SessionHandler;
+use wcf\system\template\ACPTemplateEngine;
+use wcf\system\WCF;
+
+/**
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @category Community Framework
+ */
+// make group names to language variables
+$groupNames = array(
+ 'Everyone' => WCF::getLanguage()->get('wcf.acp.group.everyone'),
+ 'Guests' => WCF::getLanguage()->get('wcf.acp.group.guests'),
+ 'Users' => WCF::getLanguage()->get('wcf.acp.group.users'),
+ 'Administrators' => WCF::getLanguage()->get('wcf.acp.group.administrators'),
+ 'Moderators' => WCF::getLanguage()->get('wcf.acp.group.moderators'),
+ 'Super Moderators' => WCF::getLanguage()->get('wcf.acp.group.superModerators')
+);
+
+$sql = "UPDATE wcf".WCF_N."_user_group
+ SET groupName = ?
+ WHERE groupName = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+foreach ($groupNames as $oldValue => $newValue) {
+ $statement->execute(array($newValue, $oldValue));
+}
+
+// change the priority of the PIP's to "1"
+$sql = "UPDATE wcf".WCF_N."_package_installation_plugin
+ SET priority = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// change group options from admin group to true
+$sql = "UPDATE wcf".WCF_N."_user_group_option_value
+ SET optionValue = ?
+ WHERE groupID = ?
+ AND optionValue = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1, 4, '0'));
+
+// update accessible groups
+$sql = "UPDATE wcf".WCF_N."_user_group_option_value
+ SET optionValue = ?
+ WHERE groupID = ?
+ AND optionValue = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array('1,2,3,4,5,6', 4, ''));
+
+// reset sessions
+SessionHandler::resetSessions();
+
+// update acp session
+$sql = "UPDATE wcf".WCF_N."_acp_session
+ SET packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// update acp templates
+$sql = "UPDATE wcf".WCF_N."_acp_template
+ SET packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// update language
+$sql = "UPDATE wcf".WCF_N."_language_item
+ SET packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+$sql = "UPDATE wcf".WCF_N."_language_to_package
+ SET packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// update installation logs
+$sql = "UPDATE wcf".WCF_N."_package_installation_file_log
+ SET packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+$sql = "UPDATE wcf".WCF_N."_package_installation_sql_log
+ SET packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// update pips
+$sql = "UPDATE wcf".WCF_N."_package_installation_plugin
+ SET packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// group options
+$sql = "UPDATE wcf".WCF_N."_user_group_option
+ SET packageID = ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute(array(1));
+
+// reset all caches
+CacheHandler::getInstance()->clear(WCF_DIR.'cache/', '*');
+
+// delete language files
+LanguageEditor::deleteLanguageFiles();
+
+// delete all compiled templates
ACPTemplateEngine::deleteCompiledTemplates(WCF_DIR.'acp/templates/compiled/');
-/**\r
- * Class and function collection for WCF ACP\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-\r
-/**\r
- * Initialize WCF.ACP namespace\r
- */\r
-WCF.ACP = {};\r
-\r
-/**\r
- * Handles ACPMenu.\r
- *\r
- * @param array activeMenuItems\r
- */\r
-WCF.ACP.Menu = function(activeMenuItems) { this.init(activeMenuItems); };\r
-WCF.ACP.Menu.prototype = {\r
- /**\r
- * Initializes ACPMenu.\r
- *\r
- * @param array activeMenuItems\r
- */\r
- init: function(activeMenuItems) {\r
- this._headerNavigation = $('nav#mainMenu');\r
- this._sidebarNavigation = $('nav#sidebarMenu');\r
- \r
- this._prepareElements(activeMenuItems);\r
- },\r
- \r
- /**\r
- * Resets all elements and binds event listeners.\r
- */\r
- _prepareElements: function(activeMenuItems) {\r
- this._headerNavigation.find('li').removeClass('activeMenuItem');\r
- \r
- this._sidebarNavigation.find('div h1').each($.proxy(function(index, menuHeader) {\r
- $(menuHeader).click($.proxy(this._toggleItem, this));\r
- }, this));\r
- \r
- // close all navigation groups\r
- this._sidebarNavigation.find('div div').each(function() {\r
- $(this).hide();\r
- });\r
- \r
- this._headerNavigation.find('li').click($.proxy(this._toggleSidebar, this));\r
- \r
- if (activeMenuItems.length === 0) {\r
- this._renderSidebar(this._headerNavigation.find('li:first').data('menuItem'), []);\r
- }\r
- else {\r
- this._renderSidebar('', activeMenuItems);\r
- }\r
- },\r
- \r
- /**\r
- * Toggles a navigation group entry.\r
- */\r
- _toggleItem: function(event) {\r
- var $menuItem = $(event.target);\r
- \r
- $menuItem.next().stop(true, true).toggle('blind', { }, 200).end().toggleClass('activeMenuItem');\r
- },\r
- \r
- /**\r
- * Handles clicks on main menu.\r
- *\r
- * @param object event\r
- */\r
- _toggleSidebar: function(event) {\r
- if ($(event.target).hasClass('activeMenuItem')) {\r
- return;\r
- }\r
- \r
- this._renderSidebar($(event.target).data('menuItem'), []);\r
- },\r
- \r
- /**\r
- * Renders sidebar including highlighting of currently active menu items.\r
- *\r
- * @param string menuItem\r
- * @param array activeMenuItems\r
- */\r
- _renderSidebar: function(menuItem, activeMenuItems) {\r
- // reset visible and active items\r
- this._headerNavigation.find('li').removeClass('activeMenuItem');\r
- this._sidebarNavigation.find('div.menuContainer').hide();\r
- \r
- if (activeMenuItems.length === 0) {\r
- // show active menu\r
- this._headerNavigation.find('li[data-menuItem="' + menuItem + '"]').addClass('activeMenuItem');\r
- this._sidebarNavigation.find('div[data-parentMenuItem="' + menuItem + '"]').show();\r
- }\r
- else {\r
- // open menu by active menu items, first element is always a head navigation item\r
- menuItem = activeMenuItems.shift();\r
- \r
- this._headerNavigation.find('li[data-menuItem="' + menuItem + '"]').addClass('activeMenuItem');\r
- this._sidebarNavigation.find('div[data-parentMenuItem="' + menuItem + '"]').show();\r
- \r
- for (var $i = 0, $size = activeMenuItems.length; $i < $size; $i++) {\r
- var $item = activeMenuItems[$i];\r
- \r
- if ($.wcfIsset($item)) {\r
- var $menuItem = $('#' + $.wcfEscapeID($item));\r
- \r
- if ($menuItem.getTagName() === 'ul') {\r
- $menuItem.parent('div').show().prev().addClass('activeMenuItem');\r
- }\r
- else {\r
- $menuItem.addClass('activeMenuItem');\r
- }\r
- }\r
- }\r
- }\r
- }\r
-};\r
-\r
-/**\r
- * Handles package installation dialog.\r
- * \r
- * @param string actionName\r
- * @param integer queueID\r
- * @param boolean initialize\r
- */\r
-WCF.ACP.PackageInstallation = function(actionName, queueID, initialize) { this.init(actionName, queueID, initialize); };\r
-WCF.ACP.PackageInstallation.prototype = {\r
- /**\r
- * package installation type\r
- * \r
- * @var string\r
- */\r
- _actionName: '',\r
- \r
- /**\r
- * package installation dialog\r
- *\r
- * @var object\r
- */\r
- _dialog: null,\r
- \r
- /**\r
- * queue id\r
- *\r
- * @var integer\r
- */\r
- _queueID: 0,\r
- \r
- /**\r
- * Initializes package installation.\r
- * \r
- * @param string actionName\r
- * @param integer queueID\r
- * @param boolean initialize\r
- */\r
- init: function(actionName, queueID, initialize) {\r
- this._actionName = WCF.String.ucfirst(actionName) + 'Package';\r
- this._queueID = queueID;\r
- \r
- if (initialize) {\r
- $('#submitButton').click($.proxy(function(event) {\r
- this.prepareInstallation();\r
- return false;\r
- }, this));\r
- }\r
- },\r
- \r
- /**\r
- * Prepares installation dialog.\r
- */\r
- prepareInstallation: function() {\r
- WCF.showAJAXDialog('packageInstallationDialog', true, {\r
- ajax: {\r
- url: 'index.php?action=' + this._actionName + '&t=' + SECURITY_TOKEN + SID_ARG_2ND,\r
- type: 'POST',\r
- data: { queueID: this._queueID, step: 'prepare' },\r
- success: $.proxy(this._handleResponse, this)\r
- },\r
- preventClose: true,\r
- hideTitle: true\r
- });\r
- },\r
- \r
- /**\r
- * Executes response instructions.\r
- */\r
- _handleResponse: function() {\r
- if (this._dialog == null) {\r
- this._dialog = $('#packageInstallationDialog');\r
- }\r
- \r
- var $data = this._dialog.data('responseData');\r
- \r
- // receive new queue id\r
- if ($data.queueID) {\r
- this._queueID = $data.queueID;\r
- }\r
- \r
- // update progress\r
- if ($data.progress) {\r
- $('#packageInstallationProgress').attr('value', $data.progress).text($data.progress + '%');\r
- }\r
- \r
- // handle success\r
- if ($data.step == 'success') {\r
- var $id = WCF.getRandomID();\r
- $('#packageInstallationInnerContent').append('<div class="formSubmit"><input type="button" id="' + $id + '" value="Weiter" /></div>');\r
- \r
- $('#' + $id).click($.proxy(function() {\r
- window.location.href = "index.php?page=PackageList" + SID_ARG_2ND;\r
- }, this));\r
- \r
- $('#packageInstallationInnerContentContainer').wcfBlindIn();\r
- \r
- return;\r
- }\r
- \r
- // update template\r
- if ($data.template && !$data.ignoreTemplate) {\r
- this._dialog.html($data.template);\r
- }\r
- \r
- // update action\r
- if ($data.currentAction) {\r
- $('#packageInstallationAction').text($data.currentAction);\r
- }\r
- \r
- // handle inner template\r
- if ($data.innerTemplate) {\r
- $('#packageInstallationInnerContent').html($data.innerTemplate);\r
- \r
- // create button to handle next step\r
- if ($data.step && $data.node) {\r
- var $id = WCF.getRandomID();\r
- $('#packageInstallationInnerContent').append('<div class="formSubmit"><input type="button" id="' + $id + '" value="Weiter" /></div>');\r
- \r
- $('#' + $id).click($.proxy(function() {\r
- // collect form values\r
- var $additionalData = {};\r
- $('#packageInstallationInnerContent').find('input').each(function(index, inputElement) {\r
- $additionalData[$(inputElement).attr('name')] = $(inputElement).attr('value');\r
- });\r
- \r
- this._executeStep($data.step, $data.node, $additionalData);\r
- }, this));\r
- }\r
- \r
- $('#packageInstallationInnerContentContainer').wcfBlindIn();\r
- \r
- this._dialog.wcfDialog('redraw');\r
- return;\r
- }\r
- \r
- // purge content\r
- if ($('#packageInstallationInnerContent').children().length > 1) {\r
- $('#packageInstallationInnerContentContainer').wcfBlindOut('down', $.proxy(function() {\r
- $('#packageInstallationInnerContent').empty();\r
- this._dialog.wcfDialog('redraw');\r
- \r
- // execute next step\r
- if ($data.step && $data.node) {\r
- this._executeStep($data.step, $data.node);\r
- }\r
- }, this));\r
- }\r
- else {\r
- // execute next step\r
- if ($data.step && $data.node) {\r
- this._executeStep($data.step, $data.node);\r
- }\r
- }\r
- },\r
- \r
- /**\r
- * Executes the next installation step.\r
- * \r
- * @param string step\r
- * @param string node\r
- * @param object additionalData\r
- */\r
- _executeStep: function(step, node, additionalData) {\r
- if (!additionalData) additionalData = {};\r
- \r
- var $data = $.extend({\r
- node: node,\r
- queueID: this._queueID,\r
- step: step\r
- }, additionalData);\r
- \r
- $.ajax({\r
- url: 'index.php?action=' + this._actionName + '&t=' + SECURITY_TOKEN + SID_ARG_2ND,\r
- dataType: 'json',\r
- type: 'POST',\r
- data: $data,\r
- success: $.proxy(function(data) {\r
- this._dialog.data('responseData', data);\r
- this._handleResponse();\r
- }, this),\r
- error: function(transport) {\r
- alert(transport.responseText);\r
- }\r
- });\r
- }\r
-};\r
-\r
-/**\r
- * Handles package uninstallation.\r
- * \r
- * @param jQuery elements\r
- */\r
-WCF.ACP.PackageUninstallation = function(elements) { this.init(elements); };\r
-WCF.ACP.PackageUninstallation.prototype = {\r
- /**\r
- * WCF.ACP.PackageInstallation object\r
- * \r
- * @var WCF.ACP.PackageInstallation\r
- */\r
- _installation: null,\r
- \r
- /**\r
- * Initializes package uninstallation.\r
- * \r
- * @param jQuery elements\r
- */\r
- init: function(elements) {\r
- if (elements.length == 0) return;\r
- \r
- // bind event listener\r
- elements.each($.proxy(function(index, element) {\r
- $(element).click($.proxy(this._createQueue, this));\r
- }, this));\r
- },\r
- \r
- /**\r
- * Creates a new package uninstallation process.\r
- * \r
- * @param object event\r
- */\r
- _createQueue: function(event) {\r
- var packageID = $(event.target).data('objectID');\r
- \r
- this._installation = new WCF.ACP.PackageInstallation('uninstall', 0, false);\r
- \r
- // initialize dialog\r
- WCF.showAJAXDialog('packageInstallationDialog', true, {\r
- ajax: {\r
- url: 'index.php?action=UninstallPackage&t=' + SECURITY_TOKEN + SID_ARG_2ND,\r
- type: 'POST',\r
- data: { packageID: packageID, step: 'prepare' },\r
- success: $.proxy(this._installation._handleResponse, this._installation)\r
- },\r
- preventClose: true,\r
- hideTitle: true\r
- });\r
- }\r
-};\r
-\r
-/**\r
- * Handles option selection.\r
- */\r
-WCF.ACP.Options = function() { this.init(); };\r
-WCF.ACP.Options.prototype = {\r
- /**\r
- * Initializes options.\r
- */\r
- init: function() {\r
- $('.enablesOptions').each($.proxy(this._initOption, this));\r
- },\r
- \r
- /**\r
- * Initializes an option.\r
- * \r
- * @param integer index\r
- * @param object option\r
- */\r
- _initOption: function(index, option) {\r
- // execute action on init\r
- this._change(option);\r
- \r
- // bind event listener\r
- $(option).change($.proxy(this._handleChange, this));\r
- },\r
- \r
- /**\r
- * Applies whenever an option is changed.\r
- * \r
- * @param object event\r
- */\r
- _handleChange: function(event) {\r
- this._change($(event.target));\r
- },\r
- \r
- /**\r
- * Enables or disables options on option value change.\r
- * \r
- * @param object option\r
- */\r
- _change: function(option) {\r
- option = $(option);\r
- \r
- var $disableOptions = eval(option.data('disableOptions'));\r
- var $enableOptions = eval(option.data('enableOptions'));\r
- \r
- // determine action by type\r
- switch(option.getTagName()) {\r
- case 'input':\r
- switch(option.attr('type')) {\r
- case 'checkbox':\r
- this._execute(option.attr('checked'), $disableOptions, $enableOptions);\r
- break;\r
- \r
- case 'radio':\r
- if (option.attr('checked')) {\r
- this._execute(true, $disableOptions, $enableOptions);\r
- }\r
- break;\r
- }\r
- break;\r
- \r
- case 'select':\r
- var $value = option.val();\r
- var $disableOptions = $enableOptions = [];\r
- \r
- if (option.data('disableOptions').length > 0) {\r
- for (var $index in option.data('disableOptions')) {\r
- var $item = option.data('disableOptions')[$index];\r
- \r
- if ($item.value == $value) {\r
- $disableOptions.push($item.option);\r
- }\r
- }\r
- }\r
- \r
- if (option.data('enableOptions').length > 0) {\r
- for (var $index in option.data('enableOptions')) {\r
- var $item = option.data('enableOptions')[$index];\r
- \r
- if ($item.value == $value) {\r
- $enableOptions.push($item.option);\r
- }\r
- }\r
- }\r
- \r
- this._execute(true, $disableOptions, $enableOptions);\r
- break;\r
- }\r
- },\r
- \r
- /**\r
- * Enables or disables options.\r
- * \r
- * @param boolean isActive\r
- * @param array disableOptions\r
- * @param array enableOptions\r
- */\r
- _execute: function(isActive, disableOptions, enableOptions) {\r
- if (disableOptions.length > 0) {\r
- for (var $i = 0, $size = disableOptions.length; $i < $size; $i++) {\r
- var $target = disableOptions[$i];\r
- if ($.wcfIsset($target)) {\r
- if (isActive) {\r
- $('#' + $.wcfEscapeID($target)).disable().closest('dl').addClass('disabled');\r
- }\r
- else {\r
- $('#' + $.wcfEscapeID($target)).enable().closest('dl').removeClass('disabled');\r
- }\r
- }\r
- }\r
- }\r
- \r
- if (enableOptions.length > 0) {\r
- for (var $i = 0, $size = enableOptions.length; $i < $size; $i++) {\r
- var $target = enableOptions[$i];\r
- if ($.wcfIsset($target)) {\r
- if (isActive) {\r
- $('#' + $.wcfEscapeID($target)).enable().closest('dl').removeClass('disabled');\r
- }\r
- else {\r
- $('#' + $.wcfEscapeID($target)).disable().closest('dl').addClass('disabled');\r
- }\r
- }\r
- }\r
- }\r
- }\r
+/**
+ * Class and function collection for WCF ACP
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+
+/**
+ * Initialize WCF.ACP namespace
+ */
+WCF.ACP = {};
+
+/**
+ * Handles ACPMenu.
+ *
+ * @param array activeMenuItems
+ */
+WCF.ACP.Menu = function(activeMenuItems) { this.init(activeMenuItems); };
+WCF.ACP.Menu.prototype = {
+ /**
+ * Initializes ACPMenu.
+ *
+ * @param array activeMenuItems
+ */
+ init: function(activeMenuItems) {
+ this._headerNavigation = $('nav#mainMenu');
+ this._sidebarNavigation = $('nav#sidebarMenu');
+
+ this._prepareElements(activeMenuItems);
+ },
+
+ /**
+ * Resets all elements and binds event listeners.
+ */
+ _prepareElements: function(activeMenuItems) {
+ this._headerNavigation.find('li').removeClass('activeMenuItem');
+
+ this._sidebarNavigation.find('div h1').each($.proxy(function(index, menuHeader) {
+ $(menuHeader).click($.proxy(this._toggleItem, this));
+ }, this));
+
+ // close all navigation groups
+ this._sidebarNavigation.find('div div').each(function() {
+ $(this).hide();
+ });
+
+ this._headerNavigation.find('li').click($.proxy(this._toggleSidebar, this));
+
+ if (activeMenuItems.length === 0) {
+ this._renderSidebar(this._headerNavigation.find('li:first').data('menuItem'), []);
+ }
+ else {
+ this._renderSidebar('', activeMenuItems);
+ }
+ },
+
+ /**
+ * Toggles a navigation group entry.
+ */
+ _toggleItem: function(event) {
+ var $menuItem = $(event.target);
+
+ $menuItem.next().stop(true, true).toggle('blind', { }, 200).end().toggleClass('activeMenuItem');
+ },
+
+ /**
+ * Handles clicks on main menu.
+ *
+ * @param object event
+ */
+ _toggleSidebar: function(event) {
+ if ($(event.target).hasClass('activeMenuItem')) {
+ return;
+ }
+
+ this._renderSidebar($(event.target).data('menuItem'), []);
+ },
+
+ /**
+ * Renders sidebar including highlighting of currently active menu items.
+ *
+ * @param string menuItem
+ * @param array activeMenuItems
+ */
+ _renderSidebar: function(menuItem, activeMenuItems) {
+ // reset visible and active items
+ this._headerNavigation.find('li').removeClass('activeMenuItem');
+ this._sidebarNavigation.find('div.menuContainer').hide();
+
+ if (activeMenuItems.length === 0) {
+ // show active menu
+ this._headerNavigation.find('li[data-menuItem="' + menuItem + '"]').addClass('activeMenuItem');
+ this._sidebarNavigation.find('div[data-parentMenuItem="' + menuItem + '"]').show();
+ }
+ else {
+ // open menu by active menu items, first element is always a head navigation item
+ menuItem = activeMenuItems.shift();
+
+ this._headerNavigation.find('li[data-menuItem="' + menuItem + '"]').addClass('activeMenuItem');
+ this._sidebarNavigation.find('div[data-parentMenuItem="' + menuItem + '"]').show();
+
+ for (var $i = 0, $size = activeMenuItems.length; $i < $size; $i++) {
+ var $item = activeMenuItems[$i];
+
+ if ($.wcfIsset($item)) {
+ var $menuItem = $('#' + $.wcfEscapeID($item));
+
+ if ($menuItem.getTagName() === 'ul') {
+ $menuItem.parent('div').show().prev().addClass('activeMenuItem');
+ }
+ else {
+ $menuItem.addClass('activeMenuItem');
+ }
+ }
+ }
+ }
+ }
+};
+
+/**
+ * Handles package installation dialog.
+ *
+ * @param string actionName
+ * @param integer queueID
+ * @param boolean initialize
+ */
+WCF.ACP.PackageInstallation = function(actionName, queueID, initialize) { this.init(actionName, queueID, initialize); };
+WCF.ACP.PackageInstallation.prototype = {
+ /**
+ * package installation type
+ *
+ * @var string
+ */
+ _actionName: '',
+
+ /**
+ * package installation dialog
+ *
+ * @var object
+ */
+ _dialog: null,
+
+ /**
+ * queue id
+ *
+ * @var integer
+ */
+ _queueID: 0,
+
+ /**
+ * Initializes package installation.
+ *
+ * @param string actionName
+ * @param integer queueID
+ * @param boolean initialize
+ */
+ init: function(actionName, queueID, initialize) {
+ this._actionName = WCF.String.ucfirst(actionName) + 'Package';
+ this._queueID = queueID;
+
+ if (initialize) {
+ $('#submitButton').click($.proxy(function(event) {
+ this.prepareInstallation();
+ return false;
+ }, this));
+ }
+ },
+
+ /**
+ * Prepares installation dialog.
+ */
+ prepareInstallation: function() {
+ WCF.showAJAXDialog('packageInstallationDialog', true, {
+ ajax: {
+ url: 'index.php?action=' + this._actionName + '&t=' + SECURITY_TOKEN + SID_ARG_2ND,
+ type: 'POST',
+ data: { queueID: this._queueID, step: 'prepare' },
+ success: $.proxy(this._handleResponse, this)
+ },
+ preventClose: true,
+ hideTitle: true
+ });
+ },
+
+ /**
+ * Executes response instructions.
+ */
+ _handleResponse: function() {
+ if (this._dialog == null) {
+ this._dialog = $('#packageInstallationDialog');
+ }
+
+ var $data = this._dialog.data('responseData');
+
+ // receive new queue id
+ if ($data.queueID) {
+ this._queueID = $data.queueID;
+ }
+
+ // update progress
+ if ($data.progress) {
+ $('#packageInstallationProgress').attr('value', $data.progress).text($data.progress + '%');
+ }
+
+ // handle success
+ if ($data.step == 'success') {
+ var $id = WCF.getRandomID();
+ $('#packageInstallationInnerContent').append('<div class="formSubmit"><input type="button" id="' + $id + '" value="Weiter" /></div>');
+
+ $('#' + $id).click($.proxy(function() {
+ window.location.href = "index.php?page=PackageList" + SID_ARG_2ND;
+ }, this));
+
+ $('#packageInstallationInnerContentContainer').wcfBlindIn();
+
+ return;
+ }
+
+ // update template
+ if ($data.template && !$data.ignoreTemplate) {
+ this._dialog.html($data.template);
+ }
+
+ // update action
+ if ($data.currentAction) {
+ $('#packageInstallationAction').text($data.currentAction);
+ }
+
+ // handle inner template
+ if ($data.innerTemplate) {
+ $('#packageInstallationInnerContent').html($data.innerTemplate);
+
+ // create button to handle next step
+ if ($data.step && $data.node) {
+ var $id = WCF.getRandomID();
+ $('#packageInstallationInnerContent').append('<div class="formSubmit"><input type="button" id="' + $id + '" value="Weiter" /></div>');
+
+ $('#' + $id).click($.proxy(function() {
+ // collect form values
+ var $additionalData = {};
+ $('#packageInstallationInnerContent').find('input').each(function(index, inputElement) {
+ $additionalData[$(inputElement).attr('name')] = $(inputElement).attr('value');
+ });
+
+ this._executeStep($data.step, $data.node, $additionalData);
+ }, this));
+ }
+
+ $('#packageInstallationInnerContentContainer').wcfBlindIn();
+
+ this._dialog.wcfDialog('redraw');
+ return;
+ }
+
+ // purge content
+ if ($('#packageInstallationInnerContent').children().length > 1) {
+ $('#packageInstallationInnerContentContainer').wcfBlindOut('down', $.proxy(function() {
+ $('#packageInstallationInnerContent').empty();
+ this._dialog.wcfDialog('redraw');
+
+ // execute next step
+ if ($data.step && $data.node) {
+ this._executeStep($data.step, $data.node);
+ }
+ }, this));
+ }
+ else {
+ // execute next step
+ if ($data.step && $data.node) {
+ this._executeStep($data.step, $data.node);
+ }
+ }
+ },
+
+ /**
+ * Executes the next installation step.
+ *
+ * @param string step
+ * @param string node
+ * @param object additionalData
+ */
+ _executeStep: function(step, node, additionalData) {
+ if (!additionalData) additionalData = {};
+
+ var $data = $.extend({
+ node: node,
+ queueID: this._queueID,
+ step: step
+ }, additionalData);
+
+ $.ajax({
+ url: 'index.php?action=' + this._actionName + '&t=' + SECURITY_TOKEN + SID_ARG_2ND,
+ dataType: 'json',
+ type: 'POST',
+ data: $data,
+ success: $.proxy(function(data) {
+ this._dialog.data('responseData', data);
+ this._handleResponse();
+ }, this),
+ error: function(transport) {
+ alert(transport.responseText);
+ }
+ });
+ }
+};
+
+/**
+ * Handles package uninstallation.
+ *
+ * @param jQuery elements
+ */
+WCF.ACP.PackageUninstallation = function(elements) { this.init(elements); };
+WCF.ACP.PackageUninstallation.prototype = {
+ /**
+ * WCF.ACP.PackageInstallation object
+ *
+ * @var WCF.ACP.PackageInstallation
+ */
+ _installation: null,
+
+ /**
+ * Initializes package uninstallation.
+ *
+ * @param jQuery elements
+ */
+ init: function(elements) {
+ if (elements.length == 0) return;
+
+ // bind event listener
+ elements.each($.proxy(function(index, element) {
+ $(element).click($.proxy(this._createQueue, this));
+ }, this));
+ },
+
+ /**
+ * Creates a new package uninstallation process.
+ *
+ * @param object event
+ */
+ _createQueue: function(event) {
+ var packageID = $(event.target).data('objectID');
+
+ this._installation = new WCF.ACP.PackageInstallation('uninstall', 0, false);
+
+ // initialize dialog
+ WCF.showAJAXDialog('packageInstallationDialog', true, {
+ ajax: {
+ url: 'index.php?action=UninstallPackage&t=' + SECURITY_TOKEN + SID_ARG_2ND,
+ type: 'POST',
+ data: { packageID: packageID, step: 'prepare' },
+ success: $.proxy(this._installation._handleResponse, this._installation)
+ },
+ preventClose: true,
+ hideTitle: true
+ });
+ }
+};
+
+/**
+ * Handles option selection.
+ */
+WCF.ACP.Options = function() { this.init(); };
+WCF.ACP.Options.prototype = {
+ /**
+ * Initializes options.
+ */
+ init: function() {
+ $('.enablesOptions').each($.proxy(this._initOption, this));
+ },
+
+ /**
+ * Initializes an option.
+ *
+ * @param integer index
+ * @param object option
+ */
+ _initOption: function(index, option) {
+ // execute action on init
+ this._change(option);
+
+ // bind event listener
+ $(option).change($.proxy(this._handleChange, this));
+ },
+
+ /**
+ * Applies whenever an option is changed.
+ *
+ * @param object event
+ */
+ _handleChange: function(event) {
+ this._change($(event.target));
+ },
+
+ /**
+ * Enables or disables options on option value change.
+ *
+ * @param object option
+ */
+ _change: function(option) {
+ option = $(option);
+
+ var $disableOptions = eval(option.data('disableOptions'));
+ var $enableOptions = eval(option.data('enableOptions'));
+
+ // determine action by type
+ switch(option.getTagName()) {
+ case 'input':
+ switch(option.attr('type')) {
+ case 'checkbox':
+ this._execute(option.attr('checked'), $disableOptions, $enableOptions);
+ break;
+
+ case 'radio':
+ if (option.attr('checked')) {
+ this._execute(true, $disableOptions, $enableOptions);
+ }
+ break;
+ }
+ break;
+
+ case 'select':
+ var $value = option.val();
+ var $disableOptions = $enableOptions = [];
+
+ if (option.data('disableOptions').length > 0) {
+ for (var $index in option.data('disableOptions')) {
+ var $item = option.data('disableOptions')[$index];
+
+ if ($item.value == $value) {
+ $disableOptions.push($item.option);
+ }
+ }
+ }
+
+ if (option.data('enableOptions').length > 0) {
+ for (var $index in option.data('enableOptions')) {
+ var $item = option.data('enableOptions')[$index];
+
+ if ($item.value == $value) {
+ $enableOptions.push($item.option);
+ }
+ }
+ }
+
+ this._execute(true, $disableOptions, $enableOptions);
+ break;
+ }
+ },
+
+ /**
+ * Enables or disables options.
+ *
+ * @param boolean isActive
+ * @param array disableOptions
+ * @param array enableOptions
+ */
+ _execute: function(isActive, disableOptions, enableOptions) {
+ if (disableOptions.length > 0) {
+ for (var $i = 0, $size = disableOptions.length; $i < $size; $i++) {
+ var $target = disableOptions[$i];
+ if ($.wcfIsset($target)) {
+ if (isActive) {
+ $('#' + $.wcfEscapeID($target)).disable().closest('dl').addClass('disabled');
+ }
+ else {
+ $('#' + $.wcfEscapeID($target)).enable().closest('dl').removeClass('disabled');
+ }
+ }
+ }
+ }
+
+ if (enableOptions.length > 0) {
+ for (var $i = 0, $size = enableOptions.length; $i < $size; $i++) {
+ var $target = enableOptions[$i];
+ if ($.wcfIsset($target)) {
+ if (isActive) {
+ $('#' + $.wcfEscapeID($target)).enable().closest('dl').removeClass('disabled');
+ }
+ else {
+ $('#' + $.wcfEscapeID($target)).disable().closest('dl').addClass('disabled');
+ }
+ }
+ }
+ }
+ }
};
\ No newline at end of file
-\r
-/* dynamic style attributes */\r
-\r
-.largeButtons li a,.pmEditFolders a{background-image:url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png")}\r
-.largeButtons li a:hover,.pmEditFolders a:hover{background-image:url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png")}\r
-.largeButtons li a,.pmEditFolders a{border-style:solid}\r
-.largeButtons li a{border-width:0px}\r
-.largeButtons li{border-style:solid}\r
-.largeButtons li{border-width:0px}\r
-.largeButtons li a,.pmEditFolders a{color:#fff}\r
-.largeButtons li a:hover,.pmEditFolders a:hover{color:#fff}\r
-.memberList li .memberName,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{background-color:#d9e5ef}\r
-.memberList li .memberName{border-color:#d9e5ef}\r
-.memberList li .memberName:hover,.messageNumber:hover,.optionButtons a:hover,.pageNavigation li ul,.smallButtons a:hover,li.extraButton a:hover{background-color:#ffe0b8}\r
-.memberList li .memberName,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{background-image:url("../images/WoltLab Blue Sunrise/smallButtons.png")}\r
-.memberList li .memberName:hover,.messageNumber:hover,.optionButtons a:hover,.smallButtons a:hover,li.extraButton a:hover{background-image:url("../images/WoltLab Blue Sunrise/smallButtonsHover.png")}\r
-.memberList li,.memberList li .memberRemove{background-color:#fff}\r
-.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-color:#fff}\r
-.memberList li .memberRemove:hover,.memberList li:hover{background-color:#fff}\r
-.optionButtons a:hover,.pageNavigation a:hover,.smallButtons a:hover,li.extraButton a:hover{border-color:#fff}\r
-.pageNavigation li.children:hover > span{border-color:#fff}\r
-.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-style:solid}\r
-.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-width:1px}\r
-.footerOptions li.extraButton,.memberList li,.messageNumber,.optionButtons li,.pageNavigation li,.smallButtons li,li.extraButton{border-color:#8da4b7}\r
-.memberList li:hover,.messageNumber:hover,.optionButtons li:hover,.pageNavigation li:hover,.smallButtons li:hover,li.extraButton:hover{border-color:#fa2}\r
-.memberList li,.messageNumber,.optionButtons li,.smallButtons li,li.extraButton{border-style:solid}\r
-.li.extraButton,.memberList li,.messageNumber,.optionButtons li,.smallButtons li{border-width:1px}\r
-.container-1 .smallButtons a,.container-2 .smallButtons a,.container-3 .smallButtons a,.memberList li .memberName,.messageInner .color-1 .smallButtons a,.messageInner .color-2 .smallButtons a,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{color:#666}\r
-.container-1 .smallButtons a:hover,.container-2 .smallButtons a:hover,.container-3 .smallButtons a:hover,.memberList li .memberName:hover,.messageInner .color-1 .smallButtons a:hover,.messageInner .color-2 .smallButtons a:hover,.messageNumber:hover,.optionButtons a:hover,.smallButtons a:hover,li.extraButton a:hover{color:#333}\r
-.border,.mceResizeBox,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.subTabMenu{background-color:#fff}\r
-#logo,#search,.attachmentPreview ul li a,.border .tableList td,.border .tableList th,.columnContainer,.dividers .messageAuthor,.dividers .tocHeadline,.dividers .userAvatar,.dividers .userCredits,.dividers .userMessenger,.dividers .userSymbols,.inlineCalendarFooter td a,.inlineCalendarFooter td span,.inlineCalendarHeader td a,.inlineCalendarHeader td span,.mainMenu .mainMenuInner,.mainMenu a,.mceEditor .mceColors li,.messageContent,.messageInner,.subTabMenu div.containerHead,.tabMenu li a,.userAvatar,.userAvatarFramed{border-color:#fff}\r
-#footer,#header,.attachmentFile ul li,.attachmentPreview ul li:hover,.avatarDisplay div,.avatarSelect li label,.border,.footerMenu li,.footerOptions li,.galleryIndex li.floatedElement:hover,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.mainMenu,.marked,.mceResizeBox,.message,.messageContentInner,.messageNumber,.pageNavigation li ul,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.searchContainer,.subTabMenu,.tabMenu li,.userAvatar a,.userAvatarFramed a,fieldset{border-color:#8da4b7}\r
-.border,.error,.info,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.message,.pageNavigation li ul,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.searchContainer,.subTabMenu,.success,.tabMenu li,.warning,fieldset{border-style:solid}\r
-.border,.error,.info,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.message,.quoteBox,.searchContainer,.success,.warning,fieldset{border-width:1px}\r
-.containerHead,.inlineCalendarFooter td,.inlineCalendarHeader td,.tabMenu li.activeTabMenu a,.tabMenu li.activeTabMenu a:hover{background-color:#164369}\r
-.containerHead,.inlineCalendarFooter td,.inlineCalendarHeader td{background-image:url("../images/WoltLab Blue Sunrise/containerHead.png")}\r
-.containerHead .light,.containerHead .light a{color:#fff}\r
-.containerHead,.inlineCalendarFooter td a,.inlineCalendarFooter td span,.inlineCalendarHeader td a,.inlineCalendarHeader td span{color:#fff}\r
-.containerHead a,.tabMenu li.activeTabMenu a,.tabMenu li.activeTabMenu a:hover{color:#fff}\r
-.containerHead a:hover{color:#fff}\r
-.container-1,.container-1 fieldset fieldset,.container-2 fieldset,.dynBoxInner,.inlineCalendarTable,.messageInner .color-1,.pageNavigation li ul,div.pageMenu li.container-1 a,fieldset{background-color:#f8fafb}\r
-.inlineCalendarTable a{border-color:#f8fafb}\r
-.container-1 fieldset,.container-1 fieldset fieldset.noJavaScript fieldset,.container-2,.container-2 fieldset fieldset,.container-3 fieldset,.messageInner .color-2,.weekDays,div.pageMenu li.container-2 a,fieldset fieldset{background-color:#f2f6fa}\r
-.container-3,.container-3 fieldset fieldset,.itemList .itemListCategory,.tableList tbody tr:hover,.threadStarterPost .poll .container-3{background-color:#d8e7f5}\r
-.messageContainer,.messageContainerFooter{border-color:#d8e7f5}\r
-.container-4,.galleryAlbumCover img,.userAvatarFramed{background-color:#fff}\r
-#userCardCredits,.attachmentPreview ul li,.buttonBar,.deleteNote,.editNote,.friendsConnection,.friendsNetwork,.friendsNone,.galleryIndex li.floatedElement,.guestAdvice,.itemList .itemListTitle,.mainMenu div.pageMenu .bottomSeparator a,.mainMenu div.pageMenu .topSeparator a,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline,div.pageMenu .bottomSeparator a,div.pageMenu .topSeparator a{border-color:#c5d0da}\r
-.buttonBar,.deleteNote,.editNote,.itemList .itemListTitle,.mainMenu div.pageMenu .bottomSeparator a,.mainMenu div.pageMenu .topSeparator a,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline,div.pageMenu .bottomSeparator a,div.pageMenu .topSeparator a{border-style:solid}\r
-.mainMenu div.pageMenu .bottomSeparator a,div.pageMenu .bottomSeparator a{border-bottom-width:1px}\r
-.mainMenu div.pageMenu .topSeparator a,div.pageMenu .topSeparator a{border-top-width:1px}\r
-.deleteNote,.editNote,.itemList .itemListTitle,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline{border-width:1px}\r
-#logo h1{position: absolute; top: -9000px; left: -9000px;}\r
-.inputText,select,textarea{background-color:#fff}\r
-.inputText:focus,select:focus,textarea:focus{background-color:#fff9f4}\r
-.inputText,select,textarea{border-color:#8da4b7}\r
-.inputText:focus,select:focus,textarea:focus{border-color:#fa2}\r
-.inputText,select,textarea{border-style:solid}\r
-.inputText,.inputText:focus,select,select:focus,textarea,textarea:focus{border-width:1px}\r
-.editor textarea,.inputText,select,textarea{font-family:'Trebuchet MS', Arial, sans-serif}\r
-.editor textarea,.inputText,select,textarea{color:#333}\r
-.editor textarea:focus,.inputText:focus,select:focus,textarea:focus{color:#000}\r
-.editor textarea,.inputText,select,textarea{font-size:.85em}\r
-.mainMenu div.pageMenu a,.optionButtons li,.pageNavigation a,.pageNavigation li.children span,div.messageInner div.pageMenu a,div.messageInner div.smallButtons div.pageMenu a,div.pageMenu a,div.smallButtons div.pageMenu a{background-color:#f8fafb}\r
-.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li.children:hover span,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu .twoRows a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{background-color:#ffe0b8}\r
-.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li span:hover,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}\r
-.pageNavigation li.children:hover > span{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}\r
-.mainMenu div.pageMenu a,.pageNavigation a,.pageNavigation li.children span,.tableList div.pageMenu a,div.messageInner div.pageMenu a,div.messageInner div.smallButtons div.pageMenu a,div.pageMenu a,div.smallButtons div.pageMenu a{color:#333}\r
-.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li.children:hover span,.tableList div.pageMenu a:hover,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{color:#333}\r
-.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a{background-color:#154268}\r
-.mainMenu .active a:hover,.mainMenu .firstActive a:hover,.mainMenu .lastActive a:hover{background-color:#154268}\r
-.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a{color:#d9e5ef}\r
-.mainMenu .active a:hover,.mainMenu .firstActive a:hover,.mainMenu .lastActive a:hover{color:#fff}\r
-.mainMenu a:hover{background-color:#ffe0b8}\r
-.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a,.mainMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/menuActive.png")}\r
-.mainMenu{background-color:transparent}\r
-.mainMenu a{color:#154268}\r
-.mainMenu a:hover{color:#333}\r
-.mainMenu div{text-align:left;margin:0 auto 0 0}\r
-.tabMenu ul li.activeTabMenu a{background-color:#164369}\r
-.tabMenu ul li.activeTabMenu a:hover{background-color:#164369}\r
-.tabMenu ul li.activeTabMenu a{color:#fff}\r
-.tabMenu li a,.tabMenu li.disabled a:hover{background-color:#e8e8e8}\r
-.tabMenu li a:hover{background-color:#8da4b7}\r
-.tabMenu li a,.tabMenu li.disabled a:hover{background-image:url("../images/WoltLab Blue Sunrise/tab.png")}\r
-.tabMenu li a:hover,.tabMenu li.activeTabMenu a,.tabMenu ul li.activeTabMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/tabActive.png")}\r
-.subTabMenu ul .activeSubTabMenu a{background-color:#17354e}\r
-.subTabMenu ul .activeSubTabMenu a:hover{background-color:#487397}\r
-.subTabMenu ul .activeSubTabMenu a{color:#fff}\r
-.subTabMenu ul .activeSubTabMenu a:hover{color:#fff}\r
-.subTabMenu ul li a:hover{background-color:#487397}\r
-.subTabMenu ul .activeSubTabMenu a,.subTabMenu ul li a{border-color:#487397}\r
-.subTabMenu ul .activeSubTabMenu a:hover,.subTabMenu ul li a:hover{border-color:#8da4b7}\r
-.subTabMenu ul .activeSubTabMenu a,.subTabMenu ul li a:hover{border-style:solid}\r
-#search .searchContainer p a,.subTabMenu ul li a{color:#ddd}\r
-#search .searchContainer p a:hover,.subTabMenu ul li a:hover{color:#fff}\r
-.tabMenu li a,.tabMenu li.disabled a:hover{color:#666}\r
-.tabMenu li a:hover{color:#fff}\r
-.message .messageSidebar{text-align:center}\r
-#footer,#header,#main,#mainMenu,#userPanel{margin-left:auto;margin-right:auto;}\r
-body,html{background-color:#fff}\r
-.iframeBody,body,textarea{font-family:'Trebuchet MS', Arial, sans-serif}\r
-.formFieldDesc,.light{color:#858789}\r
-#footer,#search .searchContainer p a,.boardlistCounter,.boardlistDescription,.boardlistLastPost,.boardlistSubboards,.boardlistUsersOnline,.deleteNote,.editNote,.firstPost,.formField label,.formFieldDesc,.loginPopup,.messageNumber,.moderators,.pageNavigation,.pageNavigation input,.pmMove p,.pmUsage,.popupMenu,.smallButtons li span,.smallFont,.statusDisplay,.subTabMenu ul li,.tableList th,.userCredits,.userExtras,.userPanel,div.inlineCalendar,td.columnLastActivity,td.columnLocation,td.columnRegistrationDate,td.columnUserAgent{font-size:.85em}\r
-.userPanel a,body,legend{color:#57595a}\r
-.breadCrumbs,.error,.info,.message h3,.message h4,.messageBody,.success,.warning{line-height:1.5}\r
-.iframeBody,body{font-size:.8em}\r
-#logo{height:90px}\r
-a,div.pageMenu .twoRows a span{color:#154268}\r
-a:hover,div.pageMenu .twoRows a:hover span{color:#000}\r
-* a.externalURL{color:#154268}\r
-* a.externalURL:hover{color:#08f}\r
-#logo .pageLogo{text-align:left}\r
-#logo .pageLogo img{margin-left:0px}\r
-#logo .pageLogo img{margin-right:0px}\r
-#logo .pageLogo img{margin-top:5px}\r
-h2{font-family:'Trebuchet MS', Arial, sans-serif}\r
-h2,h2 a,h2 a:hover{color:#173f61}\r
-h2{font-size:1.5em}\r
-h2{font-style:normal}\r
-h2{font-weight:normal}\r
-#footer,#header,#main,#mainMenu,#userPanel{max-width:80%}\r
-#footer,#header,#main,#mainMenu,#userPanel{min-width:760px}\r
-.activeContainer,.activeMessage,.mainMenu div.pageMenu .active a,.markedDayField a,.pageNavigation .active span,div.pageMenu li.active a{background-color:#d8e7f5}\r
-.activeContainer,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-color:#487397}\r
-.activeContainer,.avatarDisplay div,.avatarSelect li label,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-style:solid}\r
-.activeContainer,.avatarDisplay div,.avatarSelect li label,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-width:1px}\r
-.activeContainer .light,.activeContainer .light a,.activeContainer a:hover{color:#333}\r
-.activeContainer,.mainMenu div.pageMenu .active a,.markedDayField a,.pageNavigation .active span,div.pageMenu li.active a{color:#333}\r
-.activeContainer a{color:#333}\r
-.tableHead .active .emptyHead,.tableHead .active a{background-color:#ffe0b8}\r
-.tableHead .active a:hover{background-color:#ffe0b8}\r
-.tableHead .active .emptyHead,.tableHead .active a{border-color:#fa2}\r
-.tableHead .active a:hover{border-color:#f60}\r
-.tableHead .active .emptyHead,.tableHead .active a{color:#000}\r
-.tableHead .active a:hover{color:#000}\r
-.tableHead .emptyHead,.tableHead a{background-color:#eee}\r
-.tableHead a:hover{background-color:#ffe0b8}\r
-.tableHead .emptyHead,.tableHead a{background-image:url("../images/WoltLab Blue Sunrise/tableHead.png")}\r
-.tableHead .active .emptyHead,.tableHead .active a,.tableHead .active a:hover,.tableHead a:hover{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}\r
-.tableHead .emptyHead,.tableHead a{border-color:#8da4b7}\r
-.tableHead a:hover{border-color:#154268}\r
-.tableHead .emptyHead,.tableHead a{color:#154268}\r
-.tableHead a:hover{color:#000}\r
-\r
-/* user.additional.style.input1.use */\r
-\r
-html {background-color: #eee;}\r
-#main {padding-top: 0;}\r
-h1 {text-shadow: 0 -1px 1px #000;}\r
-h2, h2 a {text-shadow: 0 2px 3px #bbb;}\r
-legend {color: #487397;}\r
-#headerContainer {background-color: #164369;background-image: url("../images/WoltLab Blue Sunrise/header.jpg");background-repeat: repeat-x;background-position: left top;}\r
-#header {border-width: 0 !important;}\r
-#logo {margin: 0;border-width: 0 !important;}\r
-#userPanel {background-image: url("../images/WoltLab Blue Sunrise/userPanel.png");background-repeat: repeat-x;background-position: left bottom;max-width: 100%;min-width: 100%;width: 100%;}\r
-.userPanelInner {max-width: 80%;min-width: 770px;margin: 0 auto;}\r
-.userPanel, .userPanel a {color: #ebf1f6;}\r
-.userPanel a:hover {color: #fff;}\r
-.userPanel .border, .userPanel .popupMenu a {color: #57595a;}\r
-#search {right: 0;top: 23px;}\r
-#search .searchContainer {text-align: center;background-color: transparent;background-image: url("../images/WoltLab Blue Sunrise/searchContainer.png");background-repeat: no-repeat;background-position: right top;padding-left: 40px;min-height: 24px;}\r
-#mainMenu {max-width: 100%;min-width: 100%;width: 100%;}\r
-.mainMenu {min-height: 31px;background-color: transparent;background-image: url("../images/WoltLab Blue Sunrise/menuBar.png");background-repeat: repeat-x;background-position: left bottom;padding-bottom: 6px;border-width: 0 !important;}\r
-.mainMenu .mainMenuInner {max-width: 80%;min-width: 770px;margin: 0 auto;border-width: 0 !important;}\r
-.mainMenu a {text-shadow: 0 1px 0 #fff;border: 1px solid #c2c2c2;border-width: 0 1px 1px 1px;padding: 3px 5px 4px 5px;line-height: 1;}\r
-.mainMenu a:hover {background-image: url("../images/WoltLab Blue Sunrise/menuHover.png");}\r
-.mainMenu .active a, .mainMenu .firstActive a, .mainMenu .lastActive a {text-shadow: 0 -1px 0 #036;background-image: url("../images/WoltLab Blue Sunrise/menuActive.png") !important;}\r
-#mainMenu span {position: relative;top: 5px;}\r
-.mainMenu img {float: left;padding-right: 4px;}\r
-#footerContainer {background-color: #eee;border-top: 1px solid #8da4b7;}\r
-#footer {border: 0 !important;}\r
-.pageNavigation a:hover {background-image: url("../images/WoltLab Blue Sunrise/smallButtonsHover.png");}\r
-.messageLeft, .messageRight, .messageFramedLeft, .messageFramedRight, .messageTop, .messageFramedTop {background-image: url("../images/WoltLab Blue Sunrise/messageSidebar.jpg");background-repeat: repeat-x;}\r
-.userName a span, .quickReply h3 a {text-shadow: 0 1px 0 #fff;}\r
-.poll .pollQuestion {background-image: url("../images/WoltLab Blue Sunrise/poll.jpg");background-repeat: repeat-x;}\r
-.threadStarterPost .messageLeft, .threadStarterPost .messageRight, .threadStarterPost .messageFramedLeft, .threadStarterPost .messageFramedRight, .threadStarterPost .messageTop, .threadStarterPost .messageFramedTop {background-image: url("../images/WoltLab Blue Sunrise/messageSidebarThreadStarter.jpg");background-repeat: repeat-x;}\r
-.threadStarterPost .container-3 {background-color: #ffddb7;}\r
-.threadStarterPost .codeBox .container-3 {background-color: #d8e7f5;}\r
-.firstPost a {color: #858789;}\r
-.smallButtons span {text-shadow: 0 1px 0 #fff;}\r
-.largeButtons a {line-height: 1;background-image: url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png");background-position: right 0;background-repeat: no-repeat;padding: 0 7px 0 0;}\r
-.largeButtons a img {margin-top: 5px;margin-left: 7px;position: absolute;}\r
-.largeButtons a span {color: #fff;text-shadow: 0 -1px 0 #036;background-image: url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png");background-position: left 0;background-repeat: no-repeat;padding: 9px 3px 0 36px;display: block;height: 25px;cursor: pointer;}\r
-.largeButtons a:hover {background-position: right -86px;}\r
-.largeButtons a:hover span {color: #000;text-shadow: 0 1px 0 #fff;background-position: left -86px;}\r
-.tabMenu a span, .tabMenu li.disabled a span {text-shadow: 0 1px 0 #fff;}\r
-.tabMenu .activeTabMenu a span, .tabMenu a:hover span, .subTabMenu a span {text-shadow: 0 -1px 0 #036;}\r
-.containerHead, .containerHead a {text-shadow: 0 -1px 0 #036;}\r
-.subHeadline {text-shadow: 0 1px 0 #fff;}\r
-.memberList li span {text-shadow: 0 1px 0 #fff;}\r
-.galleryIndex li span {text-shadow: 0 1px 0 #fff;}\r
-select, textarea, input[type="text"], input[type="password"] {border-width: 1px;border-style: solid;border-color: #666 #999 #ccc #999;background-image: url("../images/WoltLab Blue Sunrise/inputBackground.png");background-position: left top;background-repeat: repeat-x;min-height: 13px;}\r
-select, textarea:focus, input[type="text"]:focus, input[type="password"]:focus {background-image: url("../images/WoltLab Blue Sunrise/inputBackground.png");background-repeat: repeat-x;outline: 0;}\r
-\r
-/* user.additional.style.input2.use */\r
-\r
-* {-o-text-overflow: ellipsis;}\r
-.message, .messageInner, .quoteBox, fieldset, .info, .success, .warning, .error, .help, #userCard, .userCardInner, .second .border, .second .border .content, .avatarSelect li.container-4, .avatarSelect li label, .floatedElement, .popupMenu, .loginPopup, .loginPopup .container-1 {-webkit-border-radius: 5px; -moz-border-radius: 5px;}\r
-.messageLeft .messageContent, .messageLeft .messageContentInner {-webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px;}\r
-.messageRight .messageContent, .messageRight .messageContentInner {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;}\r
-.messageFramedLeft .messageContent, .messageFramedLeft .messageContentInner, .messageFramedRight .messageContent, .messageFramedRight .messageContentInner {-webkit-border-radius: 5px; -moz-border-radius: 5px;}\r
-.messageTop .messageContent, .messageTop .messageContentInner {-webkit-border-radius: 0; -moz-border-radius: 0;}\r
-.messageFramedTop .messageContent, .messageFramedTop .messageContentInner {-webkit-border-radius: 5px; -moz-border-radius: 5px;}\r
-textarea, select, input[type="text"], input[type="password"], .memberList li, .smallButtons > ul > li, .smallButtons > ul > li > a, .extraButton, .extraButton a, .optionButtons > ul > li, .optionButtons > ul > li > a, .subTabMenu .containerHead li a, .pmUsageBar, .statBar, .userAvatarFramed, .userAvatarFramed a, .userAvatarFramed img {-webkit-border-radius: 3px; -moz-border-radius: 3px;}\r
-.pmUsageBar > div, .statBar > div {-webkit-border-radius: 1px; -moz-border-radius: 1px;}\r
-.popupMenu li:first-child a, #boardlist .border, .titleBarPanel, .titleBarPanel .containerHead, .messagePreview, .subTabMenu, .subTabMenu .containerHead, .containerHead, .messageTop .messageSidebar, .messageFramedTop .messageSidebar, .thumbnailButtons {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px;}\r
-.codeBox {-webkit-border-top-left-radius: 3px; -webkit-border-top-right-radius: 3px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px;}\r
-.tabMenu li:first-child, .tabMenu li:first-child a {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px;}\r
-.tabMenu li:last-child, .tabMenu li:last-child a {-webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px;}\r
-.searchInputMenu .pageMenu, .popupMenu li:last-child a, .twoRows li:last-child {-webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px;}\r
-#boardlist .border .boardlistInner, .twoRows li:last-child a, .datalist li:last-child {-webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px; -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;}\r
-.popupMenu li a, #boardlist .border .boardlistInner:first-child {-webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0;}\r
-.mceToolbar .popupMenu, .mceToolbar .popupMenu li, .mceToolbar .popupMenu li a, .second fieldset .editor, .second fieldset .border, .attachmentPreview, .attachmentPreview li, .tableList td.containerHead {-webkit-border-top-left-radius: 0 !important; -webkit-border-top-right-radius: 0 !important; -webkit-border-bottom-right-radius: 0 !important; -moz-border-radius-topleft: 0 !important; -webkit-border-bottom-left-radius: 0 !important; -moz-border-radius-topright: 0 !important; -moz-border-radius-bottomleft: 0 !important; -moz-border-radius-bottomright: 0 !important;}\r
-.loginPopup input#quickLoginUsername {-webkit-border-top-right-radius: 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-topright: 0; -moz-border-radius-bottomright: 0;}\r
-.loginPopup input#quickLoginPassword {-webkit-border-top-left-radius: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-topleft: 0; -moz-border-radius-bottomleft: 0;}\r
-input#searchInput {-webkit-border-radius: 12px; -moz-border-radius: 12px;}\r
-#searchInput {background-image: url("../images/WoltLab Blue Sunrise/searchBack-ltr.png"); background-position: -2px top; padding-left: 33px; width: 154px; height: 16px;}\r
-.searchOptions {background-image: url("../images/WoltLab Blue Sunrise/searchBackOptions-ltr.png") !important;}\r
-.searchOptions:focus {background-image: url("../images/WoltLab Blue Sunrise/searchBackOptionsActive-ltr.png") !important;}\r
-.galleryPhotoEdit img, .galleryAlbumCover img {-webkit-box-shadow: 0 3px 7px #666; -moz-box-shadow: 0 3px 7px #666;}\r
-.galleryIndex li.floatedElement .thumbnail img, .squared .thumbnail img {-webkit-box-shadow: 0 1px 3px #666; -moz-box-shadow: 0 1px 3px #666;}\r
-.galleryIndex li.floatedElement:hover, .avatarSelect li label:hover {-webkit-box-shadow: 0 1px 3px #999; -moz-box-shadow: 0 1px 3px #999;}\r
-.galleryPhoto img {-webkit-box-shadow: 0 3px 7px #666; -moz-box-shadow: 0 3px 7px #666; margin: 10px;}\r
-.imageViewerCurrentImage {-webkit-box-shadow: 0 3px 23px #000; -moz-box-shadow: 0 3px 23px #000;}\r
+
+/* dynamic style attributes */
+
+.largeButtons li a,.pmEditFolders a{background-image:url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png")}
+.largeButtons li a:hover,.pmEditFolders a:hover{background-image:url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png")}
+.largeButtons li a,.pmEditFolders a{border-style:solid}
+.largeButtons li a{border-width:0px}
+.largeButtons li{border-style:solid}
+.largeButtons li{border-width:0px}
+.largeButtons li a,.pmEditFolders a{color:#fff}
+.largeButtons li a:hover,.pmEditFolders a:hover{color:#fff}
+.memberList li .memberName,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{background-color:#d9e5ef}
+.memberList li .memberName{border-color:#d9e5ef}
+.memberList li .memberName:hover,.messageNumber:hover,.optionButtons a:hover,.pageNavigation li ul,.smallButtons a:hover,li.extraButton a:hover{background-color:#ffe0b8}
+.memberList li .memberName,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{background-image:url("../images/WoltLab Blue Sunrise/smallButtons.png")}
+.memberList li .memberName:hover,.messageNumber:hover,.optionButtons a:hover,.smallButtons a:hover,li.extraButton a:hover{background-image:url("../images/WoltLab Blue Sunrise/smallButtonsHover.png")}
+.memberList li,.memberList li .memberRemove{background-color:#fff}
+.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-color:#fff}
+.memberList li .memberRemove:hover,.memberList li:hover{background-color:#fff}
+.optionButtons a:hover,.pageNavigation a:hover,.smallButtons a:hover,li.extraButton a:hover{border-color:#fff}
+.pageNavigation li.children:hover > span{border-color:#fff}
+.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-style:solid}
+.optionButtons a,.pageNavigation a,.pageNavigation li span,.smallButtons a,li.extraButton a{border-width:1px}
+.footerOptions li.extraButton,.memberList li,.messageNumber,.optionButtons li,.pageNavigation li,.smallButtons li,li.extraButton{border-color:#8da4b7}
+.memberList li:hover,.messageNumber:hover,.optionButtons li:hover,.pageNavigation li:hover,.smallButtons li:hover,li.extraButton:hover{border-color:#fa2}
+.memberList li,.messageNumber,.optionButtons li,.smallButtons li,li.extraButton{border-style:solid}
+.li.extraButton,.memberList li,.messageNumber,.optionButtons li,.smallButtons li{border-width:1px}
+.container-1 .smallButtons a,.container-2 .smallButtons a,.container-3 .smallButtons a,.memberList li .memberName,.messageInner .color-1 .smallButtons a,.messageInner .color-2 .smallButtons a,.messageNumber,.optionButtons a,.smallButtons a,li.extraButton a{color:#666}
+.container-1 .smallButtons a:hover,.container-2 .smallButtons a:hover,.container-3 .smallButtons a:hover,.memberList li .memberName:hover,.messageInner .color-1 .smallButtons a:hover,.messageInner .color-2 .smallButtons a:hover,.messageNumber:hover,.optionButtons a:hover,.smallButtons a:hover,li.extraButton a:hover{color:#333}
+.border,.mceResizeBox,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.subTabMenu{background-color:#fff}
+#logo,#search,.attachmentPreview ul li a,.border .tableList td,.border .tableList th,.columnContainer,.dividers .messageAuthor,.dividers .tocHeadline,.dividers .userAvatar,.dividers .userCredits,.dividers .userMessenger,.dividers .userSymbols,.inlineCalendarFooter td a,.inlineCalendarFooter td span,.inlineCalendarHeader td a,.inlineCalendarHeader td span,.mainMenu .mainMenuInner,.mainMenu a,.mceEditor .mceColors li,.messageContent,.messageInner,.subTabMenu div.containerHead,.tabMenu li a,.userAvatar,.userAvatarFramed{border-color:#fff}
+#footer,#header,.attachmentFile ul li,.attachmentPreview ul li:hover,.avatarDisplay div,.avatarSelect li label,.border,.footerMenu li,.footerOptions li,.galleryIndex li.floatedElement:hover,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.mainMenu,.marked,.mceResizeBox,.message,.messageContentInner,.messageNumber,.pageNavigation li ul,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.searchContainer,.subTabMenu,.tabMenu li,.userAvatar a,.userAvatarFramed a,fieldset{border-color:#8da4b7}
+.border,.error,.info,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.message,.pageNavigation li ul,.pmEditFolders,.pmUsageBar,.popupMenu,.quoteBox,.searchContainer,.subTabMenu,.success,.tabMenu li,.warning,fieldset{border-style:solid}
+.border,.error,.info,.inlineCalendarFooter,.inlineCalendarHeader,.inlineCalendarTable,.message,.quoteBox,.searchContainer,.success,.warning,fieldset{border-width:1px}
+.containerHead,.inlineCalendarFooter td,.inlineCalendarHeader td,.tabMenu li.activeTabMenu a,.tabMenu li.activeTabMenu a:hover{background-color:#164369}
+.containerHead,.inlineCalendarFooter td,.inlineCalendarHeader td{background-image:url("../images/WoltLab Blue Sunrise/containerHead.png")}
+.containerHead .light,.containerHead .light a{color:#fff}
+.containerHead,.inlineCalendarFooter td a,.inlineCalendarFooter td span,.inlineCalendarHeader td a,.inlineCalendarHeader td span{color:#fff}
+.containerHead a,.tabMenu li.activeTabMenu a,.tabMenu li.activeTabMenu a:hover{color:#fff}
+.containerHead a:hover{color:#fff}
+.container-1,.container-1 fieldset fieldset,.container-2 fieldset,.dynBoxInner,.inlineCalendarTable,.messageInner .color-1,.pageNavigation li ul,div.pageMenu li.container-1 a,fieldset{background-color:#f8fafb}
+.inlineCalendarTable a{border-color:#f8fafb}
+.container-1 fieldset,.container-1 fieldset fieldset.noJavaScript fieldset,.container-2,.container-2 fieldset fieldset,.container-3 fieldset,.messageInner .color-2,.weekDays,div.pageMenu li.container-2 a,fieldset fieldset{background-color:#f2f6fa}
+.container-3,.container-3 fieldset fieldset,.itemList .itemListCategory,.tableList tbody tr:hover,.threadStarterPost .poll .container-3{background-color:#d8e7f5}
+.messageContainer,.messageContainerFooter{border-color:#d8e7f5}
+.container-4,.galleryAlbumCover img,.userAvatarFramed{background-color:#fff}
+#userCardCredits,.attachmentPreview ul li,.buttonBar,.deleteNote,.editNote,.friendsConnection,.friendsNetwork,.friendsNone,.galleryIndex li.floatedElement,.guestAdvice,.itemList .itemListTitle,.mainMenu div.pageMenu .bottomSeparator a,.mainMenu div.pageMenu .topSeparator a,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline,div.pageMenu .bottomSeparator a,div.pageMenu .topSeparator a{border-color:#c5d0da}
+.buttonBar,.deleteNote,.editNote,.itemList .itemListTitle,.mainMenu div.pageMenu .bottomSeparator a,.mainMenu div.pageMenu .topSeparator a,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline,div.pageMenu .bottomSeparator a,div.pageMenu .topSeparator a{border-style:solid}
+.mainMenu div.pageMenu .bottomSeparator a,div.pageMenu .bottomSeparator a{border-bottom-width:1px}
+.mainMenu div.pageMenu .topSeparator a,div.pageMenu .topSeparator a{border-top-width:1px}
+.deleteNote,.editNote,.itemList .itemListTitle,.messageFooter,.messageFooterLeft,.messageFooterRight,.messageHeader,.signature,.subHeadline{border-width:1px}
+#logo h1{position: absolute; top: -9000px; left: -9000px;}
+.inputText,select,textarea{background-color:#fff}
+.inputText:focus,select:focus,textarea:focus{background-color:#fff9f4}
+.inputText,select,textarea{border-color:#8da4b7}
+.inputText:focus,select:focus,textarea:focus{border-color:#fa2}
+.inputText,select,textarea{border-style:solid}
+.inputText,.inputText:focus,select,select:focus,textarea,textarea:focus{border-width:1px}
+.editor textarea,.inputText,select,textarea{font-family:'Trebuchet MS', Arial, sans-serif}
+.editor textarea,.inputText,select,textarea{color:#333}
+.editor textarea:focus,.inputText:focus,select:focus,textarea:focus{color:#000}
+.editor textarea,.inputText,select,textarea{font-size:.85em}
+.mainMenu div.pageMenu a,.optionButtons li,.pageNavigation a,.pageNavigation li.children span,div.messageInner div.pageMenu a,div.messageInner div.smallButtons div.pageMenu a,div.pageMenu a,div.smallButtons div.pageMenu a{background-color:#f8fafb}
+.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li.children:hover span,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu .twoRows a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{background-color:#ffe0b8}
+.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li span:hover,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}
+.pageNavigation li.children:hover > span{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}
+.mainMenu div.pageMenu a,.pageNavigation a,.pageNavigation li.children span,.tableList div.pageMenu a,div.messageInner div.pageMenu a,div.messageInner div.smallButtons div.pageMenu a,div.pageMenu a,div.smallButtons div.pageMenu a{color:#333}
+.mainMenu div.pageMenu a:hover,.pageNavigation a:hover,.pageNavigation li.children:hover span,.tableList div.pageMenu a:hover,div.messageInner div.pageMenu a:hover,div.messageInner div.smallButtons div.pageMenu a:hover,div.pageMenu a:hover,div.smallButtons div.pageMenu a:hover{color:#333}
+.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a{background-color:#154268}
+.mainMenu .active a:hover,.mainMenu .firstActive a:hover,.mainMenu .lastActive a:hover{background-color:#154268}
+.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a{color:#d9e5ef}
+.mainMenu .active a:hover,.mainMenu .firstActive a:hover,.mainMenu .lastActive a:hover{color:#fff}
+.mainMenu a:hover{background-color:#ffe0b8}
+.mainMenu .active a,.mainMenu .firstActive a,.mainMenu .lastActive a,.mainMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/menuActive.png")}
+.mainMenu{background-color:transparent}
+.mainMenu a{color:#154268}
+.mainMenu a:hover{color:#333}
+.mainMenu div{text-align:left;margin:0 auto 0 0}
+.tabMenu ul li.activeTabMenu a{background-color:#164369}
+.tabMenu ul li.activeTabMenu a:hover{background-color:#164369}
+.tabMenu ul li.activeTabMenu a{color:#fff}
+.tabMenu li a,.tabMenu li.disabled a:hover{background-color:#e8e8e8}
+.tabMenu li a:hover{background-color:#8da4b7}
+.tabMenu li a,.tabMenu li.disabled a:hover{background-image:url("../images/WoltLab Blue Sunrise/tab.png")}
+.tabMenu li a:hover,.tabMenu li.activeTabMenu a,.tabMenu ul li.activeTabMenu a:hover{background-image:url("../images/WoltLab Blue Sunrise/tabActive.png")}
+.subTabMenu ul .activeSubTabMenu a{background-color:#17354e}
+.subTabMenu ul .activeSubTabMenu a:hover{background-color:#487397}
+.subTabMenu ul .activeSubTabMenu a{color:#fff}
+.subTabMenu ul .activeSubTabMenu a:hover{color:#fff}
+.subTabMenu ul li a:hover{background-color:#487397}
+.subTabMenu ul .activeSubTabMenu a,.subTabMenu ul li a{border-color:#487397}
+.subTabMenu ul .activeSubTabMenu a:hover,.subTabMenu ul li a:hover{border-color:#8da4b7}
+.subTabMenu ul .activeSubTabMenu a,.subTabMenu ul li a:hover{border-style:solid}
+#search .searchContainer p a,.subTabMenu ul li a{color:#ddd}
+#search .searchContainer p a:hover,.subTabMenu ul li a:hover{color:#fff}
+.tabMenu li a,.tabMenu li.disabled a:hover{color:#666}
+.tabMenu li a:hover{color:#fff}
+.message .messageSidebar{text-align:center}
+#footer,#header,#main,#mainMenu,#userPanel{margin-left:auto;margin-right:auto;}
+body,html{background-color:#fff}
+.iframeBody,body,textarea{font-family:'Trebuchet MS', Arial, sans-serif}
+.formFieldDesc,.light{color:#858789}
+#footer,#search .searchContainer p a,.boardlistCounter,.boardlistDescription,.boardlistLastPost,.boardlistSubboards,.boardlistUsersOnline,.deleteNote,.editNote,.firstPost,.formField label,.formFieldDesc,.loginPopup,.messageNumber,.moderators,.pageNavigation,.pageNavigation input,.pmMove p,.pmUsage,.popupMenu,.smallButtons li span,.smallFont,.statusDisplay,.subTabMenu ul li,.tableList th,.userCredits,.userExtras,.userPanel,div.inlineCalendar,td.columnLastActivity,td.columnLocation,td.columnRegistrationDate,td.columnUserAgent{font-size:.85em}
+.userPanel a,body,legend{color:#57595a}
+.breadCrumbs,.error,.info,.message h3,.message h4,.messageBody,.success,.warning{line-height:1.5}
+.iframeBody,body{font-size:.8em}
+#logo{height:90px}
+a,div.pageMenu .twoRows a span{color:#154268}
+a:hover,div.pageMenu .twoRows a:hover span{color:#000}
+* a.externalURL{color:#154268}
+* a.externalURL:hover{color:#08f}
+#logo .pageLogo{text-align:left}
+#logo .pageLogo img{margin-left:0px}
+#logo .pageLogo img{margin-right:0px}
+#logo .pageLogo img{margin-top:5px}
+h2{font-family:'Trebuchet MS', Arial, sans-serif}
+h2,h2 a,h2 a:hover{color:#173f61}
+h2{font-size:1.5em}
+h2{font-style:normal}
+h2{font-weight:normal}
+#footer,#header,#main,#mainMenu,#userPanel{max-width:80%}
+#footer,#header,#main,#mainMenu,#userPanel{min-width:760px}
+.activeContainer,.activeMessage,.mainMenu div.pageMenu .active a,.markedDayField a,.pageNavigation .active span,div.pageMenu li.active a{background-color:#d8e7f5}
+.activeContainer,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-color:#487397}
+.activeContainer,.avatarDisplay div,.avatarSelect li label,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-style:solid}
+.activeContainer,.avatarDisplay div,.avatarSelect li label,.avatarSelect li label:hover,.inlineCalendarTable a:hover,.markedDayField a,.pageNavigation .active{border-width:1px}
+.activeContainer .light,.activeContainer .light a,.activeContainer a:hover{color:#333}
+.activeContainer,.mainMenu div.pageMenu .active a,.markedDayField a,.pageNavigation .active span,div.pageMenu li.active a{color:#333}
+.activeContainer a{color:#333}
+.tableHead .active .emptyHead,.tableHead .active a{background-color:#ffe0b8}
+.tableHead .active a:hover{background-color:#ffe0b8}
+.tableHead .active .emptyHead,.tableHead .active a{border-color:#fa2}
+.tableHead .active a:hover{border-color:#f60}
+.tableHead .active .emptyHead,.tableHead .active a{color:#000}
+.tableHead .active a:hover{color:#000}
+.tableHead .emptyHead,.tableHead a{background-color:#eee}
+.tableHead a:hover{background-color:#ffe0b8}
+.tableHead .emptyHead,.tableHead a{background-image:url("../images/WoltLab Blue Sunrise/tableHead.png")}
+.tableHead .active .emptyHead,.tableHead .active a,.tableHead .active a:hover,.tableHead a:hover{background-image:url("../images/WoltLab Blue Sunrise/tableHeadHover.png")}
+.tableHead .emptyHead,.tableHead a{border-color:#8da4b7}
+.tableHead a:hover{border-color:#154268}
+.tableHead .emptyHead,.tableHead a{color:#154268}
+.tableHead a:hover{color:#000}
+
+/* user.additional.style.input1.use */
+
+html {background-color: #eee;}
+#main {padding-top: 0;}
+h1 {text-shadow: 0 -1px 1px #000;}
+h2, h2 a {text-shadow: 0 2px 3px #bbb;}
+legend {color: #487397;}
+#headerContainer {background-color: #164369;background-image: url("../images/WoltLab Blue Sunrise/header.jpg");background-repeat: repeat-x;background-position: left top;}
+#header {border-width: 0 !important;}
+#logo {margin: 0;border-width: 0 !important;}
+#userPanel {background-image: url("../images/WoltLab Blue Sunrise/userPanel.png");background-repeat: repeat-x;background-position: left bottom;max-width: 100%;min-width: 100%;width: 100%;}
+.userPanelInner {max-width: 80%;min-width: 770px;margin: 0 auto;}
+.userPanel, .userPanel a {color: #ebf1f6;}
+.userPanel a:hover {color: #fff;}
+.userPanel .border, .userPanel .popupMenu a {color: #57595a;}
+#search {right: 0;top: 23px;}
+#search .searchContainer {text-align: center;background-color: transparent;background-image: url("../images/WoltLab Blue Sunrise/searchContainer.png");background-repeat: no-repeat;background-position: right top;padding-left: 40px;min-height: 24px;}
+#mainMenu {max-width: 100%;min-width: 100%;width: 100%;}
+.mainMenu {min-height: 31px;background-color: transparent;background-image: url("../images/WoltLab Blue Sunrise/menuBar.png");background-repeat: repeat-x;background-position: left bottom;padding-bottom: 6px;border-width: 0 !important;}
+.mainMenu .mainMenuInner {max-width: 80%;min-width: 770px;margin: 0 auto;border-width: 0 !important;}
+.mainMenu a {text-shadow: 0 1px 0 #fff;border: 1px solid #c2c2c2;border-width: 0 1px 1px 1px;padding: 3px 5px 4px 5px;line-height: 1;}
+.mainMenu a:hover {background-image: url("../images/WoltLab Blue Sunrise/menuHover.png");}
+.mainMenu .active a, .mainMenu .firstActive a, .mainMenu .lastActive a {text-shadow: 0 -1px 0 #036;background-image: url("../images/WoltLab Blue Sunrise/menuActive.png") !important;}
+#mainMenu span {position: relative;top: 5px;}
+.mainMenu img {float: left;padding-right: 4px;}
+#footerContainer {background-color: #eee;border-top: 1px solid #8da4b7;}
+#footer {border: 0 !important;}
+.pageNavigation a:hover {background-image: url("../images/WoltLab Blue Sunrise/smallButtonsHover.png");}
+.messageLeft, .messageRight, .messageFramedLeft, .messageFramedRight, .messageTop, .messageFramedTop {background-image: url("../images/WoltLab Blue Sunrise/messageSidebar.jpg");background-repeat: repeat-x;}
+.userName a span, .quickReply h3 a {text-shadow: 0 1px 0 #fff;}
+.poll .pollQuestion {background-image: url("../images/WoltLab Blue Sunrise/poll.jpg");background-repeat: repeat-x;}
+.threadStarterPost .messageLeft, .threadStarterPost .messageRight, .threadStarterPost .messageFramedLeft, .threadStarterPost .messageFramedRight, .threadStarterPost .messageTop, .threadStarterPost .messageFramedTop {background-image: url("../images/WoltLab Blue Sunrise/messageSidebarThreadStarter.jpg");background-repeat: repeat-x;}
+.threadStarterPost .container-3 {background-color: #ffddb7;}
+.threadStarterPost .codeBox .container-3 {background-color: #d8e7f5;}
+.firstPost a {color: #858789;}
+.smallButtons span {text-shadow: 0 1px 0 #fff;}
+.largeButtons a {line-height: 1;background-image: url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png");background-position: right 0;background-repeat: no-repeat;padding: 0 7px 0 0;}
+.largeButtons a img {margin-top: 5px;margin-left: 7px;position: absolute;}
+.largeButtons a span {color: #fff;text-shadow: 0 -1px 0 #036;background-image: url("../images/WoltLab Blue Sunrise/largeButtons-ltr.png");background-position: left 0;background-repeat: no-repeat;padding: 9px 3px 0 36px;display: block;height: 25px;cursor: pointer;}
+.largeButtons a:hover {background-position: right -86px;}
+.largeButtons a:hover span {color: #000;text-shadow: 0 1px 0 #fff;background-position: left -86px;}
+.tabMenu a span, .tabMenu li.disabled a span {text-shadow: 0 1px 0 #fff;}
+.tabMenu .activeTabMenu a span, .tabMenu a:hover span, .subTabMenu a span {text-shadow: 0 -1px 0 #036;}
+.containerHead, .containerHead a {text-shadow: 0 -1px 0 #036;}
+.subHeadline {text-shadow: 0 1px 0 #fff;}
+.memberList li span {text-shadow: 0 1px 0 #fff;}
+.galleryIndex li span {text-shadow: 0 1px 0 #fff;}
+select, textarea, input[type="text"], input[type="password"] {border-width: 1px;border-style: solid;border-color: #666 #999 #ccc #999;background-image: url("../images/WoltLab Blue Sunrise/inputBackground.png");background-position: left top;background-repeat: repeat-x;min-height: 13px;}
+select, textarea:focus, input[type="text"]:focus, input[type="password"]:focus {background-image: url("../images/WoltLab Blue Sunrise/inputBackground.png");background-repeat: repeat-x;outline: 0;}
+
+/* user.additional.style.input2.use */
+
+* {-o-text-overflow: ellipsis;}
+.message, .messageInner, .quoteBox, fieldset, .info, .success, .warning, .error, .help, #userCard, .userCardInner, .second .border, .second .border .content, .avatarSelect li.container-4, .avatarSelect li label, .floatedElement, .popupMenu, .loginPopup, .loginPopup .container-1 {-webkit-border-radius: 5px; -moz-border-radius: 5px;}
+.messageLeft .messageContent, .messageLeft .messageContentInner {-webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px;}
+.messageRight .messageContent, .messageRight .messageContentInner {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;}
+.messageFramedLeft .messageContent, .messageFramedLeft .messageContentInner, .messageFramedRight .messageContent, .messageFramedRight .messageContentInner {-webkit-border-radius: 5px; -moz-border-radius: 5px;}
+.messageTop .messageContent, .messageTop .messageContentInner {-webkit-border-radius: 0; -moz-border-radius: 0;}
+.messageFramedTop .messageContent, .messageFramedTop .messageContentInner {-webkit-border-radius: 5px; -moz-border-radius: 5px;}
+textarea, select, input[type="text"], input[type="password"], .memberList li, .smallButtons > ul > li, .smallButtons > ul > li > a, .extraButton, .extraButton a, .optionButtons > ul > li, .optionButtons > ul > li > a, .subTabMenu .containerHead li a, .pmUsageBar, .statBar, .userAvatarFramed, .userAvatarFramed a, .userAvatarFramed img {-webkit-border-radius: 3px; -moz-border-radius: 3px;}
+.pmUsageBar > div, .statBar > div {-webkit-border-radius: 1px; -moz-border-radius: 1px;}
+.popupMenu li:first-child a, #boardlist .border, .titleBarPanel, .titleBarPanel .containerHead, .messagePreview, .subTabMenu, .subTabMenu .containerHead, .containerHead, .messageTop .messageSidebar, .messageFramedTop .messageSidebar, .thumbnailButtons {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px;}
+.codeBox {-webkit-border-top-left-radius: 3px; -webkit-border-top-right-radius: 3px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px;}
+.tabMenu li:first-child, .tabMenu li:first-child a {-webkit-border-top-left-radius: 5px; -moz-border-radius-topleft: 5px;}
+.tabMenu li:last-child, .tabMenu li:last-child a {-webkit-border-top-right-radius: 5px; -moz-border-radius-topright: 5px;}
+.searchInputMenu .pageMenu, .popupMenu li:last-child a, .twoRows li:last-child {-webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px;}
+#boardlist .border .boardlistInner, .twoRows li:last-child a, .datalist li:last-child {-webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px; -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;}
+.popupMenu li a, #boardlist .border .boardlistInner:first-child {-webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0;}
+.mceToolbar .popupMenu, .mceToolbar .popupMenu li, .mceToolbar .popupMenu li a, .second fieldset .editor, .second fieldset .border, .attachmentPreview, .attachmentPreview li, .tableList td.containerHead {-webkit-border-top-left-radius: 0 !important; -webkit-border-top-right-radius: 0 !important; -webkit-border-bottom-right-radius: 0 !important; -moz-border-radius-topleft: 0 !important; -webkit-border-bottom-left-radius: 0 !important; -moz-border-radius-topright: 0 !important; -moz-border-radius-bottomleft: 0 !important; -moz-border-radius-bottomright: 0 !important;}
+.loginPopup input#quickLoginUsername {-webkit-border-top-right-radius: 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-topright: 0; -moz-border-radius-bottomright: 0;}
+.loginPopup input#quickLoginPassword {-webkit-border-top-left-radius: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-topleft: 0; -moz-border-radius-bottomleft: 0;}
+input#searchInput {-webkit-border-radius: 12px; -moz-border-radius: 12px;}
+#searchInput {background-image: url("../images/WoltLab Blue Sunrise/searchBack-ltr.png"); background-position: -2px top; padding-left: 33px; width: 154px; height: 16px;}
+.searchOptions {background-image: url("../images/WoltLab Blue Sunrise/searchBackOptions-ltr.png") !important;}
+.searchOptions:focus {background-image: url("../images/WoltLab Blue Sunrise/searchBackOptionsActive-ltr.png") !important;}
+.galleryPhotoEdit img, .galleryAlbumCover img {-webkit-box-shadow: 0 3px 7px #666; -moz-box-shadow: 0 3px 7px #666;}
+.galleryIndex li.floatedElement .thumbnail img, .squared .thumbnail img {-webkit-box-shadow: 0 1px 3px #666; -moz-box-shadow: 0 1px 3px #666;}
+.galleryIndex li.floatedElement:hover, .avatarSelect li label:hover {-webkit-box-shadow: 0 1px 3px #999; -moz-box-shadow: 0 1px 3px #999;}
+.galleryPhoto img {-webkit-box-shadow: 0 3px 7px #666; -moz-box-shadow: 0 3px 7px #666; margin: 10px;}
+.imageViewerCurrentImage {-webkit-box-shadow: 0 3px 23px #000; -moz-box-shadow: 0 3px 23px #000;}
-/* http://meyerweb.com/eric/tools/css/reset/ \r
- v2.0 | 20110126\r
- License: none (public domain)\r
-*/\r
-\r
-html, body, div, span, applet, object, iframe,\r
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,\r
-a, abbr, acronym, address, big, cite, code,\r
-del, dfn, em, img, ins, kbd, q, s, samp,\r
-small, strike, strong, sub, sup, tt, var,\r
-b, u, i, center,\r
-dl, dt, dd, ol, ul, li,\r
-fieldset, form, label, legend,\r
-table, caption, tbody, tfoot, thead, tr, th, td,\r
-article, aside, canvas, details, embed, \r
-figure, figcaption, footer, header, hgroup, \r
-menu, nav, output, ruby, section, summary,\r
-time, mark, audio, video {\r
- margin: 0;\r
- padding: 0;\r
- border: 0;\r
- font-size: 100%;\r
- font: inherit;\r
- /* vertical-align: baseline; disabled by WoltLab, does not fit our needs */\r
-}\r
-/* HTML5 display-role reset for older browsers */\r
-article, aside, details, figcaption, figure, \r
-footer, header, hgroup, menu, nav, section {\r
- display: block;\r
-}\r
-body {\r
- line-height: 1;\r
-}\r
-ol, ul {\r
- list-style: none;\r
-}\r
-blockquote, q {\r
- quotes: none;\r
-}\r
-blockquote:before, blockquote:after,\r
-q:before, q:after {\r
- content: '';\r
- content: none;\r
-}\r
-table {\r
- border-collapse: collapse;\r
- border-spacing: 0;\r
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ /* vertical-align: baseline; disabled by WoltLab, does not fit our needs */
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
}
\ No newline at end of file
-/**\r
- * ACP Testing Styles \r
- *\r
- * @author Harald Szekely, Alexander Ebert, Marcel Werk \r
- * @copyright 2011 WoltLab GmbH \r
- */\r
-\r
-\r
-\r
-/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */\r
-\r
-* {\r
- text-overflow: ellipsis;\r
-}\r
-\r
-body {\r
- font-family: 'Trebuchet MS', Arial, sans-serif;\r
- font-size: .8em;\r
- \r
- background-color: #29374a;\r
-}\r
-\r
-img {\r
- vertical-align: middle !important;\r
-}\r
-\r
-a {\r
- color: #369;\r
- text-decoration: none;\r
- \r
- -webkit-transition: color .1s linear;\r
- -moz-transition: color .1s linear;\r
- -ms-transition: color .1s linear;\r
- -o-transition: color .1s linear;\r
- transition: color .1s linear;\r
-}\r
-\r
-a:hover {\r
- color: #036;\r
- text-decoration: underline;\r
-}\r
-\r
-section#content a {\r
- color: #999;\r
-}\r
-\r
-section#content a:hover {\r
- color: #333;\r
-}\r
-\r
-.invisible {\r
- position: absolute;\r
- left: -9000px;\r
- top: -9000px;\r
-}\r
-\r
-hr {\r
- display: none;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Header -- -- -- -- -- */\r
-\r
-header.pageHeader {\r
- /*\r
- background-image: url("../images/header.png");\r
- background-position: left top;\r
- background-repeat: repeat-x;\r
- */\r
- min-width: 800px;\r
- width: 100%;\r
-}\r
-\r
-/* Top Menu */\r
-\r
-header.pageHeader nav.topMenu {\r
- position: absolute;\r
- top: 0;\r
- right: 0;\r
- left: 0;\r
- min-height: 25px;\r
- z-index: 10;\r
- background-color: rgba(0, 0, 0, .4);\r
- \r
- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
- -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
- -ms-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
- -o-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
- box-shadow: 0 3px 7px rgba(0, 0, 0, .3);\r
-}\r
-\r
-header.pageHeader nav.topMenu > div {\r
- padding: 5px 23px 3px;\r
- \r
-}\r
-\r
-header.pageHeader nav.topMenu ul {\r
- \r
-}\r
-\r
-header.pageHeader nav.topMenu ul li, header.pageHeader nav.topMenu ul li a {\r
- color: #69c;\r
- text-shadow: 0 -1px 0 #000;\r
-}\r
-\r
-header.pageHeader nav.topMenu ul li a:hover {\r
- color: #fff;\r
-}\r
-\r
-/* Logo */\r
-\r
-header.pageHeader div#logo {\r
- position: relative;\r
- z-index: 1;\r
- margin: 0 23px 0;\r
-}\r
-\r
-header.pageHeader div#logo h1 {\r
- color: #d8e7f5;\r
- text-shadow: 0 -1px 0 #000;\r
- font-size: 150%;\r
- position: relative;\r
- top: 70px;\r
-}\r
-\r
-header.pageHeader div#logo a:hover {\r
- color: #d8e7f5;\r
- text-decoration: none !important;\r
-}\r
-\r
-header.pageHeader div#logo img {\r
- position: absolute;\r
- left: 0;\r
- bottom: 10px;\r
-}\r
-\r
-header.pageHeader div#logo a {\r
- display: block;\r
- height: 110px;\r
- text-align: right;\r
-}\r
-\r
-/* Main Menu */\r
-\r
-nav.mainMenu {\r
- margin: 0 30px;\r
- background-color: rgba(0, 0, 0, .4);\r
- border-radius: 5px 5px 0 0;\r
- display: table;\r
- position: relative;\r
- bottom: -5px;\r
-}\r
-\r
-nav.mainMenu:after {\r
- content: "";\r
- display: block;\r
- clear: both;\r
-}\r
-\r
-nav.mainMenu ul {\r
- display: table-row;\r
-}\r
-\r
-nav.mainMenu li {\r
- font-size: 123%;\r
- font-weight: normal;\r
- color: #69c;\r
- text-shadow: 0 -1px 0 #000;\r
- cursor: pointer;\r
- display: table-cell;\r
- margin: 5px -5px 0;\r
- padding: 13px 20px;\r
- position: relative;\r
- top: -3px;\r
- z-index: 1;\r
- \r
- border-top-left-radius: 5px;\r
- border-top-right-radius: 5px;\r
- \r
- -webkit-transition: all .2s linear;\r
- -moz-transition: all .2s linear;\r
- -ms-transition: all .2s linear;\r
- -o-transition: all .2s linear;\r
- transition: all .2s linear;\r
-}\r
-\r
-nav.mainMenu li:hover {\r
- color: #fff;\r
-}\r
-\r
-nav.mainMenu li.activeMenuItem {\r
- font-weight: bold;\r
- color: #369;\r
- text-shadow: 0 1px 0 #fff;\r
- z-index: 10;\r
- \r
- background-color: #e7f2fd;\r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#e7f2fd));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #fff, #e7f2fd);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#e7f2fd));\r
- background-image: -o-linear-gradient(#fff, #e7f2fd);\r
- background-image: linear-gradient(#fff, #e7f2fd);\r
- \r
-}\r
-\r
-/* Header Navigation */\r
-\r
-nav.headerNavigation {\r
- display: block;\r
- background-color: #e7f2fd;\r
- border-bottom: 1px solid #bcd;\r
- \r
- border-top-left-radius: 3px;\r
- border-top-right-radius: 3px;\r
- \r
- margin: 0 23px;\r
- padding: 3px 7px;\r
- position: relative;\r
-}\r
-\r
-nav.headerNavigation:after {\r
- content: "";\r
- display: block;\r
- clear: both;\r
-}\r
-\r
-nav.headerNavigation ul {\r
- display: block;\r
-}\r
-\r
-nav.headerNavigation ul li {\r
- float: right;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Main -- -- -- -- -- */\r
-\r
-div.main {\r
- margin: 0 23px 0;\r
- border-collapse: collapse;\r
- display: table;\r
- table-layout: fixed;\r
-}\r
-\r
-div.main > div {\r
- display: table-row;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Content -- -- -- -- -- */\r
-\r
-section#content {\r
- background-color: #fff;\r
- \r
- display: table-cell;\r
- padding: 25px;\r
- width: 100%;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Sidebar -- -- -- -- -- */\r
-\r
-aside.sidebar {\r
- display: table-cell;\r
- background-color: #d8e7f5;\r
- margin: 0 !important;\r
- padding: 0 !important;\r
-}\r
-\r
-/* Sidebar Menu */\r
-\r
-nav.sidebarMenu {\r
- white-space: nowrap;\r
- padding-bottom: 20px;\r
-}\r
-\r
-nav.sidebarMenu > div {\r
- position: relative;\r
- color: #69c;\r
- text-shadow: 0 1px 0 #fff;\r
-}\r
-\r
-nav.sidebarMenu > div a {\r
- color: #69c;\r
- text-shadow: 0 1px 0 #fff;\r
-}\r
-\r
-nav.sidebarMenu > div a:hover {\r
- color: #369;\r
- text-decoration: none !important;\r
-}\r
-\r
-nav.sidebarMenu > div h1 {\r
- background-image: url("../../icon/arrowRightS.png");\r
- background-position: 15px center;\r
- background-repeat: no-repeat;\r
- color: #369;\r
- cursor: pointer;\r
- font-size: 130%;\r
- font-weight: bold;\r
- margin-top: 5px;\r
- padding: 7px 25px 7px 35px;\r
- position: relative;\r
-}\r
-\r
-nav.sidebarMenu > div h1.activeMenuItem {\r
- background-image: url("../../icon/arrowDownS.png");\r
-}\r
-\r
-nav.sidebarMenu > div ul li {\r
- font-size: 110%;\r
- padding: 5px 25px 7px 35px;\r
-}\r
-\r
-nav.sidebarMenu > div ul li.activeMenuItem {\r
- background-color: #fff;\r
-}\r
-\r
-nav.sidebarMenu > div ul li.activeMenuItem a {\r
- color: #369;\r
- font-weight: bold;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Footer -- -- -- -- -- */\r
-\r
-footer {\r
- clear: both;\r
- padding: 0 23px;\r
- position: relative;\r
- text-align: center;\r
-}\r
-\r
-footer:after {\r
- content: "";\r
- display: block;\r
- clear: both;\r
-}\r
-\r
-footer > div {\r
- background-color: #e7f2fd;\r
- border-top: 1px solid #bcd;\r
- \r
- border-bottom-left-radius: 3px;\r
- border-bottom-right-radius: 3px;\r
- \r
- clear: both;\r
- padding: 3px 7px;\r
-}\r
-\r
-footer > div:after {\r
- content: "";\r
- display: block;\r
- clear: both;\r
-}\r
-\r
-footer p.copyright {\r
- padding-top: 20px;\r
- min-height: 40px;\r
-}\r
-\r
-footer p.copyright a {\r
- text-shadow: 0 -1px 0 #000;\r
-}\r
-\r
-footer p.copyright a:hover {\r
- color: #69c;\r
- text-decoration: none;\r
-}\r
-\r
-/* Footer Navigation */\r
-\r
-footer nav.footerNavigation {\r
- \r
-}\r
-\r
-footer nav.footerNavigation ul li {\r
- display: inline-block;\r
- float: right;\r
-}\r
-\r
-\r
-\r
-div.wcfDimensions {\r
- display: inline-block;\r
-}\r
-\r
-div.overlayLoading {\r
- background-color: #fff;\r
- background-image: url("../../images/spinner.gif");\r
- background-position: center center;\r
- background-repeat: no-repeat;\r
-}\r
-\r
-div.ui-dialog {\r
- border: 10px solid rgba(0,0,0,.2);\r
- border-radius: 15px;\r
- display: inline-block !important;\r
- width: auto !important;\r
- min-width: 80px;\r
-}\r
-\r
-div.ui-dialog-content p {\r
- background-color: #fff;\r
- padding: 7px;\r
-}\r
-\r
-div.ui-dialog-titlebar {\r
- background-color: #ccc;\r
- border-bottom: 5px solid rgba(0,0,0,.6);\r
- padding: 7px;\r
- position: relative;\r
-}\r
-\r
-span.ui-dialog-title {\r
- color: #fff;\r
- text-shadow: 5px 0 0 #000;\r
-}\r
-\r
-a.ui-dialog-titlebar-close {\r
- background-image: url("../../icon/deleteM.png");\r
- background-position: top left;\r
- background-repeat: no-repeat;\r
- height: 24px;\r
- position: absolute !important;\r
- right: -16px;\r
- top: -16px;\r
- width: 24px;\r
-}\r
-\r
-a.ui-dialog-titlebar-close span {\r
- display: none;\r
- visibility: hidden;\r
-}\r
-\r
-div.ui-widget-overlay {\r
- background-color: #000;\r
- left: 0;\r
- opacity: .6;\r
- position: fixed;\r
- top: 0;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Headings -- -- -- -- -- */\r
-\r
-/* Main Heading */\r
-\r
-.mainHeading {\r
- margin-bottom: 15px;\r
- position: relative;\r
-}\r
-\r
-.mainHeading img {\r
- position: absolute;\r
- top: 0;\r
- left: 0;\r
- width: 48px;\r
- height: 48px;\r
-}\r
-\r
-.mainHeading > hgroup {\r
- height: 48px;\r
- padding-left: 60px;\r
- vertical-align: middle;\r
-}\r
-\r
-.mainHeading > hgroup h1 {\r
- border-bottom: 1px solid #999;\r
- color: #999;\r
- text-shadow: 0 1px 0 #fff;\r
- font-size: 140%;\r
- font-weight: bold;\r
- padding-bottom: 10px;\r
-}\r
-\r
-.mainHeading > hgroup p {\r
- padding-top: 3px;\r
-} \r
-\r
-/* Sub Heading */\r
-\r
-.subHeading {\r
- border-bottom: 1px solid #999;\r
- font-size: 120%;\r
- text-shadow: 0 1px 0 #fff;\r
- margin: 14px 0 14px;\r
- padding: 15px;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Fieldsets -- -- -- -- -- */\r
-\r
-fieldset {\r
- border: 1px solid #ccc;\r
- border-radius: 10px;\r
- margin: 7px 0 7px;\r
- padding: 14px;\r
-}\r
-\r
-fieldset legend {\r
- color: #999;\r
- padding: 0 7px 0;\r
-}\r
-\r
-fieldset p.description {\r
- color: #369;\r
- font-size: 90%;\r
-}\r
-\r
-fieldset > ul {\r
- margin: 7px 0 21px 21px;\r
-}\r
-\r
-fieldset > ul li {\r
- list-style-type: circle;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Forms -- -- -- -- -- */\r
-\r
-/* Structure */\r
-\r
-div.formElement {\r
- clear: both;\r
- margin-bottom: 14px;\r
-}\r
-\r
-div.formFieldLabel {\r
- float: left;\r
- text-align: right;\r
- width: 230px;\r
-}\r
-\r
-div.formField {\r
- margin-left: 250px;\r
-}\r
-\r
-div.formFieldDesc {\r
- color: #777;\r
- font-size: 90%;\r
- margin: 3px 0 7px 250px;\r
-}\r
-\r
-div.formGroupLabel label {\r
- display: none;\r
-}\r
-\r
-div.formGroupField div.formField label {\r
- display: block;\r
-}\r
-\r
-/* Form Elements */\r
-\r
-input {\r
- border: 1px solid #ccc;\r
-}\r
-\r
-input:hover {\r
- border: 1px solid #369;\r
-}\r
-\r
-\r
-\r
-\r
-.border {\r
- border: 1px solid #ccc;\r
- border-radius: 5px;\r
- margin: 14px 0 14px;\r
-}\r
-\r
-.borderMarginRemove {\r
- border-radius: 0 0 5px 5px;\r
- margin-top: 0;\r
-}\r
-\r
-.titleBarPanel {\r
- background-color: #eee;\r
- border-radius: 5px 5px 0 0;\r
- border-bottom-width: 0;\r
- margin-bottom: 0;\r
- padding: 7px;\r
-}\r
-\r
-.tabMenuContent,\r
-.content {\r
- border-width: 0 !important;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Tables -- -- -- -- -- */\r
-\r
-table {\r
- border-radius: 0 0 5px 5px;\r
- width: 100% !important;\r
-}\r
-\r
-th {\r
- background-color: #fefefe;\r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
- background-image: -o-linear-gradient(#fefefe, #eee);\r
- background-image: linear-gradient(#fefefe, #eee);\r
- \r
- border-right: 1px solid #fff;\r
- border-bottom: 1px solid #fff;\r
- padding: 7px;\r
-}\r
-\r
-th.active {\r
- background-color: #faebd7;\r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#faebd7), to(#fa0));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #faebd7, #fa0);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#faebd7), to(#fa0));\r
- background-image: -o-linear-gradient(#faebd7, #fa0);\r
- background-image: linear-gradient(#faebd7, #fa0);\r
-}\r
-\r
-th.active:hover {\r
- background-color: #fa0;\r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fa0), to(#faebd7));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #fa0, #faebd7);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fa0), to(#faebd7));\r
- background-image: -o-linear-gradient(#fa0, #faebd7);\r
- background-image: linear-gradient(#fa0, #faebd7);\r
-}\r
-\r
-th:hover {\r
- background-color: #fefefe;\r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
- background-image: -o-linear-gradient(#eee, #fefefe);\r
- background-image: linear-gradient(#eee, #fefefe);\r
-}\r
-\r
-th:last-child {\r
- border-right-width: 0;\r
-}\r
-\r
-th {\r
- font-size: 85%;\r
-}\r
-\r
-th a {\r
- color: #999;\r
- display: block;\r
- text-decoration: none;\r
-}\r
-\r
-th a:hover {\r
- color: #333 !important;\r
- text-shadow: 0 1px 0 #fff;\r
- text-decoration: none !important;\r
-}\r
-\r
-td {\r
- border-right: 1px solid #fff;\r
- padding: 5px;\r
-}\r
-\r
-td:last-child {\r
- border-right-width: 0;\r
-}\r
-\r
-tbody tr {\r
- border-bottom: 1px solid #fff;\r
-}\r
-\r
-tbody tr:last-child {\r
- border-bottom-width: 0;\r
-}\r
-\r
-tr.container-1:hover td,\r
-tr.container-2:hover td {\r
- background-color: #ddd;\r
-}\r
-\r
-tr.container-1 td {\r
- background-color: #fefefe;\r
-}\r
-\r
-tr.container-2 td {\r
- background-color: #eee;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Page Navigation -- -- -- -- -- */\r
-\r
-.pageNavigation ul li {\r
- display: inline-block;\r
-}\r
-\r
-.pageNavigation ul li:not(.skip) {\r
- background-color: #eee;\r
- border: 1px solid #ccc;\r
- padding: 3px;\r
-}\r
-\r
-.pageNavigation ul li.active,\r
-.pageNavigation ul li:not(.skip):hover {\r
- background-color: #faebd7;\r
- border-color: #f80;\r
- color: #f80;\r
-}\r
-\r
-.pageNavigation ul li a {\r
- text-decoration: none;\r
-}\r
-\r
-.pageNavigation ul li:not(.skip):hover a {\r
- color: #f80;\r
-}\r
-\r
-.pageNavigation ul li.skip {\r
- vertical-align: middle;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Large Buttons -- -- -- -- -- */\r
-\r
-nav.largeButtons {\r
- text-align: right;\r
-}\r
-\r
-nav.largeButtons ul li {\r
- display: inline;\r
-}\r
-\r
-input[type='reset'],\r
-input[type='submit'],\r
-nav.largeButtons ul li a {\r
- background-color: #fefefe;\r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
- background-image: -o-linear-gradient(#fefefe, #eee);\r
- background-image: linear-gradient(#fefefe, #eee);\r
- \r
- border: 1px solid #ccc;\r
- border-radius: 30px;\r
- display: inline-block;\r
- padding: 5px 13px;\r
-}\r
-\r
-input[type='reset']:hover,\r
-input[type='submit']:hover,\r
-nav.largeButtons ul li a:hover {\r
- background-color: #fefefe;\r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
- background-image: -o-linear-gradient(#eee, #fefefe);\r
- background-image: linear-gradient(#eee, #fefefe);\r
- \r
- text-decoration: none;\r
-}\r
-\r
-nav.largeButtons ul li a img {\r
- vertical-align: middle;\r
-}\r
-\r
-.formSubmit {\r
- text-align: center;\r
-}\r
-\r
-input[type='reset'],\r
-input[type='submit'] {\r
- cursor: pointer;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-div#packageInstallationDialogContainer {\r
- background-color: #fefefe;\r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
- background-image: -o-linear-gradient(#fefefe, #eee);\r
- background-image: linear-gradient(#fefefe, #eee);\r
- \r
- height: 100%;\r
- max-width: 600px;\r
- padding: 21px;\r
-}\r
-\r
-div#ajaxExceptionStacktrace {\r
- overflow: scroll;\r
- overflow-y: hidden;\r
- white-space: nowrap;\r
-}\r
-\r
-div#packageInstallationInnerContentContainer {\r
- border-top: 2px solid #999 !important;\r
- border-radius: 0 !important;\r
- margin-top: 21px;\r
- padding-top: 14px;\r
-}\r
-\r
-div#packageInstallationInnerContent p.error {\r
- background-color: #fdd;\r
- border: 3px solid #ed1c24;\r
- border-radius: 5px;\r
- margin-bottom: 14px;\r
- padding: 7px;\r
-}\r
-\r
-div#ajaxExceptionStacktrace {\r
- border: 1px solid #ccc;\r
- font-family: monospace;\r
- font-size: 90%;\r
- line-height: 1.2em;\r
- padding: 3px;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- System Notifications -- -- -- -- -- */\r
-\r
-p.info,\r
-p.error,\r
-p.success,\r
-p.warning {\r
- border-radius: 7px;\r
- margin-bottom: 14px;\r
- padding: 7px 14px;\r
-}\r
-\r
-p.info {\r
- background-color: #def;\r
- border: 1px solid #06f;\r
-}\r
-\r
-p.success {\r
- background-color: #efe;\r
- border: 1px solid #090;\r
-}\r
-\r
-p.error {\r
- background-color: #fee;\r
- border: 1px solid #c00;\r
-}\r
-\r
-p.warning {\r
- background-color: #ffd;\r
- border: 1px solid #660;\r
-}\r
-\r
-\r
-\r
-\r
-#actionProxyLoading {\r
- background-color: #faebd7;\r
- border: 1px solid #f80;\r
- border-top-width: 0;\r
- border-radius: 0 0 5px 5px;\r
- left: 43%;\r
- padding: 7px 21px 7px;\r
- position: fixed;\r
- top: 0;\r
-}\r
-\r
-fieldset legend ~ p {\r
- margin-bottom: 14px;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Tabbed Content -- -- -- -- -- */\r
-\r
-dl {\r
- clear: both;\r
- margin-bottom: 7px;\r
-}\r
-\r
-dt { /* is op */\r
- float: left;\r
- text-align: right;\r
- width: 230px;\r
-}\r
-\r
-dd {\r
- margin-left: 250px;\r
-}\r
-\r
-dl dd ~ p {\r
- color: #777;\r
- font-size: 90%;\r
- margin: 3px 0 7px 250px;\r
-}\r
-\r
-dl.disabled dt {\r
- color: #777;\r
-}\r
-\r
-\r
-\r
-/* -- -- -- -- -- Taken from jQuery UI @ themes/base/jquery.ui.tabs.css -- -- -- -- -- */\r
-\r
-.ui-tabs {\r
- position: relative; /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */\r
- padding: 3px;\r
- zoom: 1;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav {\r
- height: 18px !important; /* Fixes a clearing problem */\r
- margin: 0 3px;\r
- background-color: none;\r
- padding: 3px 3px 0;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li {\r
- list-style: none;\r
- float: left;\r
- position: relative;\r
- top: 1px;\r
- margin: 0 3px 1px 0;\r
- border-bottom: 0 !important;\r
- padding: 0;\r
- white-space: nowrap;\r
- z-index: 90; /* Prevents border overlay during transition */\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li a {\r
- background-color: #fefefe;\r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));\r
- background-image: -o-linear-gradient(#fefefe, #eee);\r
- background-image: linear-gradient(#fefefe, #eee);\r
- \r
- border: 1px solid #ccc;\r
- border-bottom-width: 0;\r
-\r
- border-top-left-radius: 3px;\r
- border-top-right-radius: 3px;\r
- \r
- float: left;\r
- padding: 7px 14px;\r
- text-decoration: none;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected {\r
- margin-bottom: 0;\r
- padding-bottom: 1px;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a {\r
- background-color: #fefefe; \r
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
- background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);\r
- background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));\r
- background-image: -o-linear-gradient(#eee, #fefefe);\r
- background-image: linear-gradient(#eee, #fefefe);\r
- \r
- border-bottom: 1px solid #fefefe;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,\r
-.ui-tabs .ui-tabs-nav li.ui-state-disabled a,\r
-.ui-tabs .ui-tabs-nav li.ui-state-processing a {\r
- cursor: default;\r
-}\r
-\r
-.ui-tabs .ui-tabs-nav li a,\r
-.ui-tabs .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a {\r
- cursor: pointer;\r
-}\r
-\r
-.ui-tabs .ui-tabs-panel {\r
- background-color: #fefefe;\r
- border: 1px solid #ccc !important;\r
- z-index: 89; /* Prevents border overlay during transition */\r
- display: block;\r
- padding: 14px 21px;\r
-}\r
-\r
-.ui-tabs .ui-tabs-hide {\r
- display: none !important;\r
-}\r
-\r
-.ui-helper-hidden {\r
- display: none;\r
-}\r
-\r
-.ui-helper-hidden-accessible {\r
- position: absolute !important;\r
- clip: rect(1px 1px 1px 1px);\r
- clip: rect(1px,1px,1px,1px);\r
-}\r
-\r
-.ui-helper-reset {\r
- margin: 0;\r
- padding: 0;\r
- border: 0;\r
- outline: 0;\r
- line-height: 1.3;\r
- text-decoration: none;\r
- font-size: 100%;\r
- list-style: none;\r
-}\r
-\r
-.ui-helper-clearfix:after {\r
- content: "";\r
- display: block;\r
- height: 0;\r
- clear: both;\r
-}\r
-\r
-.ui-helper-clearfix {\r
- display: inline-block;\r
-}\r
-\r
-/* Required comment for clearfix to work in Opera \*/\r
-* html .ui-helper-clearfix {\r
- height: 1%;\r
-}\r
-\r
-.ui-helper-clearfix {\r
- display: block;\r
-}\r
-\r
-/* end clearfix */\r
-.ui-helper-zfix {\r
- width: 100%;\r
- height: 100%;\r
- top: 0;\r
- left: 0;\r
- position: absolute;\r
- opacity: 0;\r
- filter: Alpha(opacity=0);}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * ACP Testing Styles
+ *
+ * @author Harald Szekely, Alexander Ebert, Marcel Werk
+ * @copyright 2011 WoltLab GmbH
+ */
+
+
+
+/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */
+
+* {
+ text-overflow: ellipsis;
+}
+
+body {
+ font-family: 'Trebuchet MS', Arial, sans-serif;
+ font-size: .8em;
+
+ background-color: #29374a;
+}
+
+img {
+ vertical-align: middle !important;
+}
+
+a {
+ color: #369;
+ text-decoration: none;
+
+ -webkit-transition: color .1s linear;
+ -moz-transition: color .1s linear;
+ -ms-transition: color .1s linear;
+ -o-transition: color .1s linear;
+ transition: color .1s linear;
+}
+
+a:hover {
+ color: #036;
+ text-decoration: underline;
+}
+
+section#content a {
+ color: #999;
+}
+
+section#content a:hover {
+ color: #333;
+}
+
+.invisible {
+ position: absolute;
+ left: -9000px;
+ top: -9000px;
+}
+
+hr {
+ display: none;
+}
+
+
+
+/* -- -- -- -- -- Header -- -- -- -- -- */
+
+header.pageHeader {
+ /*
+ background-image: url("../images/header.png");
+ background-position: left top;
+ background-repeat: repeat-x;
+ */
+ min-width: 800px;
+ width: 100%;
+}
+
+/* Top Menu */
+
+header.pageHeader nav.topMenu {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ min-height: 25px;
+ z-index: 10;
+ background-color: rgba(0, 0, 0, .4);
+
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+ -ms-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+ -o-box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+ box-shadow: 0 3px 7px rgba(0, 0, 0, .3);
+}
+
+header.pageHeader nav.topMenu > div {
+ padding: 5px 23px 3px;
+
+}
+
+header.pageHeader nav.topMenu ul {
+
+}
+
+header.pageHeader nav.topMenu ul li, header.pageHeader nav.topMenu ul li a {
+ color: #69c;
+ text-shadow: 0 -1px 0 #000;
+}
+
+header.pageHeader nav.topMenu ul li a:hover {
+ color: #fff;
+}
+
+/* Logo */
+
+header.pageHeader div#logo {
+ position: relative;
+ z-index: 1;
+ margin: 0 23px 0;
+}
+
+header.pageHeader div#logo h1 {
+ color: #d8e7f5;
+ text-shadow: 0 -1px 0 #000;
+ font-size: 150%;
+ position: relative;
+ top: 70px;
+}
+
+header.pageHeader div#logo a:hover {
+ color: #d8e7f5;
+ text-decoration: none !important;
+}
+
+header.pageHeader div#logo img {
+ position: absolute;
+ left: 0;
+ bottom: 10px;
+}
+
+header.pageHeader div#logo a {
+ display: block;
+ height: 110px;
+ text-align: right;
+}
+
+/* Main Menu */
+
+nav.mainMenu {
+ margin: 0 30px;
+ background-color: rgba(0, 0, 0, .4);
+ border-radius: 5px 5px 0 0;
+ display: table;
+ position: relative;
+ bottom: -5px;
+}
+
+nav.mainMenu:after {
+ content: "";
+ display: block;
+ clear: both;
+}
+
+nav.mainMenu ul {
+ display: table-row;
+}
+
+nav.mainMenu li {
+ font-size: 123%;
+ font-weight: normal;
+ color: #69c;
+ text-shadow: 0 -1px 0 #000;
+ cursor: pointer;
+ display: table-cell;
+ margin: 5px -5px 0;
+ padding: 13px 20px;
+ position: relative;
+ top: -3px;
+ z-index: 1;
+
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+
+ -webkit-transition: all .2s linear;
+ -moz-transition: all .2s linear;
+ -ms-transition: all .2s linear;
+ -o-transition: all .2s linear;
+ transition: all .2s linear;
+}
+
+nav.mainMenu li:hover {
+ color: #fff;
+}
+
+nav.mainMenu li.activeMenuItem {
+ font-weight: bold;
+ color: #369;
+ text-shadow: 0 1px 0 #fff;
+ z-index: 10;
+
+ background-color: #e7f2fd;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#e7f2fd));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #fff, #e7f2fd);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#e7f2fd));
+ background-image: -o-linear-gradient(#fff, #e7f2fd);
+ background-image: linear-gradient(#fff, #e7f2fd);
+
+}
+
+/* Header Navigation */
+
+nav.headerNavigation {
+ display: block;
+ background-color: #e7f2fd;
+ border-bottom: 1px solid #bcd;
+
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+
+ margin: 0 23px;
+ padding: 3px 7px;
+ position: relative;
+}
+
+nav.headerNavigation:after {
+ content: "";
+ display: block;
+ clear: both;
+}
+
+nav.headerNavigation ul {
+ display: block;
+}
+
+nav.headerNavigation ul li {
+ float: right;
+}
+
+
+
+/* -- -- -- -- -- Main -- -- -- -- -- */
+
+div.main {
+ margin: 0 23px 0;
+ border-collapse: collapse;
+ display: table;
+ table-layout: fixed;
+}
+
+div.main > div {
+ display: table-row;
+}
+
+
+
+/* -- -- -- -- -- Content -- -- -- -- -- */
+
+section#content {
+ background-color: #fff;
+
+ display: table-cell;
+ padding: 25px;
+ width: 100%;
+}
+
+
+
+/* -- -- -- -- -- Sidebar -- -- -- -- -- */
+
+aside.sidebar {
+ display: table-cell;
+ background-color: #d8e7f5;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+
+/* Sidebar Menu */
+
+nav.sidebarMenu {
+ white-space: nowrap;
+ padding-bottom: 20px;
+}
+
+nav.sidebarMenu > div {
+ position: relative;
+ color: #69c;
+ text-shadow: 0 1px 0 #fff;
+}
+
+nav.sidebarMenu > div a {
+ color: #69c;
+ text-shadow: 0 1px 0 #fff;
+}
+
+nav.sidebarMenu > div a:hover {
+ color: #369;
+ text-decoration: none !important;
+}
+
+nav.sidebarMenu > div h1 {
+ background-image: url("../../icon/arrowRightS.png");
+ background-position: 15px center;
+ background-repeat: no-repeat;
+ color: #369;
+ cursor: pointer;
+ font-size: 130%;
+ font-weight: bold;
+ margin-top: 5px;
+ padding: 7px 25px 7px 35px;
+ position: relative;
+}
+
+nav.sidebarMenu > div h1.activeMenuItem {
+ background-image: url("../../icon/arrowDownS.png");
+}
+
+nav.sidebarMenu > div ul li {
+ font-size: 110%;
+ padding: 5px 25px 7px 35px;
+}
+
+nav.sidebarMenu > div ul li.activeMenuItem {
+ background-color: #fff;
+}
+
+nav.sidebarMenu > div ul li.activeMenuItem a {
+ color: #369;
+ font-weight: bold;
+}
+
+
+
+/* -- -- -- -- -- Footer -- -- -- -- -- */
+
+footer {
+ clear: both;
+ padding: 0 23px;
+ position: relative;
+ text-align: center;
+}
+
+footer:after {
+ content: "";
+ display: block;
+ clear: both;
+}
+
+footer > div {
+ background-color: #e7f2fd;
+ border-top: 1px solid #bcd;
+
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+
+ clear: both;
+ padding: 3px 7px;
+}
+
+footer > div:after {
+ content: "";
+ display: block;
+ clear: both;
+}
+
+footer p.copyright {
+ padding-top: 20px;
+ min-height: 40px;
+}
+
+footer p.copyright a {
+ text-shadow: 0 -1px 0 #000;
+}
+
+footer p.copyright a:hover {
+ color: #69c;
+ text-decoration: none;
+}
+
+/* Footer Navigation */
+
+footer nav.footerNavigation {
+
+}
+
+footer nav.footerNavigation ul li {
+ display: inline-block;
+ float: right;
+}
+
+
+
+div.wcfDimensions {
+ display: inline-block;
+}
+
+div.overlayLoading {
+ background-color: #fff;
+ background-image: url("../../images/spinner.gif");
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+
+div.ui-dialog {
+ border: 10px solid rgba(0,0,0,.2);
+ border-radius: 15px;
+ display: inline-block !important;
+ width: auto !important;
+ min-width: 80px;
+}
+
+div.ui-dialog-content p {
+ background-color: #fff;
+ padding: 7px;
+}
+
+div.ui-dialog-titlebar {
+ background-color: #ccc;
+ border-bottom: 5px solid rgba(0,0,0,.6);
+ padding: 7px;
+ position: relative;
+}
+
+span.ui-dialog-title {
+ color: #fff;
+ text-shadow: 5px 0 0 #000;
+}
+
+a.ui-dialog-titlebar-close {
+ background-image: url("../../icon/deleteM.png");
+ background-position: top left;
+ background-repeat: no-repeat;
+ height: 24px;
+ position: absolute !important;
+ right: -16px;
+ top: -16px;
+ width: 24px;
+}
+
+a.ui-dialog-titlebar-close span {
+ display: none;
+ visibility: hidden;
+}
+
+div.ui-widget-overlay {
+ background-color: #000;
+ left: 0;
+ opacity: .6;
+ position: fixed;
+ top: 0;
+}
+
+
+
+/* -- -- -- -- -- Headings -- -- -- -- -- */
+
+/* Main Heading */
+
+.mainHeading {
+ margin-bottom: 15px;
+ position: relative;
+}
+
+.mainHeading img {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 48px;
+ height: 48px;
+}
+
+.mainHeading > hgroup {
+ height: 48px;
+ padding-left: 60px;
+ vertical-align: middle;
+}
+
+.mainHeading > hgroup h1 {
+ border-bottom: 1px solid #999;
+ color: #999;
+ text-shadow: 0 1px 0 #fff;
+ font-size: 140%;
+ font-weight: bold;
+ padding-bottom: 10px;
+}
+
+.mainHeading > hgroup p {
+ padding-top: 3px;
+}
+
+/* Sub Heading */
+
+.subHeading {
+ border-bottom: 1px solid #999;
+ font-size: 120%;
+ text-shadow: 0 1px 0 #fff;
+ margin: 14px 0 14px;
+ padding: 15px;
+}
+
+
+
+/* -- -- -- -- -- Fieldsets -- -- -- -- -- */
+
+fieldset {
+ border: 1px solid #ccc;
+ border-radius: 10px;
+ margin: 7px 0 7px;
+ padding: 14px;
+}
+
+fieldset legend {
+ color: #999;
+ padding: 0 7px 0;
+}
+
+fieldset p.description {
+ color: #369;
+ font-size: 90%;
+}
+
+fieldset > ul {
+ margin: 7px 0 21px 21px;
+}
+
+fieldset > ul li {
+ list-style-type: circle;
+}
+
+
+
+/* -- -- -- -- -- Forms -- -- -- -- -- */
+
+/* Structure */
+
+div.formElement {
+ clear: both;
+ margin-bottom: 14px;
+}
+
+div.formFieldLabel {
+ float: left;
+ text-align: right;
+ width: 230px;
+}
+
+div.formField {
+ margin-left: 250px;
+}
+
+div.formFieldDesc {
+ color: #777;
+ font-size: 90%;
+ margin: 3px 0 7px 250px;
+}
+
+div.formGroupLabel label {
+ display: none;
+}
+
+div.formGroupField div.formField label {
+ display: block;
+}
+
+/* Form Elements */
+
+input {
+ border: 1px solid #ccc;
+}
+
+input:hover {
+ border: 1px solid #369;
+}
+
+
+
+
+.border {
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ margin: 14px 0 14px;
+}
+
+.borderMarginRemove {
+ border-radius: 0 0 5px 5px;
+ margin-top: 0;
+}
+
+.titleBarPanel {
+ background-color: #eee;
+ border-radius: 5px 5px 0 0;
+ border-bottom-width: 0;
+ margin-bottom: 0;
+ padding: 7px;
+}
+
+.tabMenuContent,
+.content {
+ border-width: 0 !important;
+}
+
+
+
+/* -- -- -- -- -- Tables -- -- -- -- -- */
+
+table {
+ border-radius: 0 0 5px 5px;
+ width: 100% !important;
+}
+
+th {
+ background-color: #fefefe;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+ background-image: -o-linear-gradient(#fefefe, #eee);
+ background-image: linear-gradient(#fefefe, #eee);
+
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ padding: 7px;
+}
+
+th.active {
+ background-color: #faebd7;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#faebd7), to(#fa0));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #faebd7, #fa0);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#faebd7), to(#fa0));
+ background-image: -o-linear-gradient(#faebd7, #fa0);
+ background-image: linear-gradient(#faebd7, #fa0);
+}
+
+th.active:hover {
+ background-color: #fa0;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fa0), to(#faebd7));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #fa0, #faebd7);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fa0), to(#faebd7));
+ background-image: -o-linear-gradient(#fa0, #faebd7);
+ background-image: linear-gradient(#fa0, #faebd7);
+}
+
+th:hover {
+ background-color: #fefefe;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+ background-image: -o-linear-gradient(#eee, #fefefe);
+ background-image: linear-gradient(#eee, #fefefe);
+}
+
+th:last-child {
+ border-right-width: 0;
+}
+
+th {
+ font-size: 85%;
+}
+
+th a {
+ color: #999;
+ display: block;
+ text-decoration: none;
+}
+
+th a:hover {
+ color: #333 !important;
+ text-shadow: 0 1px 0 #fff;
+ text-decoration: none !important;
+}
+
+td {
+ border-right: 1px solid #fff;
+ padding: 5px;
+}
+
+td:last-child {
+ border-right-width: 0;
+}
+
+tbody tr {
+ border-bottom: 1px solid #fff;
+}
+
+tbody tr:last-child {
+ border-bottom-width: 0;
+}
+
+tr.container-1:hover td,
+tr.container-2:hover td {
+ background-color: #ddd;
+}
+
+tr.container-1 td {
+ background-color: #fefefe;
+}
+
+tr.container-2 td {
+ background-color: #eee;
+}
+
+
+
+/* -- -- -- -- -- Page Navigation -- -- -- -- -- */
+
+.pageNavigation ul li {
+ display: inline-block;
+}
+
+.pageNavigation ul li:not(.skip) {
+ background-color: #eee;
+ border: 1px solid #ccc;
+ padding: 3px;
+}
+
+.pageNavigation ul li.active,
+.pageNavigation ul li:not(.skip):hover {
+ background-color: #faebd7;
+ border-color: #f80;
+ color: #f80;
+}
+
+.pageNavigation ul li a {
+ text-decoration: none;
+}
+
+.pageNavigation ul li:not(.skip):hover a {
+ color: #f80;
+}
+
+.pageNavigation ul li.skip {
+ vertical-align: middle;
+}
+
+
+
+/* -- -- -- -- -- Large Buttons -- -- -- -- -- */
+
+nav.largeButtons {
+ text-align: right;
+}
+
+nav.largeButtons ul li {
+ display: inline;
+}
+
+input[type='reset'],
+input[type='submit'],
+nav.largeButtons ul li a {
+ background-color: #fefefe;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+ background-image: -o-linear-gradient(#fefefe, #eee);
+ background-image: linear-gradient(#fefefe, #eee);
+
+ border: 1px solid #ccc;
+ border-radius: 30px;
+ display: inline-block;
+ padding: 5px 13px;
+}
+
+input[type='reset']:hover,
+input[type='submit']:hover,
+nav.largeButtons ul li a:hover {
+ background-color: #fefefe;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+ background-image: -o-linear-gradient(#eee, #fefefe);
+ background-image: linear-gradient(#eee, #fefefe);
+
+ text-decoration: none;
+}
+
+nav.largeButtons ul li a img {
+ vertical-align: middle;
+}
+
+.formSubmit {
+ text-align: center;
+}
+
+input[type='reset'],
+input[type='submit'] {
+ cursor: pointer;
+}
+
+
+
+
+
+div#packageInstallationDialogContainer {
+ background-color: #fefefe;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+ background-image: -o-linear-gradient(#fefefe, #eee);
+ background-image: linear-gradient(#fefefe, #eee);
+
+ height: 100%;
+ max-width: 600px;
+ padding: 21px;
+}
+
+div#ajaxExceptionStacktrace {
+ overflow: scroll;
+ overflow-y: hidden;
+ white-space: nowrap;
+}
+
+div#packageInstallationInnerContentContainer {
+ border-top: 2px solid #999 !important;
+ border-radius: 0 !important;
+ margin-top: 21px;
+ padding-top: 14px;
+}
+
+div#packageInstallationInnerContent p.error {
+ background-color: #fdd;
+ border: 3px solid #ed1c24;
+ border-radius: 5px;
+ margin-bottom: 14px;
+ padding: 7px;
+}
+
+div#ajaxExceptionStacktrace {
+ border: 1px solid #ccc;
+ font-family: monospace;
+ font-size: 90%;
+ line-height: 1.2em;
+ padding: 3px;
+}
+
+
+
+/* -- -- -- -- -- System Notifications -- -- -- -- -- */
+
+p.info,
+p.error,
+p.success,
+p.warning {
+ border-radius: 7px;
+ margin-bottom: 14px;
+ padding: 7px 14px;
+}
+
+p.info {
+ background-color: #def;
+ border: 1px solid #06f;
+}
+
+p.success {
+ background-color: #efe;
+ border: 1px solid #090;
+}
+
+p.error {
+ background-color: #fee;
+ border: 1px solid #c00;
+}
+
+p.warning {
+ background-color: #ffd;
+ border: 1px solid #660;
+}
+
+
+
+
+#actionProxyLoading {
+ background-color: #faebd7;
+ border: 1px solid #f80;
+ border-top-width: 0;
+ border-radius: 0 0 5px 5px;
+ left: 43%;
+ padding: 7px 21px 7px;
+ position: fixed;
+ top: 0;
+}
+
+fieldset legend ~ p {
+ margin-bottom: 14px;
+}
+
+
+
+/* -- -- -- -- -- Tabbed Content -- -- -- -- -- */
+
+dl {
+ clear: both;
+ margin-bottom: 7px;
+}
+
+dt { /* is op */
+ float: left;
+ text-align: right;
+ width: 230px;
+}
+
+dd {
+ margin-left: 250px;
+}
+
+dl dd ~ p {
+ color: #777;
+ font-size: 90%;
+ margin: 3px 0 7px 250px;
+}
+
+dl.disabled dt {
+ color: #777;
+}
+
+
+
+/* -- -- -- -- -- Taken from jQuery UI @ themes/base/jquery.ui.tabs.css -- -- -- -- -- */
+
+.ui-tabs {
+ position: relative; /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: 3px;
+ zoom: 1;
+}
+
+.ui-tabs .ui-tabs-nav {
+ height: 18px !important; /* Fixes a clearing problem */
+ margin: 0 3px;
+ background-color: none;
+ padding: 3px 3px 0;
+}
+
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 1px;
+ margin: 0 3px 1px 0;
+ border-bottom: 0 !important;
+ padding: 0;
+ white-space: nowrap;
+ z-index: 90; /* Prevents border overlay during transition */
+}
+
+.ui-tabs .ui-tabs-nav li a {
+ background-color: #fefefe;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #fefefe, #eee);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#fefefe), to(#eee));
+ background-image: -o-linear-gradient(#fefefe, #eee);
+ background-image: linear-gradient(#fefefe, #eee);
+
+ border: 1px solid #ccc;
+ border-bottom-width: 0;
+
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+
+ float: left;
+ padding: 7px 14px;
+ text-decoration: none;
+}
+
+.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 {
+ background-color: #fefefe;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+ background-image: -moz-linear-gradient(0% 0% 270deg, #eee, #fefefe);
+ background-image: -ms-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(#fefefe));
+ background-image: -o-linear-gradient(#eee, #fefefe);
+ background-image: linear-gradient(#eee, #fefefe);
+
+ border-bottom: 1px solid #fefefe;
+}
+
+.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: default;
+}
+
+.ui-tabs .ui-tabs-nav li a,
+.ui-tabs .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a {
+ cursor: pointer;
+}
+
+.ui-tabs .ui-tabs-panel {
+ background-color: #fefefe;
+ border: 1px solid #ccc !important;
+ z-index: 89; /* Prevents border overlay during transition */
+ display: block;
+ padding: 14px 21px;
+}
+
+.ui-tabs .ui-tabs-hide {
+ display: none !important;
+}
+
+.ui-helper-hidden {
+ display: none;
+}
+
+.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;
+}
+
+.ui-helper-clearfix {
+ display: inline-block;
+}
+
+/* Required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix {
+ height: 1%;
+}
+
+.ui-helper-clearfix {
+ display: block;
+}
+
+/* end clearfix */
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter: Alpha(opacity=0);}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-/**\r
- * ACP Special Styles\r
- *\r
- * @author Arian Glander, Harald Szekely\r
- * @copyright 2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */\r
-\r
-body, html {\r
- background-color: #fff;\r
- background-image: url("../images/WoltLab Blue Sunrise/body-ltr.png");\r
- background-position: left;\r
- background-repeat: repeat-y;\r
- background-attachment: scroll;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-#content {\r
- padding: 30px 0 20px 180px;\r
- min-width: 800px;\r
- max-width: 75%;\r
-}\r
-\r
-.userPanelInner, #header, #menuBar .mainMenuInner {\r
- margin: 0;\r
- padding: 0;\r
- width: 100%;\r
- min-width: 100%;\r
- max-width: 100%;\r
-}\r
-\r
-#userNote {\r
- padding-left: 23px; \r
-}\r
-\r
-.logoInner {\r
- padding-left: 5px; \r
-}\r
-\r
-#date {\r
- padding: 10px 23px 3px 5px;\r
- position: absolute;\r
- right: 0;\r
-}\r
-\r
-#header {\r
- background-color: transparent !important;\r
-}\r
-\r
-#logo .pageLogo img {\r
- margin-left: 20px;\r
-}\r
-\r
-h1 {\r
- text-shadow: 0 -1px 1px #000;\r
-}\r
-\r
-#logo h1{\r
- font-family: 'Trebuchet MS', Arial, sans-serif;\r
- text-align: right;\r
- position: absolute;\r
- top: 0;\r
- left: 0;\r
-}\r
-\r
-#logo h1, #logo h1 a{\r
- color: #fff;\r
-}\r
-\r
-#logo h1 a{\r
- padding-top: 35px;\r
- padding-right: 23px;\r
-}\r
-\r
-#logo h1{\r
- font-size: 1.5em;\r
- font-weight: bold;\r
-}\r
-\r
-h2, h2 a {\r
- text-shadow: 0 2px 3px #bbb;\r
-}\r
-\r
-#tplStyleList .styleList .subHeadline {\r
- text-shadow: 0 1px 0 #fff;\r
-}\r
-\r
-#tplStyleList .styleList .messageBody {\r
- padding-top: 0;\r
-}\r
-\r
-#footer {\r
- margin: 0;\r
- width: 100%;\r
- min-width: 100%;\r
- max-width: 100%;\r
-}\r
-\r
-#footer:after {\r
- display: block;\r
- clear: both;\r
- content: "";\r
- height: 0;\r
-}\r
-\r
-#footerContainer {\r
- background-color: transparent;\r
- margin: 0 0 0 180px;\r
- min-width: 800px;\r
- max-width: 75%;\r
-}\r
-\r
-.contentHeader form.quickJump div {\r
- margin-top: 5px;\r
- float: left;\r
- display: inline;\r
-}\r
-\r
-.copyright {\r
- padding-top: 5px;\r
- float: left;\r
- clear: none;\r
-}\r
-\r
-/* -- -- -- -- -- Sidebar -- -- -- -- -- */\r
-\r
-#sidebar {\r
- background-color: transparent;\r
- background-image: url("../images/WoltLab Blue Sunrise/sidebar.png");\r
- background-repeat: repeat-x;\r
- background-position: left top;\r
- border-right: 1px solid #8da4b7;\r
- position: absolute;\r
- left: 0;\r
- width: 129px;\r
- min-height: 400px;\r
-}\r
-\r
-#sidebar ul {\r
- list-style: none;\r
- margin: 0 0 0 8px;\r
- padding: 0;\r
-}\r
-\r
-#sidebar li {\r
- text-align: center;\r
- margin: 10px 0 0 0;\r
- float: left;\r
- width: 114px;\r
-}\r
-\r
-#sidebar a {\r
- text-align: center;\r
- text-decoration: none;\r
- float: left;\r
- clear: left;\r
- width: 100%;\r
-}\r
-\r
-#sidebar img {\r
- margin: 14px auto 3px auto;\r
- height: 48px;\r
- width: 48px;\r
- display: block;\r
-}\r
-\r
-#sidebar span {\r
- font-weight: bold;\r
- text-shadow: 0 1px 0 #fff;\r
- padding: 0 0 10px 0;\r
- display: block;\r
-}\r
-\r
-#sidebar li:hover {\r
- background-image: url("../images/WoltLab Blue Sunrise/sidebarHoverTop.png");\r
- background-position: left top;\r
- background-repeat: no-repeat;\r
-}\r
-\r
-#sidebar li:hover span {\r
- background-image: url("../images/WoltLab Blue Sunrise/sidebarHoverBottom.png");\r
- background-position: left bottom;\r
-}\r
-\r
-#sidebar li:active, #sidebar li.active {\r
- background-image: url("../images/WoltLab Blue Sunrise/sidebarActiveTop.png");\r
- background-repeat: no-repeat;\r
-}\r
-\r
-#sidebar li:active span, #sidebar li.active span {\r
- color: #fff;\r
- text-shadow: 0 -1px 0 #000;\r
- background-image: url("../images/WoltLab Blue Sunrise/sidebarActiveBottom.png");\r
- background-position: left bottom;\r
-}\r
-\r
-/* -- -- -- -- -- Menu -- -- -- -- -- */\r
-\r
-/* ToDo: Clean up this mess */\r
-\r
-#menuBar {\r
- min-height: 31px;\r
-}\r
-\r
-#menuBar .mainMenuInner > ul {\r
- padding-left: 129px; \r
-}\r
-\r
-.mainMenu {\r
- border: 0; \r
-}\r
-\r
-.mainMenu a {\r
- padding: 2px 5px 4px 5px;\r
-}\r
-\r
-.mainMenu ul {\r
- margin: 0;\r
-}\r
-\r
-.mainMenu .mainMenuInner > ul > li > a {\r
- min-height: 24px;\r
-}\r
-\r
-.mainMenu .mainMenuInner > ul > li > a > span {\r
- padding: 2px 5px;\r
- display: block;\r
-}\r
-\r
-.mainMenu .popupMenu {\r
- border-top-width: 0; \r
-}\r
-\r
-.mainMenu .popupMenu a {\r
- color: #164369;\r
- text-shadow: none !important;\r
- background-color: #154268;\r
- background-image: none !important;\r
- min-height: 20px;\r
-}\r
-\r
-.mainMenu .popupMenu a:hover {\r
- background-color: #ffe0b8;\r
-}\r
-\r
-#menuBar span {\r
- position: relative;\r
- top: 4px;\r
-}\r
-\r
-#menuBar li div span {\r
- position: relative;\r
- top: 0;\r
-}\r
-\r
-/* -- -- -- -- -- Sitemap -- -- -- -- -- */\r
-\r
-.sitemap {\r
- padding: 20px 0 20px 180px;\r
- width: 800px;\r
-}\r
-\r
-.sitemap ul {\r
- list-style: none;\r
- margin: 0;\r
- padding: 0;\r
- min-height: 0;\r
-}\r
-\r
-.sitemap h2 img {\r
- margin-right: 7px;\r
-}\r
-\r
-.sitemap h2 {\r
- padding: 20px 0 10px 0;\r
-}\r
-\r
-.sitemap h3 {\r
- margin-bottom: 5px;\r
-}\r
-\r
-.sitemap h4, .sitemap h5 {\r
- padding: 5px 0;\r
-}\r
-\r
-.sitemap h4 img, .sitemap h5 img {\r
- position: absolute;\r
-}\r
-\r
-.sitemap h4 a, .sitemap h4 span, .sitemap h5 a, .sitemap h5 span {\r
- margin-left: 30px;\r
- display: block;\r
-}\r
-\r
-.sitemap .border {\r
- padding-bottom: 1px;\r
-}\r
-\r
-.sitemap .container-1 {\r
- margin-right: 1px;\r
- padding: 4px;\r
-}\r
-\r
-.sitemap .sitemapDepth-1 li {\r
- margin-right: 2%;\r
- float: left;\r
- width: 30%;\r
-}\r
-\r
-.sitemap .sitemapDepth-1:after {\r
- content: "";\r
- display: block;\r
- clear: both;\r
- height: 0;\r
-}\r
-\r
-.sitemap .sitemapDepth-2 li {\r
- float: none;\r
- width: auto;\r
-}\r
-\r
-.sitemap .clear {\r
- clear: both;\r
-}\r
-\r
-/* -- -- -- -- Access Rights -- -- -- -- */\r
-\r
-.allow, .deny {\r
- font-size: .85em;\r
- font-weight: normal;\r
- text-align: center;\r
- float: right;\r
- width: 80px;\r
- height: 10px;\r
-}\r
-\r
-.accessRightsHeader {\r
- margin-right: 20px;\r
- min-height: 20px;\r
-}\r
-\r
-.accessRights {\r
- border: 1px solid #999;\r
- margin: 0;\r
- padding: 0;\r
- height: auto;\r
- min-height: 100px;\r
- overflow: auto;\r
-}\r
-\r
-.accessRights ul {\r
- list-style: none;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.accessRights ul li {\r
- min-height: 0;\r
-}\r
-\r
-.formField .accessRights li span {\r
- margin-left: 0;\r
- float: none;\r
-}\r
-\r
-.accessRights ul li span {\r
- padding: 2px 4px;\r
- display: block;\r
- vertical-align: middle;\r
-}\r
-\r
-.accessRights ul li a {\r
- text-decoration: none;\r
- padding: 2px 4px;\r
- display: block;\r
-}\r
-\r
-.accessRights ul li a:hover {\r
- background-color: #d8e7f5;\r
-}\r
-\r
-.accessRights ul li.selected a {\r
- background-color: #8da4b7;\r
-}\r
-\r
-.accessRights ul li a img {\r
- padding-right: 4px;\r
- vertical-align: middle;\r
-}\r
-\r
-.accessRights ul li a.remove {\r
- float: right;\r
- display: inline;\r
-}\r
-\r
-.accessRights ul li a.remove:hover {\r
- background-color: #c00;\r
-}\r
-\r
-.accessRights ul li a.remove img {\r
- padding-right: 0;\r
-}\r
-\r
-.formField .accessRights label {\r
- clear: none;\r
-}\r
-\r
-.accessRightsInput {\r
- width: 300px !important;\r
-}\r
-\r
-.accessRightsTitle {\r
- margin-top: 20px;\r
-}\r
-\r
-#permissions-content div.popupMenu a, #permissions-content div.popupMenu a:hover, #moderators-content div.popupMenu a, #moderators-content div.popupMenu a:hover, #tplGroupAdd div.popupMenu a, #tplGroupAdd div.popupMenu a:hover {\r
- padding: 5px 7px 5px 35px !important;\r
-}\r
-\r
-/* -- -- -- -- Special Styles -- -- -- -- */\r
-\r
-* {\r
- -o-text-overflow: ellipsis;\r
- text-overflow: ellipsis;\r
-}\r
-\r
-.sitemap .container-1 {\r
- -webkit-border-bottom-left-radius: 5px;\r
- -webkit-border-bottom-right-radius: 5px;\r
- -moz-border-radius-bottomleft: 5px;\r
- -moz-border-radius-bottomright: 5px;\r
- border-bottom-left-radius: 5px;\r
- border-bottom-right-radius: 5px;\r
-}\r
-\r
-.mainMenu .popupMenu, .mainMenu .popupMenu li a {\r
- -webkit-border-top-left-radius: 0;\r
- -webkit-border-top-right-radius: 0;\r
- -moz-border-radius-topleft: 0;\r
- -moz-border-radius-topright: 0;\r
- border-top-left-radius: 0;\r
- border-top-right-radius: 0;\r
-}\r
-\r
-.sitemap .border {\r
- -webkit-border-radius: 5px;\r
- -moz-border-radius: 5px;\r
- \r
- border-radius: 5px;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * ACP Special Styles
+ *
+ * @author Arian Glander, Harald Szekely
+ * @copyright 2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */
+
+body, html {
+ background-color: #fff;
+ background-image: url("../images/WoltLab Blue Sunrise/body-ltr.png");
+ background-position: left;
+ background-repeat: repeat-y;
+ background-attachment: scroll;
+ margin: 0;
+ padding: 0;
+}
+
+#content {
+ padding: 30px 0 20px 180px;
+ min-width: 800px;
+ max-width: 75%;
+}
+
+.userPanelInner, #header, #menuBar .mainMenuInner {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ min-width: 100%;
+ max-width: 100%;
+}
+
+#userNote {
+ padding-left: 23px;
+}
+
+.logoInner {
+ padding-left: 5px;
+}
+
+#date {
+ padding: 10px 23px 3px 5px;
+ position: absolute;
+ right: 0;
+}
+
+#header {
+ background-color: transparent !important;
+}
+
+#logo .pageLogo img {
+ margin-left: 20px;
+}
+
+h1 {
+ text-shadow: 0 -1px 1px #000;
+}
+
+#logo h1{
+ font-family: 'Trebuchet MS', Arial, sans-serif;
+ text-align: right;
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+#logo h1, #logo h1 a{
+ color: #fff;
+}
+
+#logo h1 a{
+ padding-top: 35px;
+ padding-right: 23px;
+}
+
+#logo h1{
+ font-size: 1.5em;
+ font-weight: bold;
+}
+
+h2, h2 a {
+ text-shadow: 0 2px 3px #bbb;
+}
+
+#tplStyleList .styleList .subHeadline {
+ text-shadow: 0 1px 0 #fff;
+}
+
+#tplStyleList .styleList .messageBody {
+ padding-top: 0;
+}
+
+#footer {
+ margin: 0;
+ width: 100%;
+ min-width: 100%;
+ max-width: 100%;
+}
+
+#footer:after {
+ display: block;
+ clear: both;
+ content: "";
+ height: 0;
+}
+
+#footerContainer {
+ background-color: transparent;
+ margin: 0 0 0 180px;
+ min-width: 800px;
+ max-width: 75%;
+}
+
+.contentHeader form.quickJump div {
+ margin-top: 5px;
+ float: left;
+ display: inline;
+}
+
+.copyright {
+ padding-top: 5px;
+ float: left;
+ clear: none;
+}
+
+/* -- -- -- -- -- Sidebar -- -- -- -- -- */
+
+#sidebar {
+ background-color: transparent;
+ background-image: url("../images/WoltLab Blue Sunrise/sidebar.png");
+ background-repeat: repeat-x;
+ background-position: left top;
+ border-right: 1px solid #8da4b7;
+ position: absolute;
+ left: 0;
+ width: 129px;
+ min-height: 400px;
+}
+
+#sidebar ul {
+ list-style: none;
+ margin: 0 0 0 8px;
+ padding: 0;
+}
+
+#sidebar li {
+ text-align: center;
+ margin: 10px 0 0 0;
+ float: left;
+ width: 114px;
+}
+
+#sidebar a {
+ text-align: center;
+ text-decoration: none;
+ float: left;
+ clear: left;
+ width: 100%;
+}
+
+#sidebar img {
+ margin: 14px auto 3px auto;
+ height: 48px;
+ width: 48px;
+ display: block;
+}
+
+#sidebar span {
+ font-weight: bold;
+ text-shadow: 0 1px 0 #fff;
+ padding: 0 0 10px 0;
+ display: block;
+}
+
+#sidebar li:hover {
+ background-image: url("../images/WoltLab Blue Sunrise/sidebarHoverTop.png");
+ background-position: left top;
+ background-repeat: no-repeat;
+}
+
+#sidebar li:hover span {
+ background-image: url("../images/WoltLab Blue Sunrise/sidebarHoverBottom.png");
+ background-position: left bottom;
+}
+
+#sidebar li:active, #sidebar li.active {
+ background-image: url("../images/WoltLab Blue Sunrise/sidebarActiveTop.png");
+ background-repeat: no-repeat;
+}
+
+#sidebar li:active span, #sidebar li.active span {
+ color: #fff;
+ text-shadow: 0 -1px 0 #000;
+ background-image: url("../images/WoltLab Blue Sunrise/sidebarActiveBottom.png");
+ background-position: left bottom;
+}
+
+/* -- -- -- -- -- Menu -- -- -- -- -- */
+
+/* ToDo: Clean up this mess */
+
+#menuBar {
+ min-height: 31px;
+}
+
+#menuBar .mainMenuInner > ul {
+ padding-left: 129px;
+}
+
+.mainMenu {
+ border: 0;
+}
+
+.mainMenu a {
+ padding: 2px 5px 4px 5px;
+}
+
+.mainMenu ul {
+ margin: 0;
+}
+
+.mainMenu .mainMenuInner > ul > li > a {
+ min-height: 24px;
+}
+
+.mainMenu .mainMenuInner > ul > li > a > span {
+ padding: 2px 5px;
+ display: block;
+}
+
+.mainMenu .popupMenu {
+ border-top-width: 0;
+}
+
+.mainMenu .popupMenu a {
+ color: #164369;
+ text-shadow: none !important;
+ background-color: #154268;
+ background-image: none !important;
+ min-height: 20px;
+}
+
+.mainMenu .popupMenu a:hover {
+ background-color: #ffe0b8;
+}
+
+#menuBar span {
+ position: relative;
+ top: 4px;
+}
+
+#menuBar li div span {
+ position: relative;
+ top: 0;
+}
+
+/* -- -- -- -- -- Sitemap -- -- -- -- -- */
+
+.sitemap {
+ padding: 20px 0 20px 180px;
+ width: 800px;
+}
+
+.sitemap ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ min-height: 0;
+}
+
+.sitemap h2 img {
+ margin-right: 7px;
+}
+
+.sitemap h2 {
+ padding: 20px 0 10px 0;
+}
+
+.sitemap h3 {
+ margin-bottom: 5px;
+}
+
+.sitemap h4, .sitemap h5 {
+ padding: 5px 0;
+}
+
+.sitemap h4 img, .sitemap h5 img {
+ position: absolute;
+}
+
+.sitemap h4 a, .sitemap h4 span, .sitemap h5 a, .sitemap h5 span {
+ margin-left: 30px;
+ display: block;
+}
+
+.sitemap .border {
+ padding-bottom: 1px;
+}
+
+.sitemap .container-1 {
+ margin-right: 1px;
+ padding: 4px;
+}
+
+.sitemap .sitemapDepth-1 li {
+ margin-right: 2%;
+ float: left;
+ width: 30%;
+}
+
+.sitemap .sitemapDepth-1:after {
+ content: "";
+ display: block;
+ clear: both;
+ height: 0;
+}
+
+.sitemap .sitemapDepth-2 li {
+ float: none;
+ width: auto;
+}
+
+.sitemap .clear {
+ clear: both;
+}
+
+/* -- -- -- -- Access Rights -- -- -- -- */
+
+.allow, .deny {
+ font-size: .85em;
+ font-weight: normal;
+ text-align: center;
+ float: right;
+ width: 80px;
+ height: 10px;
+}
+
+.accessRightsHeader {
+ margin-right: 20px;
+ min-height: 20px;
+}
+
+.accessRights {
+ border: 1px solid #999;
+ margin: 0;
+ padding: 0;
+ height: auto;
+ min-height: 100px;
+ overflow: auto;
+}
+
+.accessRights ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.accessRights ul li {
+ min-height: 0;
+}
+
+.formField .accessRights li span {
+ margin-left: 0;
+ float: none;
+}
+
+.accessRights ul li span {
+ padding: 2px 4px;
+ display: block;
+ vertical-align: middle;
+}
+
+.accessRights ul li a {
+ text-decoration: none;
+ padding: 2px 4px;
+ display: block;
+}
+
+.accessRights ul li a:hover {
+ background-color: #d8e7f5;
+}
+
+.accessRights ul li.selected a {
+ background-color: #8da4b7;
+}
+
+.accessRights ul li a img {
+ padding-right: 4px;
+ vertical-align: middle;
+}
+
+.accessRights ul li a.remove {
+ float: right;
+ display: inline;
+}
+
+.accessRights ul li a.remove:hover {
+ background-color: #c00;
+}
+
+.accessRights ul li a.remove img {
+ padding-right: 0;
+}
+
+.formField .accessRights label {
+ clear: none;
+}
+
+.accessRightsInput {
+ width: 300px !important;
+}
+
+.accessRightsTitle {
+ margin-top: 20px;
+}
+
+#permissions-content div.popupMenu a, #permissions-content div.popupMenu a:hover, #moderators-content div.popupMenu a, #moderators-content div.popupMenu a:hover, #tplGroupAdd div.popupMenu a, #tplGroupAdd div.popupMenu a:hover {
+ padding: 5px 7px 5px 35px !important;
+}
+
+/* -- -- -- -- Special Styles -- -- -- -- */
+
+* {
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+}
+
+.sitemap .container-1 {
+ -webkit-border-bottom-left-radius: 5px;
+ -webkit-border-bottom-right-radius: 5px;
+ -moz-border-radius-bottomleft: 5px;
+ -moz-border-radius-bottomright: 5px;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+}
+
+.mainMenu .popupMenu, .mainMenu .popupMenu li a {
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-top-right-radius: 0;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-topright: 0;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.sitemap .border {
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+
+ border-radius: 5px;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/cronjobs{$action|ucfirst}L.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.cronjob.{$action}{/lang}</h1>\r
- <h2>{lang}wcf.acp.cronjob.subtitle{/lang}</h2>\r
- </hgroup>\r
-</header>\r
-\r
-{if $errorField}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $success|isset}\r
- <p class="success">{lang}wcf.acp.cronjob.{$action}.success{/lang}</p> \r
-{/if}\r
-\r
-<p class="info">{lang}wcf.acp.cronjob.intro{/lang}</p>\r
-\r
-<div class="contentHeader">\r
- <nav class="largeButtons">\r
- <ul>\r
- <li><a href="index.php?page=CronjobList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.cronjobs.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/cronjobsM.png" alt="" /> <span>{lang}wcf.acp.menu.link.cronjobs.view{/lang}</span></a></li>\r
- {if $action == 'edit'}<li><a href="index.php?action=CronjobExecute&cronjobID={@$cronjobID}{@SID_ARG_2ND}" title="{lang}wcf.acp.cronjob.execute{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/cronjobExecuteM.png" alt="" /> <span>{lang}wcf.acp.cronjob.execute{/lang}</span></a></li>{/if}\r
- </ul>\r
- </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=Cronjob{$action|ucfirst}">\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.cronjob.edit.data{/lang}</legend>\r
- \r
- <div class="formElement{if $errorField == 'className'} formError{/if}" id="classNameDiv">\r
- <div class="formFieldLabel">\r
- <label for="className">{lang}wcf.acp.cronjob.className{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="className" name="className" value="{$className}" />\r
- {if $errorField == 'className'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.acp.cronjob.error.empty{/lang}{/if}\r
- {if $errorType == 'doesNotExist'}{lang}wcf.acp.cronjob.error.doesNotExist{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="classNameHelpMessage">\r
- <p>{lang}wcf.acp.cronjob.className.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('className');\r
- //]]></script>\r
- \r
- <div class="formElement" id="descriptionDiv">\r
- <div class="formFieldLabel">\r
- <label for="description">{lang}wcf.acp.cronjob.description{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="description" name="description" value="{$description}" />\r
- </div>\r
- <div class="formFieldDesc hidden" id="descriptionHelpMessage">\r
- <p>{lang}wcf.acp.cronjob.description.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('description');\r
- //]]></script>\r
- </fieldset>\r
- \r
- <fieldset>\r
- <legend>{lang}wcf.acp.cronjob.edit.timing{/lang}</legend>\r
- <div class="formElement{if $errorField == 'startMinute'} formError{/if}" id="startMinuteDiv">\r
- <div class="formFieldLabel">\r
- <label for="startMinute">{lang}wcf.acp.cronjob.startMinute{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="startMinute" name="startMinute" value="{$startMinute}" />\r
- {if $errorField == 'startMinute'}\r
- <p class="innerError">\r
- {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="startMinuteHelpMessage">\r
- <p>{lang}wcf.acp.cronjob.startMinute.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('startMinute');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'startHour'} formError{/if}" id="startHourDiv">\r
- <div class="formFieldLabel">\r
- <label for="startHour">{lang}wcf.acp.cronjob.startHour{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="startHour" name="startHour" value="{$startHour}" />\r
- {if $errorField == 'startHour'}\r
- <p class="innerError">\r
- {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="startHourHelpMessage">\r
- <p>{lang}wcf.acp.cronjob.startHour.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('startHour');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'startDom'} formError{/if}" id="startDomDiv">\r
- <div class="formFieldLabel">\r
- <label for="startDom">{lang}wcf.acp.cronjob.startDom{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="startDom" name="startDom" value="{$startDom}" />\r
- {if $errorField == 'startDom'}\r
- <p class="innerError">\r
- {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="startDomHelpMessage">\r
- <p>{lang}wcf.acp.cronjob.startDom.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('startDom');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'startMonth'} formError{/if}" id="startMonthDiv">\r
- <div class="formFieldLabel">\r
- <label for="startMonth">{lang}wcf.acp.cronjob.startMonth{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="startMonth" name="startMonth" value="{$startMonth}" />\r
- {if $errorField == 'startMonth'}\r
- <p class="innerError">\r
- {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="startMonthHelpMessage">\r
- <p>{lang}wcf.acp.cronjob.startMonth.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('startMonth');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'startDow'} formError{/if}" id="startDowDiv">\r
- <div class="formFieldLabel">\r
- <label for="startDow">{lang}wcf.acp.cronjob.startDow{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="startDow" name="startDow" value="{$startDow}" />\r
- {if $errorField == 'startDow'}\r
- <p class="innerError">\r
- {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="startDowHelpMessage">\r
- <p>{lang}wcf.acp.cronjob.startDow.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('startDow');\r
- //]]></script>\r
- </fieldset>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- {@SID_INPUT_TAG}\r
- {if $cronjobID|isset}<input type="hidden" name="cronjobID" value="{@$cronjobID}" />{/if}\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/cronjobs{$action|ucfirst}L.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.cronjob.{$action}{/lang}</h1>
+ <h2>{lang}wcf.acp.cronjob.subtitle{/lang}</h2>
+ </hgroup>
+</header>
+
+{if $errorField}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $success|isset}
+ <p class="success">{lang}wcf.acp.cronjob.{$action}.success{/lang}</p>
+{/if}
+
+<p class="info">{lang}wcf.acp.cronjob.intro{/lang}</p>
+
+<div class="contentHeader">
+ <nav class="largeButtons">
+ <ul>
+ <li><a href="index.php?page=CronjobList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.cronjobs.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/cronjobsM.png" alt="" /> <span>{lang}wcf.acp.menu.link.cronjobs.view{/lang}</span></a></li>
+ {if $action == 'edit'}<li><a href="index.php?action=CronjobExecute&cronjobID={@$cronjobID}{@SID_ARG_2ND}" title="{lang}wcf.acp.cronjob.execute{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/cronjobExecuteM.png" alt="" /> <span>{lang}wcf.acp.cronjob.execute{/lang}</span></a></li>{/if}
+ </ul>
+ </nav>
+</div>
+
+<form method="post" action="index.php?form=Cronjob{$action|ucfirst}">
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.cronjob.edit.data{/lang}</legend>
+
+ <div class="formElement{if $errorField == 'className'} formError{/if}" id="classNameDiv">
+ <div class="formFieldLabel">
+ <label for="className">{lang}wcf.acp.cronjob.className{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="className" name="className" value="{$className}" />
+ {if $errorField == 'className'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.acp.cronjob.error.empty{/lang}{/if}
+ {if $errorType == 'doesNotExist'}{lang}wcf.acp.cronjob.error.doesNotExist{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="classNameHelpMessage">
+ <p>{lang}wcf.acp.cronjob.className.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('className');
+ //]]></script>
+
+ <div class="formElement" id="descriptionDiv">
+ <div class="formFieldLabel">
+ <label for="description">{lang}wcf.acp.cronjob.description{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="description" name="description" value="{$description}" />
+ </div>
+ <div class="formFieldDesc hidden" id="descriptionHelpMessage">
+ <p>{lang}wcf.acp.cronjob.description.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('description');
+ //]]></script>
+ </fieldset>
+
+ <fieldset>
+ <legend>{lang}wcf.acp.cronjob.edit.timing{/lang}</legend>
+ <div class="formElement{if $errorField == 'startMinute'} formError{/if}" id="startMinuteDiv">
+ <div class="formFieldLabel">
+ <label for="startMinute">{lang}wcf.acp.cronjob.startMinute{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="startMinute" name="startMinute" value="{$startMinute}" />
+ {if $errorField == 'startMinute'}
+ <p class="innerError">
+ {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="startMinuteHelpMessage">
+ <p>{lang}wcf.acp.cronjob.startMinute.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('startMinute');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'startHour'} formError{/if}" id="startHourDiv">
+ <div class="formFieldLabel">
+ <label for="startHour">{lang}wcf.acp.cronjob.startHour{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="startHour" name="startHour" value="{$startHour}" />
+ {if $errorField == 'startHour'}
+ <p class="innerError">
+ {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="startHourHelpMessage">
+ <p>{lang}wcf.acp.cronjob.startHour.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('startHour');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'startDom'} formError{/if}" id="startDomDiv">
+ <div class="formFieldLabel">
+ <label for="startDom">{lang}wcf.acp.cronjob.startDom{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="startDom" name="startDom" value="{$startDom}" />
+ {if $errorField == 'startDom'}
+ <p class="innerError">
+ {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="startDomHelpMessage">
+ <p>{lang}wcf.acp.cronjob.startDom.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('startDom');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'startMonth'} formError{/if}" id="startMonthDiv">
+ <div class="formFieldLabel">
+ <label for="startMonth">{lang}wcf.acp.cronjob.startMonth{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="startMonth" name="startMonth" value="{$startMonth}" />
+ {if $errorField == 'startMonth'}
+ <p class="innerError">
+ {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="startMonthHelpMessage">
+ <p>{lang}wcf.acp.cronjob.startMonth.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('startMonth');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'startDow'} formError{/if}" id="startDowDiv">
+ <div class="formFieldLabel">
+ <label for="startDow">{lang}wcf.acp.cronjob.startDow{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="startDow" name="startDow" value="{$startDow}" />
+ {if $errorField == 'startDow'}
+ <p class="innerError">
+ {if $errorType == 'notValid'}{lang}wcf.acp.cronjob.error.notValid{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="startDowHelpMessage">
+ <p>{lang}wcf.acp.cronjob.startDow.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('startDow');
+ //]]></script>
+ </fieldset>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ {@SID_INPUT_TAG}
+ {if $cronjobID|isset}<input type="hidden" name="cronjobID" value="{@$cronjobID}" />{/if}
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/cronjobsLogL.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.cronjob.log{/lang}</h1>\r
- <h2>{lang}wcf.acp.cronjob.subtitle{/lang}</h2>\r
- </hgroup>\r
-</header>\r
-\r
-<div class="contentHeader">\r
- {pages print=true assign=pagesLinks link="index.php?page=CronjobLogList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}\r
-</div>\r
-\r
-{hascontent}\r
- <form method="post" action="index.php?action=CronjobsLogDelete">\r
- <div class="border titleBarPanel">\r
- <div class="containerHead"><h3>{lang}wcf.acp.cronjob.log.data{/lang}</h3></div>\r
- </div>\r
- <div class="border borderMarginRemove">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th class="columnCronjobID{if $sortField == 'cronjobID'} active{/if}"><div><a href="index.php?page=CronjobLogList&pageNo={@$pageNo}&sortField=cronjobID&sortOrder={if $sortField == 'cronjobID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.cronjobID{/lang}{if $sortField == 'cronjobID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnClassPath{if $sortField == 'classPath'} active{/if}"><div><a href="index.php?page=CronjobLogList&pageNo={@$pageNo}&sortField=classPath&sortOrder={if $sortField == 'classPath' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.classPath{/lang}{if $sortField == 'classPath'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnDescription{if $sortField == 'description'} active{/if}"><div><a href="index.php?page=CronjobLogList&pageNo={@$pageNo}&sortField=description&sortOrder={if $sortField == 'description' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.description{/lang}{if $sortField == 'description'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnExecTime{if $sortField == 'execTime'} active{/if}"><div><a href="index.php?page=CronjobLogList&pageNo={@$pageNo}&sortField=execTime&sortOrder={if $sortField == 'execTime' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.log.execTime{/lang}{if $sortField == 'execTime'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- \r
- {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {content}\r
- {foreach from=$cronjobLogs item=cronjobLog}\r
- <tr class="{cycle values="container-1,container-2"}">\r
- <td class="columnCronjobID columnID">{@$cronjobLog->cronjobID}</td>\r
- <td class="columnClassPath columnText">{$cronjobLog->classPath}</td>\r
- <td class="columnDescription columnText">{$cronjobLog->description}</td>\r
- {if $cronjobLog->success}\r
- <td class="columnExecTime columnDate">{@$cronjobLog->execTime|time} {lang}wcf.acp.cronjob.log.success{/lang}</td>\r
- {elseif $cronjobLog->error}\r
- <td class="columnExecTime columnText">\r
- {@$cronjobLog->execTime|time} {lang}wcf.acp.cronjob.log.error{/lang}<br />\r
- {@$cronjobLog->error}\r
- </td>\r
- {else}\r
- <td class="columnExecTime columnText"></td>\r
- {/if}\r
- \r
- {if $cronjobLog->additionalColumns|isset}{@$cronjobLog->additionalColumns}{/if}\r
- </tr>\r
- {/foreach}\r
- {/content}\r
- </tbody>\r
- </table>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- {@SID_INPUT_TAG}\r
- <input type="submit" accesskey="c" value="{lang}wcf.acp.cronjob.log.clear{/lang}" onclick="return confirm('{lang}wcf.acp.cronjob.log.clear.confirm{/lang}')" />\r
- </div>\r
- </form>\r
- \r
- <div class="contentFooter">\r
- {@$pagesLinks}\r
- </div>\r
-{hascontentelse}\r
- <div class="border content">\r
- <div class="container-1">\r
- <p class="info">{lang}wcf.acp.cronjob.log.noEntries{/lang}</p>\r
- </div>\r
- </div>\r
-{/hascontent}\r
-\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/cronjobsLogL.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.cronjob.log{/lang}</h1>
+ <h2>{lang}wcf.acp.cronjob.subtitle{/lang}</h2>
+ </hgroup>
+</header>
+
+<div class="contentHeader">
+ {pages print=true assign=pagesLinks link="index.php?page=CronjobLogList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}
+</div>
+
+{hascontent}
+ <form method="post" action="index.php?action=CronjobsLogDelete">
+ <div class="border titleBarPanel">
+ <div class="containerHead"><h3>{lang}wcf.acp.cronjob.log.data{/lang}</h3></div>
+ </div>
+ <div class="border borderMarginRemove">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th class="columnCronjobID{if $sortField == 'cronjobID'} active{/if}"><div><a href="index.php?page=CronjobLogList&pageNo={@$pageNo}&sortField=cronjobID&sortOrder={if $sortField == 'cronjobID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.cronjobID{/lang}{if $sortField == 'cronjobID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnClassPath{if $sortField == 'classPath'} active{/if}"><div><a href="index.php?page=CronjobLogList&pageNo={@$pageNo}&sortField=classPath&sortOrder={if $sortField == 'classPath' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.classPath{/lang}{if $sortField == 'classPath'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnDescription{if $sortField == 'description'} active{/if}"><div><a href="index.php?page=CronjobLogList&pageNo={@$pageNo}&sortField=description&sortOrder={if $sortField == 'description' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.description{/lang}{if $sortField == 'description'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnExecTime{if $sortField == 'execTime'} active{/if}"><div><a href="index.php?page=CronjobLogList&pageNo={@$pageNo}&sortField=execTime&sortOrder={if $sortField == 'execTime' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.cronjob.log.execTime{/lang}{if $sortField == 'execTime'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+
+ {if $additionalColumns|isset}{@$additionalColumns}{/if}
+ </tr>
+ </thead>
+ <tbody>
+ {content}
+ {foreach from=$cronjobLogs item=cronjobLog}
+ <tr class="{cycle values="container-1,container-2"}">
+ <td class="columnCronjobID columnID">{@$cronjobLog->cronjobID}</td>
+ <td class="columnClassPath columnText">{$cronjobLog->classPath}</td>
+ <td class="columnDescription columnText">{$cronjobLog->description}</td>
+ {if $cronjobLog->success}
+ <td class="columnExecTime columnDate">{@$cronjobLog->execTime|time} {lang}wcf.acp.cronjob.log.success{/lang}</td>
+ {elseif $cronjobLog->error}
+ <td class="columnExecTime columnText">
+ {@$cronjobLog->execTime|time} {lang}wcf.acp.cronjob.log.error{/lang}<br />
+ {@$cronjobLog->error}
+ </td>
+ {else}
+ <td class="columnExecTime columnText"></td>
+ {/if}
+
+ {if $cronjobLog->additionalColumns|isset}{@$cronjobLog->additionalColumns}{/if}
+ </tr>
+ {/foreach}
+ {/content}
+ </tbody>
+ </table>
+ </div>
+
+ <div class="formSubmit">
+ {@SID_INPUT_TAG}
+ <input type="submit" accesskey="c" value="{lang}wcf.acp.cronjob.log.clear{/lang}" onclick="return confirm('{lang}wcf.acp.cronjob.log.clear.confirm{/lang}')" />
+ </div>
+ </form>
+
+ <div class="contentFooter">
+ {@$pagesLinks}
+ </div>
+{hascontentelse}
+ <div class="border content">
+ <div class="container-1">
+ <p class="info">{lang}wcf.acp.cronjob.log.noEntries{/lang}</p>
+ </div>
+ </div>
+{/hascontent}
+
{include file='footer'}
\ No newline at end of file
- </div>\r
- </div>\r
- </section>\r
- <!-- /CONTENT -->\r
- \r
- <!-- FOOTER -->\r
- <footer>\r
- <div>\r
- <nav id="footerNavigation" class="footerNavigation">\r
- <ul>\r
- <li id="toTopLink" class="toTopLink"><a href="#top" title="{lang}wcf.global.scrollUp{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/upS.png" alt="{lang}wcf.global.scrollUp{/lang}" /> <span class="invisible">{lang}wcf.global.scrollUp{/lang}</span></a></li>\r
- </ul>\r
- </nav>\r
- </div>\r
- <p class="copyright"><a href="http://www.woltlab.com" title="Go to the WoltLab website">Copyright © 2001-2011 WoltLab® GmbH</a></p>\r
- </footer>\r
- <!-- /FOOTER -->\r
- <a id="bottom"></a>\r
-</body>\r
+ </div>
+ </div>
+ </section>
+ <!-- /CONTENT -->
+
+ <!-- FOOTER -->
+ <footer>
+ <div>
+ <nav id="footerNavigation" class="footerNavigation">
+ <ul>
+ <li id="toTopLink" class="toTopLink"><a href="#top" title="{lang}wcf.global.scrollUp{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/upS.png" alt="{lang}wcf.global.scrollUp{/lang}" /> <span class="invisible">{lang}wcf.global.scrollUp{/lang}</span></a></li>
+ </ul>
+ </nav>
+ </div>
+ <p class="copyright"><a href="http://www.woltlab.com" title="Go to the WoltLab website">Copyright © 2001-2011 WoltLab® GmbH</a></p>
+ </footer>
+ <!-- /FOOTER -->
+ <a id="bottom"></a>
+</body>
</html>
\ No newline at end of file
-<!DOCTYPE html>\r
-<html dir="{@$__wcf->getLanguage()->getPageDirection()}" lang="{@$__wcf->getLanguage()->getFixedLanguageCode()}">\r
-<head>\r
- <meta charset="utf-8" />\r
- <title>{if $pageTitle|isset}{@$pageTitle}{else}{lang}wcf.global.pageTitle{/lang}{/if} - {lang}wcf.acp{/lang}</title>\r
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />\r
- <script type="text/javascript">\r
- //<![CDATA[\r
- var SID_ARG_2ND = '{@SID_ARG_2ND_NOT_ENCODED}';\r
- var RELATIVE_WCF_DIR = '{@RELATIVE_WCF_DIR}';\r
- var SECURITY_TOKEN = '{@SECURITY_TOKEN}';\r
- //]]>\r
- </script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/jquery.min.js"></script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/jquery-ui.min.js"></script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/WCF.js"></script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/WCF.ACP.js"></script>\r
- \r
- {*\r
- {if $specialStyles|isset}\r
- <!-- special styles -->\r
- {@$specialStyles}\r
- {/if}\r
- *}\r
- \r
- <!-- Testing stylesheets -->\r
- <link rel="stylesheet" type="text/css" href="{@RELATIVE_WCF_DIR}acp/style/testing-reset.css" />\r
- <link rel="stylesheet" type="text/css" href="{@RELATIVE_WCF_DIR}acp/style/testing.css" />\r
- <!-- /Testing stylesheets -->\r
- \r
- {*\r
- <style type="text/css">\r
- @import url("{@RELATIVE_WCF_DIR}acp/style/style-{@$__wcf->getLanguage()->getPageDirection()}.css");\r
- </style>\r
- \r
- <!--[if IE 8]>\r
- <style type="text/css">\r
- @import url("{@RELATIVE_WCF_DIR}style/extra/ie8-fix{if $__wcf->getLanguage()->getPageDirection() == 'rtl'}-rtl{/if}.css");\r
- </style>\r
- <![endif]-->\r
- *}\r
- \r
- <script type="text/javascript">\r
- //<![CDATA[\r
- $(function() {\r
- {* work-around for unknown core-object during WCFSetup *}\r
- {if PACKAGE_ID}\r
- {assign var=activeMenuItems value=$__wcf->getACPMenu()->getActiveMenuItems()|array_reverse}\r
- var $activeMenuItems = [{implode from=$activeMenuItems item=menuItem}'{$menuItem}'{/implode}];\r
- new WCF.ACP.Menu($activeMenuItems);\r
- {/if}\r
- \r
- WCF.Language.addObject({\r
- 'wcf.global.date.relative.minutes': '{capture assign=relativeMinutes}{lang}wcf.global.date.relative.minutes{/lang}{/capture}{@$relativeMinutes|encodeJS}',\r
- 'wcf.global.date.relative.hours': '{capture assign=relativeHours}{lang}wcf.global.date.relative.hours{/lang}{/capture}{@$relativeHours|encodeJS}',\r
- 'wcf.global.date.relative.pastDays': '{capture assign=relativePastDays}{lang}wcf.global.date.relative.pastDays{/lang}{/capture}{@$relativePastDays|encodeJS}',\r
- 'wcf.global.date.dateTimeFormat': '{lang}wcf.global.date.dateTimeFormat{/lang}',\r
- '__days': [ '{lang}wcf.global.date.day.sunday{/lang}', '{lang}wcf.global.date.day.monday{/lang}', '{lang}wcf.global.date.day.tuesday{/lang}', '{lang}wcf.global.date.day.wednesday{/lang}', '{lang}wcf.global.date.day.thursday{/lang}', '{lang}wcf.global.date.day.friday{/lang}', '{lang}wcf.global.date.day.saturday{/lang}' ],\r
- 'wcf.global.thousandsSeparator': '{capture assign=thousandsSeparator}{lang}wcf.global.thousandsSeparator{/lang}{/capture}{@$thousandsSeparator|encodeJS}',\r
- 'wcf.global.page.next': '{capture assign=pageNext}{lang}wcf.global.page.next{/lang}{/capture}{@$pageNext|encodeJS}',\r
- 'wcf.global.page.previous': '{capture assign=pagePrevious}{lang}wcf.global.page.previous{/lang}{/capture}{@$pagePrevious|encodeJS}'\r
- });\r
- new WCF.Date.Time();\r
- });\r
- //]]>\r
- </script>\r
-</head>\r
-\r
-<body id="tpl{$templateName|ucfirst}">\r
- <!-- HEADER -->\r
- <a id="top"></a>\r
- <header class="pageHeader">\r
- \r
- <!-- top menu -->\r
- <nav id="topMenu" class="topMenu">\r
- <div>\r
- <ul>\r
- <li><a href="#" title="Hello World">Hello World!</a></li>\r
- </ul>\r
- </div>\r
- </nav>\r
- <!-- /top menu -->\r
- \r
- <!-- logo -->\r
- <div id="logo" class="logo">\r
- <!-- clickable area -->\r
- <a href="index.php{@SID_ARG_1ST}">\r
- <h1>WoltLab Community Framework 2.0 Pre-Alpha 1</h1>\r
- <img src="{@RELATIVE_WCF_DIR}acp/images/wcfLogoWhite.svg" width="300" height="58" alt="Product-logo" title="WoltLab Community Framework 2.0 Pre-Alpha 1" />\r
- </a>\r
- <!-- /clickable area -->\r
- \r
- <!-- search area -->\r
- \r
- <!-- /search area -->\r
- </div>\r
- <!-- /logo -->\r
- \r
- <!-- top nav -->\r
- <nav id="mainMenu" class="mainMenu">\r
- {* work-around for unknown core-object during WCFSetup *}\r
- {if PACKAGE_ID}\r
- <ul>\r
- {foreach from=$__wcf->getACPMenu()->getMenuItems('') item=menuItem}\r
- <li data-menuItem="{$menuItem->menuItem}">{lang}{@$menuItem->menuItem}{/lang}</li>\r
- {/foreach}\r
- </ul>\r
- {/if}\r
- </nav>\r
- <!-- /top nav -->\r
- \r
- <!-- sub bar -->\r
- <nav class="headerNavigation">\r
- <ul>\r
- <li id="toBottomLink" class="toBottomLink"><a href="#bottom" title="{lang}wcf.global.scrollDown{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/downS.png" alt="{lang}wcf.global.scrollDown{/lang}" /> <span class="invisible">{lang}wcf.global.scrollDown{/lang}</span></a></li>\r
- </ul>\r
- </nav>\r
- <!-- /sub bar -->\r
- </header>\r
- <!-- /HEADER -->\r
- \r
- <!-- CONTENT -->\r
- <div id="main" class="main">\r
- <div>\r
- <aside class="sidebar">\r
- <!-- sub nav -->\r
- <nav id="sidebarMenu" class="sidebarMenu">\r
- {* work-around for unknown core-object during WCFSetup *}\r
- {if PACKAGE_ID}\r
- {foreach from=$__wcf->getACPMenu()->getMenuItems('') item=parentMenuItem}\r
- <div data-parentMenuItem="{$parentMenuItem->menuItem}" id="{$parentMenuItem->menuItem}-container" style="display: none;">\r
- {foreach from=$__wcf->getACPMenu()->getMenuItems($parentMenuItem->menuItem) item=menuItem}\r
- <h1 data-menuItem="{$menuItem->menuItem}" class="menuHeader">{lang}{@$menuItem->menuItem}{/lang}</h1>\r
- <div class="sidebarMenuGroup">\r
- <ul id="{$menuItem->menuItem}">\r
- {foreach from=$__wcf->getACPMenu()->getMenuItems($menuItem->menuItem) item=menuItemCategory}\r
- {if $__wcf->getACPMenu()->getMenuItems($menuItemCategory->menuItem)|count > 0}\r
- {foreach from=$__wcf->getACPMenu()->getMenuItems($menuItemCategory->menuItem) item=subMenuItem}\r
- <li data-menuItem="{$subMenuItem->menuItem}" id="{$subMenuItem->menuItem}"><a href="{$subMenuItem->getLink()}">{lang}{$subMenuItem->menuItem}{/lang}</a></li>\r
- {/foreach}\r
- {else}\r
- <li data-menuItem="{$menuItemCategory->menuItem}" id="{$menuItemCategory->menuItem}"><a href="{$menuItemCategory->getLink()}">{lang}{$menuItemCategory->menuItem}{/lang}</a></li>\r
- {/if}\r
- {/foreach}\r
- </ul>\r
- </div>\r
- {/foreach}\r
- </div>\r
- {/foreach}\r
- {/if}\r
- </nav>\r
- <!-- /sub nav -->\r
- </aside>\r
- \r
- <section id="content">\r
+<!DOCTYPE html>
+<html dir="{@$__wcf->getLanguage()->getPageDirection()}" lang="{@$__wcf->getLanguage()->getFixedLanguageCode()}">
+<head>
+ <meta charset="utf-8" />
+ <title>{if $pageTitle|isset}{@$pageTitle}{else}{lang}wcf.global.pageTitle{/lang}{/if} - {lang}wcf.acp{/lang}</title>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+ <script type="text/javascript">
+ //<![CDATA[
+ var SID_ARG_2ND = '{@SID_ARG_2ND_NOT_ENCODED}';
+ var RELATIVE_WCF_DIR = '{@RELATIVE_WCF_DIR}';
+ var SECURITY_TOKEN = '{@SECURITY_TOKEN}';
+ //]]>
+ </script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/jquery.min.js"></script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/jquery-ui.min.js"></script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/WCF.js"></script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/WCF.ACP.js"></script>
+
+ {*
+ {if $specialStyles|isset}
+ <!-- special styles -->
+ {@$specialStyles}
+ {/if}
+ *}
+
+ <!-- Testing stylesheets -->
+ <link rel="stylesheet" type="text/css" href="{@RELATIVE_WCF_DIR}acp/style/testing-reset.css" />
+ <link rel="stylesheet" type="text/css" href="{@RELATIVE_WCF_DIR}acp/style/testing.css" />
+ <!-- /Testing stylesheets -->
+
+ {*
+ <style type="text/css">
+ @import url("{@RELATIVE_WCF_DIR}acp/style/style-{@$__wcf->getLanguage()->getPageDirection()}.css");
+ </style>
+
+ <!--[if IE 8]>
+ <style type="text/css">
+ @import url("{@RELATIVE_WCF_DIR}style/extra/ie8-fix{if $__wcf->getLanguage()->getPageDirection() == 'rtl'}-rtl{/if}.css");
+ </style>
+ <![endif]-->
+ *}
+
+ <script type="text/javascript">
+ //<![CDATA[
+ $(function() {
+ {* work-around for unknown core-object during WCFSetup *}
+ {if PACKAGE_ID}
+ {assign var=activeMenuItems value=$__wcf->getACPMenu()->getActiveMenuItems()|array_reverse}
+ var $activeMenuItems = [{implode from=$activeMenuItems item=menuItem}'{$menuItem}'{/implode}];
+ new WCF.ACP.Menu($activeMenuItems);
+ {/if}
+
+ WCF.Language.addObject({
+ 'wcf.global.date.relative.minutes': '{capture assign=relativeMinutes}{lang}wcf.global.date.relative.minutes{/lang}{/capture}{@$relativeMinutes|encodeJS}',
+ 'wcf.global.date.relative.hours': '{capture assign=relativeHours}{lang}wcf.global.date.relative.hours{/lang}{/capture}{@$relativeHours|encodeJS}',
+ 'wcf.global.date.relative.pastDays': '{capture assign=relativePastDays}{lang}wcf.global.date.relative.pastDays{/lang}{/capture}{@$relativePastDays|encodeJS}',
+ 'wcf.global.date.dateTimeFormat': '{lang}wcf.global.date.dateTimeFormat{/lang}',
+ '__days': [ '{lang}wcf.global.date.day.sunday{/lang}', '{lang}wcf.global.date.day.monday{/lang}', '{lang}wcf.global.date.day.tuesday{/lang}', '{lang}wcf.global.date.day.wednesday{/lang}', '{lang}wcf.global.date.day.thursday{/lang}', '{lang}wcf.global.date.day.friday{/lang}', '{lang}wcf.global.date.day.saturday{/lang}' ],
+ 'wcf.global.thousandsSeparator': '{capture assign=thousandsSeparator}{lang}wcf.global.thousandsSeparator{/lang}{/capture}{@$thousandsSeparator|encodeJS}',
+ 'wcf.global.page.next': '{capture assign=pageNext}{lang}wcf.global.page.next{/lang}{/capture}{@$pageNext|encodeJS}',
+ 'wcf.global.page.previous': '{capture assign=pagePrevious}{lang}wcf.global.page.previous{/lang}{/capture}{@$pagePrevious|encodeJS}'
+ });
+ new WCF.Date.Time();
+ });
+ //]]>
+ </script>
+</head>
+
+<body id="tpl{$templateName|ucfirst}">
+ <!-- HEADER -->
+ <a id="top"></a>
+ <header class="pageHeader">
+
+ <!-- top menu -->
+ <nav id="topMenu" class="topMenu">
+ <div>
+ <ul>
+ <li><a href="#" title="Hello World">Hello World!</a></li>
+ </ul>
+ </div>
+ </nav>
+ <!-- /top menu -->
+
+ <!-- logo -->
+ <div id="logo" class="logo">
+ <!-- clickable area -->
+ <a href="index.php{@SID_ARG_1ST}">
+ <h1>WoltLab Community Framework 2.0 Pre-Alpha 1</h1>
+ <img src="{@RELATIVE_WCF_DIR}acp/images/wcfLogoWhite.svg" width="300" height="58" alt="Product-logo" title="WoltLab Community Framework 2.0 Pre-Alpha 1" />
+ </a>
+ <!-- /clickable area -->
+
+ <!-- search area -->
+
+ <!-- /search area -->
+ </div>
+ <!-- /logo -->
+
+ <!-- top nav -->
+ <nav id="mainMenu" class="mainMenu">
+ {* work-around for unknown core-object during WCFSetup *}
+ {if PACKAGE_ID}
+ <ul>
+ {foreach from=$__wcf->getACPMenu()->getMenuItems('') item=menuItem}
+ <li data-menuItem="{$menuItem->menuItem}">{lang}{@$menuItem->menuItem}{/lang}</li>
+ {/foreach}
+ </ul>
+ {/if}
+ </nav>
+ <!-- /top nav -->
+
+ <!-- sub bar -->
+ <nav class="headerNavigation">
+ <ul>
+ <li id="toBottomLink" class="toBottomLink"><a href="#bottom" title="{lang}wcf.global.scrollDown{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/downS.png" alt="{lang}wcf.global.scrollDown{/lang}" /> <span class="invisible">{lang}wcf.global.scrollDown{/lang}</span></a></li>
+ </ul>
+ </nav>
+ <!-- /sub bar -->
+ </header>
+ <!-- /HEADER -->
+
+ <!-- CONTENT -->
+ <div id="main" class="main">
+ <div>
+ <aside class="sidebar">
+ <!-- sub nav -->
+ <nav id="sidebarMenu" class="sidebarMenu">
+ {* work-around for unknown core-object during WCFSetup *}
+ {if PACKAGE_ID}
+ {foreach from=$__wcf->getACPMenu()->getMenuItems('') item=parentMenuItem}
+ <div data-parentMenuItem="{$parentMenuItem->menuItem}" id="{$parentMenuItem->menuItem}-container" style="display: none;">
+ {foreach from=$__wcf->getACPMenu()->getMenuItems($parentMenuItem->menuItem) item=menuItem}
+ <h1 data-menuItem="{$menuItem->menuItem}" class="menuHeader">{lang}{@$menuItem->menuItem}{/lang}</h1>
+ <div class="sidebarMenuGroup">
+ <ul id="{$menuItem->menuItem}">
+ {foreach from=$__wcf->getACPMenu()->getMenuItems($menuItem->menuItem) item=menuItemCategory}
+ {if $__wcf->getACPMenu()->getMenuItems($menuItemCategory->menuItem)|count > 0}
+ {foreach from=$__wcf->getACPMenu()->getMenuItems($menuItemCategory->menuItem) item=subMenuItem}
+ <li data-menuItem="{$subMenuItem->menuItem}" id="{$subMenuItem->menuItem}"><a href="{$subMenuItem->getLink()}">{lang}{$subMenuItem->menuItem}{/lang}</a></li>
+ {/foreach}
+ {else}
+ <li data-menuItem="{$menuItemCategory->menuItem}" id="{$menuItemCategory->menuItem}"><a href="{$menuItemCategory->getLink()}">{lang}{$menuItemCategory->menuItem}{/lang}</a></li>
+ {/if}
+ {/foreach}
+ </ul>
+ </div>
+ {/foreach}
+ </div>
+ {/foreach}
+ {/if}
+ </nav>
+ <!-- /sub nav -->
+ </aside>
+
+ <section id="content">
-{include file='header'}\r
-\r
+{include file='header'}
+
{include file='footer'}
\ No newline at end of file
-{capture assign='pageTitle'}{lang}wcf.acp.login{/lang}{/capture}\r
-{include file='setupHeader'}\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- onloadEvents.push(function() { if (!'{$username|encodeJS}' || '{$errorField}' == 'username') document.getElementById('username').focus(); else document.getElementById('password').focus(); });\r
- //]]>\r
-</script>\r
-\r
-<img class="icon" src="{@RELATIVE_WCF_DIR}icon/loginXL.png" alt="" />\r
-\r
-<h1><b>{@$pageTitle}</b></h1>\r
-\r
-<hr />\r
-\r
-{if $errorField != ''}\r
-<p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=Login">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.login.data{/lang}</legend>\r
- \r
- <div class="inner">\r
- <div{if $errorField == 'username'} class="errorField"{/if}>\r
- <label for="username">{lang}wcf.user.username{/lang}</label>\r
- <input type="text" class="inputText" id="username" name="username" value="{$username}" />\r
- {if $errorField == 'username'}\r
- <p>\r
- <img src="{@RELATIVE_WCF_DIR}icon/errorS.png" alt="" />\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType == 'notFound'}{lang}wcf.user.error.username.notFound{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
-\r
- \r
- <div{if $errorField == 'password'} class="errorField"{/if}>\r
- <label for="password">{lang}wcf.user.password{/lang}</label>\r
- <input type="password" class="inputText" id="password" name="password" value="" />\r
- {if $errorField == 'password'}\r
- <p>\r
- <img src="{@RELATIVE_WCF_DIR}icon/errorS.png" alt="" />\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType == 'false'}{lang}wcf.user.error.password.false{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </div>\r
- </fieldset>\r
- \r
- <div class="nextButton">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- <input type="hidden" name="url" value="{$url}" />\r
- {@SID_INPUT_TAG}\r
- </div>\r
-</form>\r
-\r
+{capture assign='pageTitle'}{lang}wcf.acp.login{/lang}{/capture}
+{include file='setupHeader'}
+
+<script type="text/javascript">
+ //<![CDATA[
+ onloadEvents.push(function() { if (!'{$username|encodeJS}' || '{$errorField}' == 'username') document.getElementById('username').focus(); else document.getElementById('password').focus(); });
+ //]]>
+</script>
+
+<img class="icon" src="{@RELATIVE_WCF_DIR}icon/loginXL.png" alt="" />
+
+<h1><b>{@$pageTitle}</b></h1>
+
+<hr />
+
+{if $errorField != ''}
+<p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=Login">
+ <fieldset>
+ <legend>{lang}wcf.acp.login.data{/lang}</legend>
+
+ <div class="inner">
+ <div{if $errorField == 'username'} class="errorField"{/if}>
+ <label for="username">{lang}wcf.user.username{/lang}</label>
+ <input type="text" class="inputText" id="username" name="username" value="{$username}" />
+ {if $errorField == 'username'}
+ <p>
+ <img src="{@RELATIVE_WCF_DIR}icon/errorS.png" alt="" />
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType == 'notFound'}{lang}wcf.user.error.username.notFound{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+
+
+ <div{if $errorField == 'password'} class="errorField"{/if}>
+ <label for="password">{lang}wcf.user.password{/lang}</label>
+ <input type="password" class="inputText" id="password" name="password" value="" />
+ {if $errorField == 'password'}
+ <p>
+ <img src="{@RELATIVE_WCF_DIR}icon/errorS.png" alt="" />
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType == 'false'}{lang}wcf.user.error.password.false{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </div>
+ </fieldset>
+
+ <div class="nextButton">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ <input type="hidden" name="url" value="{$url}" />
+ {@SID_INPUT_TAG}
+ </div>
+</form>
+
{include file='setupFooter'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/loginL.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{lang}wcf.acp.masterPassword.enter{/lang}</h2>\r
- </div>\r
-</div>\r
-\r
-\r
-{if $errorField != ''}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=MasterPassword">\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.masterPassword.enter{/lang}</legend>\r
- \r
- <div class="formElement{if $errorField == 'masterPassword'} formError{/if}" id="masterPasswordDiv">\r
- <div class="formFieldLabel">\r
- <label for="masterPassword">{lang}wcf.acp.masterPassword{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="password" class="inputText" id="masterPassword" name="masterPassword" value="{$masterPassword}" />\r
- {if $errorField == 'masterPassword'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType == 'invalid'}{lang}wcf.acp.masterPassword.error.invalid{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="masterPasswordHelpMessage">\r
- <p>{lang}wcf.acp.masterPassword.enter.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('masterPassword');\r
- //]]></script>\r
- \r
- </fieldset>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </div>\r
- </div>\r
-\r
- <div class="formSubmit">\r
- <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="url" value="{$url}" />\r
- </div>\r
-</form>\r
+{include file='header'}
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/loginL.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{lang}wcf.acp.masterPassword.enter{/lang}</h2>
+ </div>
+</div>
+
+
+{if $errorField != ''}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=MasterPassword">
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.masterPassword.enter{/lang}</legend>
+
+ <div class="formElement{if $errorField == 'masterPassword'} formError{/if}" id="masterPasswordDiv">
+ <div class="formFieldLabel">
+ <label for="masterPassword">{lang}wcf.acp.masterPassword{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="password" class="inputText" id="masterPassword" name="masterPassword" value="{$masterPassword}" />
+ {if $errorField == 'masterPassword'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType == 'invalid'}{lang}wcf.acp.masterPassword.error.invalid{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="masterPasswordHelpMessage">
+ <p>{lang}wcf.acp.masterPassword.enter.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('masterPassword');
+ //]]></script>
+
+ </fieldset>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="url" value="{$url}" />
+ </div>
+</form>
<script type="text/javascript">
//<![CDATA[
});
//]]>
</script>
-\r
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- $(function() {\r
- $('#setPassword').click(function() {\r
- $('input[type="password"]').val($.proxy(function(index, element) {\r
- return $(this).text();\r
- }, this));\r
- });\r
- });\r
- //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/loginL.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{lang}wcf.acp.masterPassword.init{/lang}</h2>\r
- </div>\r
-</div>\r
-\r
-\r
-{if $errorField != ''}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=MasterPasswordInit">\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.masterPassword.init{/lang}</legend>\r
- \r
- <div class="formElement{if $errorField == 'masterPassword'} formError{/if}" id="masterPasswordDiv">\r
- <div class="formFieldLabel">\r
- <label for="masterPassword">{lang}wcf.acp.masterPassword{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="password" class="inputText" id="masterPassword" name="masterPassword" value="{$masterPassword}" />\r
- {if $errorField == 'masterPassword'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType == 'notSecure'}{lang}wcf.acp.masterPassword.error.notSecure{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="masterPasswordHelpMessage">\r
- <p>{lang}wcf.acp.masterPassword.init.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('masterPassword');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'confirmMasterPassword'} formError{/if}">\r
- <div class="formFieldLabel">\r
- <label for="confirmMasterPassword">{lang}wcf.acp.masterPassword.confirm{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="password" class="inputText" id="confirmMasterPassword" name="confirmMasterPassword" value="{$confirmMasterPassword}" />\r
- {if $errorField == 'confirmMasterPassword'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType == 'notEqual'}{lang}wcf.acp.masterPassword.error.notEqual{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- </div>\r
- \r
- <div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="exampleMasterPassword">{lang}wcf.acp.masterPassword.example{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <p><a href="#" id="setPassword" title="{lang}wcf.acp.masterPassword.example.set{/lang}">{@$exampleMasterPassword}</a></p>\r
- <input type="hidden" id="exampleMasterPassword" name="exampleMasterPassword" value="{@$exampleMasterPassword}" />\r
- </div>\r
- </div>\r
- </fieldset>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </div>\r
- </div>\r
-\r
- <div class="formSubmit">\r
- <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="url" value="{$url}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<script type="text/javascript">
+ //<![CDATA[
+ $(function() {
+ $('#setPassword').click(function() {
+ $('input[type="password"]').val($.proxy(function(index, element) {
+ return $(this).text();
+ }, this));
+ });
+ });
+ //]]>
+</script>
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/loginL.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{lang}wcf.acp.masterPassword.init{/lang}</h2>
+ </div>
+</div>
+
+
+{if $errorField != ''}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=MasterPasswordInit">
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.masterPassword.init{/lang}</legend>
+
+ <div class="formElement{if $errorField == 'masterPassword'} formError{/if}" id="masterPasswordDiv">
+ <div class="formFieldLabel">
+ <label for="masterPassword">{lang}wcf.acp.masterPassword{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="password" class="inputText" id="masterPassword" name="masterPassword" value="{$masterPassword}" />
+ {if $errorField == 'masterPassword'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType == 'notSecure'}{lang}wcf.acp.masterPassword.error.notSecure{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="masterPasswordHelpMessage">
+ <p>{lang}wcf.acp.masterPassword.init.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('masterPassword');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'confirmMasterPassword'} formError{/if}">
+ <div class="formFieldLabel">
+ <label for="confirmMasterPassword">{lang}wcf.acp.masterPassword.confirm{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="password" class="inputText" id="confirmMasterPassword" name="confirmMasterPassword" value="{$confirmMasterPassword}" />
+ {if $errorField == 'confirmMasterPassword'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType == 'notEqual'}{lang}wcf.acp.masterPassword.error.notEqual{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ </div>
+
+ <div class="formElement">
+ <div class="formFieldLabel">
+ <label for="exampleMasterPassword">{lang}wcf.acp.masterPassword.example{/lang}</label>
+ </div>
+ <div class="formField">
+ <p><a href="#" id="setPassword" title="{lang}wcf.acp.masterPassword.example.set{/lang}">{@$exampleMasterPassword}</a></p>
+ <input type="hidden" id="exampleMasterPassword" name="exampleMasterPassword" value="{@$exampleMasterPassword}" />
+ </div>
+ </div>
+ </fieldset>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="url" value="{$url}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- $(function() {\r
- WCF.TabMenu.init();\r
- new WCF.ACP.Options();\r
- });\r
- //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/optionL.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.option.category.{$category->categoryName}{/lang}</h1>\r
- <h2>{lang}wcf.acp.option.category.{$category->categoryName}.description{/lang}</h2>\r
- </hgroup>\r
-</header>\r
-\r
-{if $success|isset}\r
- <p class="success">{lang}wcf.acp.option.success{/lang}</p>\r
-{/if}\r
-\r
-{if $errorField}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=Option&categoryID={@$category->categoryID}">\r
- <div class="tabMenuContainer" data-active="{$activeTabMenuItem}" data-store="activeTabMenuItem">\r
- <nav>\r
- <ul class="tabMenu">\r
- {foreach from=$optionTree item=categoryLevel1}\r
- <li><a href="#{@$categoryLevel1[object]->categoryName}">{*<span>*}{lang}wcf.acp.option.category.{@$categoryLevel1[object]->categoryName}{/lang}{*</span>*}</a></li>\r
- {/foreach}\r
- </ul>\r
- </nav>\r
- \r
- {foreach from=$optionTree item=categoryLevel1}\r
- <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}">\r
- <div class="container-1">\r
- <hgroup>\r
- <h1 class="subHeading">{lang}wcf.acp.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</h1>\r
- <h2 class="description">{lang}wcf.acp.option.category.{$categoryLevel1[object]->categoryName}.description{/lang}</h2>\r
- </hgroup>\r
- \r
- {if $categoryLevel1[options]|count}\r
- <fieldset>\r
- <legend>{lang}wcf.acp.option.category.{$categoryLevel1[object]->categoryName}{/lang}</legend>\r
- {include file='optionFieldList' options=$categoryLevel1[options] langPrefix='wcf.acp.option.'}\r
- </fieldset>\r
- {/if}\r
- \r
- {if $categoryLevel1[categories]|count}\r
- {foreach from=$categoryLevel1[categories] item=categoryLevel2}\r
- <fieldset>\r
- <legend>{lang}wcf.acp.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</legend>\r
- <p class="description">{lang}wcf.acp.option.category.{$categoryLevel2[object]->categoryName}.description{/lang}</p>\r
- \r
- {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.acp.option.'}\r
- </fieldset>\r
- {/foreach}\r
- {/if}\r
- </div>\r
- </div>\r
- {/foreach}\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" id="activeTabMenuItem" name="activeTabMenuItem" value="{$activeTabMenuItem}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+<script type="text/javascript">
+ //<![CDATA[
+ $(function() {
+ WCF.TabMenu.init();
+ new WCF.ACP.Options();
+ });
+ //]]>
+</script>
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/optionL.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.option.category.{$category->categoryName}{/lang}</h1>
+ <h2>{lang}wcf.acp.option.category.{$category->categoryName}.description{/lang}</h2>
+ </hgroup>
+</header>
+
+{if $success|isset}
+ <p class="success">{lang}wcf.acp.option.success{/lang}</p>
+{/if}
+
+{if $errorField}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=Option&categoryID={@$category->categoryID}">
+ <div class="tabMenuContainer" data-active="{$activeTabMenuItem}" data-store="activeTabMenuItem">
+ <nav>
+ <ul class="tabMenu">
+ {foreach from=$optionTree item=categoryLevel1}
+ <li><a href="#{@$categoryLevel1[object]->categoryName}">{*<span>*}{lang}wcf.acp.option.category.{@$categoryLevel1[object]->categoryName}{/lang}{*</span>*}</a></li>
+ {/foreach}
+ </ul>
+ </nav>
+
+ {foreach from=$optionTree item=categoryLevel1}
+ <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}">
+ <div class="container-1">
+ <hgroup>
+ <h1 class="subHeading">{lang}wcf.acp.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</h1>
+ <h2 class="description">{lang}wcf.acp.option.category.{$categoryLevel1[object]->categoryName}.description{/lang}</h2>
+ </hgroup>
+
+ {if $categoryLevel1[options]|count}
+ <fieldset>
+ <legend>{lang}wcf.acp.option.category.{$categoryLevel1[object]->categoryName}{/lang}</legend>
+ {include file='optionFieldList' options=$categoryLevel1[options] langPrefix='wcf.acp.option.'}
+ </fieldset>
+ {/if}
+
+ {if $categoryLevel1[categories]|count}
+ {foreach from=$categoryLevel1[categories] item=categoryLevel2}
+ <fieldset>
+ <legend>{lang}wcf.acp.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</legend>
+ <p class="description">{lang}wcf.acp.option.category.{$categoryLevel2[object]->categoryName}.description{/lang}</p>
+
+ {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.acp.option.'}
+ </fieldset>
+ {/foreach}
+ {/if}
+ </div>
+ </div>
+ {/foreach}
+ </div>
+
+ <div class="formSubmit">
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ {@SID_INPUT_TAG}
+ <input type="hidden" id="activeTabMenuItem" name="activeTabMenuItem" value="{$activeTabMenuItem}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{foreach from=$options item=optionData}\r
- {assign var=option value=$optionData[object]}\r
- {if $errorType|is_array && $errorType[$option->optionName]|isset}\r
- {assign var=error value=$errorType[$option->optionName]}\r
- {else}\r
- {assign var=error value=''}\r
- {/if}\r
- <dl class="{$option->optionName}Input">\r
- <dt><label for="{$option->optionName}">{lang}{@$langPrefix}{$option->optionName}{/lang}</label></dt>\r
- <dd>{@$optionData[html]}</dd>\r
- {if $error}\r
- <p class="innerError">\r
- {if $error == 'empty'}\r
- {lang}wcf.global.error.empty{/lang}\r
- {else} \r
- {lang}wcf.user.option.error.{$error}{/lang}\r
- {/if}\r
- </p>\r
- {/if}\r
- <p>{lang}{@$langPrefix}{$option->optionName}.description{/lang}</p>\r
- </dl> \r
+{foreach from=$options item=optionData}
+ {assign var=option value=$optionData[object]}
+ {if $errorType|is_array && $errorType[$option->optionName]|isset}
+ {assign var=error value=$errorType[$option->optionName]}
+ {else}
+ {assign var=error value=''}
+ {/if}
+ <dl class="{$option->optionName}Input">
+ <dt><label for="{$option->optionName}">{lang}{@$langPrefix}{$option->optionName}{/lang}</label></dt>
+ <dd>{@$optionData[html]}</dd>
+ {if $error}
+ <p class="innerError">
+ {if $error == 'empty'}
+ {lang}wcf.global.error.empty{/lang}
+ {else}
+ {lang}wcf.user.option.error.{$error}{/lang}
+ {/if}
+ </p>
+ {/if}
+ <p>{lang}{@$langPrefix}{$option->optionName}.description{/lang}</p>
+ </dl>
{/foreach}
\ No newline at end of file
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/optionImportAndExportL.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.option.importAndExport{/lang}</h1>\r
- </hgroup>\r
-</header>\r
-\r
-{if $success|isset}\r
- <p class="success">{lang}wcf.acp.option.import.success{/lang}</p> \r
-{/if}\r
-\r
-{if $errorField != ''}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=OptionImport" enctype="multipart/form-data">\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.option.import{/lang}</legend>\r
- \r
- <div class="formElement{if $errorField == 'optionImport'} formError{/if}" id="optionImportDiv">\r
- <div class="formFieldLabel">\r
- <label for="optionImport">{lang}wcf.acp.option.import.upload{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="file" id="optionImport" name="optionImport" value="" />\r
- {if $errorField == 'optionImport'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType == 'importFailed'}{lang}wcf.acp.option.import.error.importFailed{/lang}{/if}\r
- {if $errorType == 'uploadFailed'}{lang}wcf.acp.option.import.error.uploadFailed{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="optionImportHelpMessage">\r
- <p>{lang}wcf.acp.option.import.upload.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('optionImport');\r
- //]]></script>\r
- </fieldset>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </div>\r
- </div>\r
-\r
- <div class="formSubmit">\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />\r
- {@SID_INPUT_TAG}\r
- </div>\r
-</form>\r
-\r
-<div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.option.export{/lang}</legend>\r
- \r
- <div class="formElement" id="optionExportDiv">\r
- <div class="formField">\r
- <a href="index.php?action=OptionExport{@SID_ARG_2ND}" id="optionExport">{lang}wcf.acp.option.export.download{/lang}</a>\r
- </div>\r
- <div class="formFieldDesc hidden" id="optionExportHelpMessage">\r
- <p>{lang}wcf.acp.option.export.download.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('optionExport');\r
- //]]></script>\r
- </fieldset>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </div>\r
-</div>\r
-\r
+{include file='header'}
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/optionImportAndExportL.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.option.importAndExport{/lang}</h1>
+ </hgroup>
+</header>
+
+{if $success|isset}
+ <p class="success">{lang}wcf.acp.option.import.success{/lang}</p>
+{/if}
+
+{if $errorField != ''}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=OptionImport" enctype="multipart/form-data">
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.option.import{/lang}</legend>
+
+ <div class="formElement{if $errorField == 'optionImport'} formError{/if}" id="optionImportDiv">
+ <div class="formFieldLabel">
+ <label for="optionImport">{lang}wcf.acp.option.import.upload{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="file" id="optionImport" name="optionImport" value="" />
+ {if $errorField == 'optionImport'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType == 'importFailed'}{lang}wcf.acp.option.import.error.importFailed{/lang}{/if}
+ {if $errorType == 'uploadFailed'}{lang}wcf.acp.option.import.error.uploadFailed{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="optionImportHelpMessage">
+ <p>{lang}wcf.acp.option.import.upload.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('optionImport');
+ //]]></script>
+ </fieldset>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />
+ {@SID_INPUT_TAG}
+ </div>
+</form>
+
+<div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.option.export{/lang}</legend>
+
+ <div class="formElement" id="optionExportDiv">
+ <div class="formField">
+ <a href="index.php?action=OptionExport{@SID_ARG_2ND}" id="optionExport">{lang}wcf.acp.option.export.download{/lang}</a>
+ </div>
+ <div class="formFieldDesc hidden" id="optionExportHelpMessage">
+ <p>{lang}wcf.acp.option.export.download.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('optionExport');
+ //]]></script>
+ </fieldset>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </div>
+</div>
+
{include file='footer'}
\ No newline at end of file
-<input {if $disableOptions || $enableOptions}class="enablesOptions" data-disableOptions="[ {@$disableOptions}]" data-enableOptions="[ {@$enableOptions}]" {/if}\r
-id="{$option->optionName}" type="checkbox" name="values[{$option->optionName}]" value="1"\r
+<input {if $disableOptions || $enableOptions}class="enablesOptions" data-disableOptions="[ {@$disableOptions}]" data-enableOptions="[ {@$enableOptions}]" {/if}
+id="{$option->optionName}" type="checkbox" name="values[{$option->optionName}]" value="1"
{if $value} checked="checked"{/if} />
\ No newline at end of file
-<ul class="formOptionsLong smallFont">\r
- {foreach from=$selectOptions key=key item=selectOption}\r
- <li>\r
- <label><input type="radio" name="values[{$option->optionName}]" value="{$key}"{if $value == $key} checked="checked"{/if} /> {lang}{@$selectOption}{/lang}</label>\r
- </li>\r
- {/foreach}\r
- <li>\r
- <label><input type="radio" name="values[{$option->optionName}]" value=""{if $value == $customValue} checked="checked"{/if} /></label>\r
- <input style="width: 400px" id="{$option->optionName}_custom" type="text" class="inputText" name="values[{$option->optionName}_custom]" value="{$customValue}" />\r
- </li>\r
+<ul class="formOptionsLong smallFont">
+ {foreach from=$selectOptions key=key item=selectOption}
+ <li>
+ <label><input type="radio" name="values[{$option->optionName}]" value="{$key}"{if $value == $key} checked="checked"{/if} /> {lang}{@$selectOption}{/lang}</label>
+ </li>
+ {/foreach}
+ <li>
+ <label><input type="radio" name="values[{$option->optionName}]" value=""{if $value == $customValue} checked="checked"{/if} /></label>
+ <input style="width: 400px" id="{$option->optionName}_custom" type="text" class="inputText" name="values[{$option->optionName}_custom]" value="{$customValue}" />
+ </li>
</ul>
\ No newline at end of file
-<div class="floatContainer">\r
- {foreach from=$dateInputOrder item=element}\r
- <div class="floatedElement">\r
- <label for="{$optionData.optionName}{$element|ucfirst}">{lang}wcf.global.date.{$element}{/lang}</label>\r
- \r
- {if $element == 'day'}\r
- <select id="{$optionData.optionName}Day" name="values[{$optionData.optionName}][day]">\r
- {htmlOptions options=$days selected=$day}\r
- </select>\r
- {/if}\r
- \r
- {if $element == 'month'}\r
- <select id="{$optionData.optionName}Month" name="values[{$optionData.optionName}][month]">\r
- {htmlOptions options=$months selected=$month}\r
- </select>\r
- {/if}\r
- \r
- {if $element == 'year'}\r
- <input id="{$optionData.optionName}Year" class="inputText fourDigitInput" type="text" name="values[{$optionData.optionName}][year]" value="{$year}" maxlength="4" />\r
- {/if}\r
- </div>\r
- {/foreach}\r
-</div>\r
-{if !$yearRequired}\r
- <p class="smallFont light">{lang}wcf.global.date.year.notRequired{/lang}</p>\r
+<div class="floatContainer">
+ {foreach from=$dateInputOrder item=element}
+ <div class="floatedElement">
+ <label for="{$optionData.optionName}{$element|ucfirst}">{lang}wcf.global.date.{$element}{/lang}</label>
+
+ {if $element == 'day'}
+ <select id="{$optionData.optionName}Day" name="values[{$optionData.optionName}][day]">
+ {htmlOptions options=$days selected=$day}
+ </select>
+ {/if}
+
+ {if $element == 'month'}
+ <select id="{$optionData.optionName}Month" name="values[{$optionData.optionName}][month]">
+ {htmlOptions options=$months selected=$month}
+ </select>
+ {/if}
+
+ {if $element == 'year'}
+ <input id="{$optionData.optionName}Year" class="inputText fourDigitInput" type="text" name="values[{$optionData.optionName}][year]" value="{$year}" maxlength="4" />
+ {/if}
+ </div>
+ {/foreach}
+</div>
+{if !$yearRequired}
+ <p class="smallFont light">{lang}wcf.global.date.year.notRequired{/lang}</p>
{/if}
\ No newline at end of file
-<select name="values[{$optionData.optionName}][]" id="{$optionData.optionName}" multiple="multiple" size="{if $options|count > 10}10{else}{@$options|count}{/if}">\r
-{foreach from=$options item=option key=key}\r
- <option value="{$key}"{if $key|in_array:$optionData.optionValue} selected="selected"{/if}>{lang}{@$option}{/lang}</option>\r
-{/foreach}\r
+<select name="values[{$optionData.optionName}][]" id="{$optionData.optionName}" multiple="multiple" size="{if $options|count > 10}10{else}{@$options|count}{/if}">
+{foreach from=$options item=option key=key}
+ <option value="{$key}"{if $key|in_array:$optionData.optionValue} selected="selected"{/if}>{lang}{@$option}{/lang}</option>
+{/foreach}
</select>
\ No newline at end of file
-<ul class="formOptionsLong">\r
- {foreach from=$selectOptions key=key item=selectOption}\r
- <li>\r
- <label><input {if $disableOptions[$key] || $enableOptions[$key]}class="enablesOptions" data-disableOptions="[ {@$disableOptions[$key]}]" data-enableOptions="[ {@$enableOptions[$key]}]" {/if}\r
- type="radio" name="values[{$option->optionName}]" value="{$key}"\r
- {if $value == $key} checked="checked"{/if} />\r
- {lang}{@$selectOption}{/lang}</label>\r
- </li>\r
- {/foreach}\r
+<ul class="formOptionsLong">
+ {foreach from=$selectOptions key=key item=selectOption}
+ <li>
+ <label><input {if $disableOptions[$key] || $enableOptions[$key]}class="enablesOptions" data-disableOptions="[ {@$disableOptions[$key]}]" data-enableOptions="[ {@$enableOptions[$key]}]" {/if}
+ type="radio" name="values[{$option->optionName}]" value="{$key}"
+ {if $value == $key} checked="checked"{/if} />
+ {lang}{@$selectOption}{/lang}</label>
+ </li>
+ {/foreach}
</ul>
\ No newline at end of file
-<select name="values[{$option->optionName}]" id="{$option->optionName}">\r
-{foreach from=$selectOptions key=key item=selectOption}\r
- <option value="{$key}"{if $value == $key} selected="selected"{/if}>{lang}{@$selectOption}{/lang}</option>\r
-{/foreach}\r
+<select name="values[{$option->optionName}]" id="{$option->optionName}">
+{foreach from=$selectOptions key=key item=selectOption}
+ <option value="{$key}"{if $value == $key} selected="selected"{/if}>{lang}{@$selectOption}{/lang}</option>
+{/foreach}
</select>
\ No newline at end of file
-<input id="{$option->optionName}" type="{@$inputType}" class="inputText" name="values[{$option->optionName}]" \r
+<input id="{$option->optionName}" type="{@$inputType}" class="inputText" name="values[{$option->optionName}]"
value="{$value}" />
\ No newline at end of file
-{include file='header'}\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- $(function() {\r
- var packageInstallation = new WCF.ACP.PackageInstallation('install', {@$queueID}, true);\r
- });\r
- //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/package{@$action|ucfirst}L.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{$archive->getPackageInfo('packageName')}</h2>\r
- <p>{$archive->getPackageInfo('packageDescription')}</p>\r
- </div>\r
-</div>\r
-\r
-{if $missingPackages > 0}\r
- <p class="error">{lang}wcf.acp.package.install.error{/lang}</p>\r
-{/if}\r
-\r
-{if $excludingPackages|count > 0}\r
- <div class="error">{lang}wcf.acp.package.install.error.excludingPackages{/lang}\r
- <ul>\r
- {foreach from=$excludingPackages item=excludingPackage}\r
- <li>{lang}wcf.acp.package.install.error.excludingPackages.excludingPackage{/lang}</li>\r
- {/foreach}\r
- </ul>\r
- </div>\r
-{/if}\r
-\r
-{if $excludedPackages|count > 0}\r
- <div class="error">{lang}wcf.acp.package.install.error.excludedPackages{/lang}\r
- <ul>\r
- {foreach from=$excludedPackages item=excludedPackage}\r
- <li>{lang}wcf.acp.package.install.error.excludedPackages.excludedPackage{/lang}</li>\r
- {/foreach}\r
- </ul>\r
- </div>\r
-{/if}\r
-\r
-<fieldset>\r
- <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>\r
-\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>\r
- <p class="formField">{$archive->getPackageInfo('name')}</p>\r
- </div>\r
- \r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.install.version{/lang}</p>\r
- <p class="formField">{$archive->getPackageInfo('version')}</p>\r
- </div>\r
-\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>\r
- <p class="formField">{@$archive->getPackageInfo('date')|date}</p>\r
- </div>\r
-\r
- {if $archive->getPackageInfo('packageURL') != ''}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>\r
- <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$archive->getPackageInfo('packageURL')|rawurlencode}" class="externalURL">{$archive->getPackageInfo('packageURL')}</a></p>\r
- </div>\r
- {/if}\r
- \r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>\r
- <p class="formField">{if $archive->getPackageInfo('authorURL')}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$archive->getPackageInfo('authorURL')|rawurlencode}" class="externalURL">{$archive->getPackageInfo('author')}</a>{else}{$archive->getPackageInfo('author')}{/if}</p>\r
- </div>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
-</fieldset>\r
-\r
-{if $updatableInstances|count > 0}\r
- <p class="warning" style="margin: 20px 0 10px 0">{lang}wcf.acp.package.install.updatableInstances.warning{/lang}</p>\r
- \r
- <div class="border titleBarPanel">\r
- <div class="containerHead">\r
- <h3>{lang}wcf.acp.package.install.updatableInstances{/lang}</h3>\r
- <p class="smallFont light">{lang}wcf.acp.package.install.updatableInstances.description{/lang}</p>\r
- </div>\r
- </div>\r
- <div class="border borderMarginRemove">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {foreach from=$updatableInstances item=$package}\r
- <tr class="{cycle values="container-1,container-2"}">\r
- <td class="columnText"><a href="index.php?page=Package&action=install&queueID={@$queueID}&step=changeToUpdate&updatePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>\r
- <td class="columnText">{$package.packageVersion}</td>\r
- </tr>\r
- {/foreach}\r
- </tbody>\r
- </table>\r
- </div>\r
-{/if}\r
-\r
-{if $requiredPackages|count > 0}\r
- <div class="border titleBarPanel">\r
- <div class="containerHead">\r
- <h3>{lang}wcf.acp.package.view.requiredPackages{/lang}</h3>\r
- <p class="smallFont light">{lang}wcf.acp.package.view.requiredPackages.description{/lang}</p>\r
- </div>\r
- </div>\r
- <div class="border borderMarginRemove">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {foreach from=$requiredPackages item=$package}\r
- <tr class="{cycle values="container-1,container-2"}">\r
- <td class="columnText">{lang}wcf.acp.package.install.packageName{/lang}</td>\r
- <td class="columnText">{if $package.minversion|isset}{$package.minversion}{/if}</td>\r
- </tr>\r
- {/foreach}\r
- </tbody>\r
- </table>\r
- </div>\r
-{/if}\r
-\r
-<div class="formSubmit">\r
- <input type="button" accesskey="c" value="{lang}wcf.global.button.back{/lang}" onclick="document.location.href=fixURL('index.php?page=Package&action={@$action}&queueID={@$queueID}&step=cancel{@SID_ARG_2ND}')" />\r
- \r
- {if $missingPackages == 0 && $excludingPackages|count == 0 && $excludedPackages|count == 0}\r
- <input type="button" accesskey="s" id="submitButton" value="{lang}wcf.global.button.next{/lang}" />\r
- {/if}\r
-</div>\r
-\r
+{include file='header'}
+
+<script type="text/javascript">
+ //<![CDATA[
+ $(function() {
+ var packageInstallation = new WCF.ACP.PackageInstallation('install', {@$queueID}, true);
+ });
+ //]]>
+</script>
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/package{@$action|ucfirst}L.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{$archive->getPackageInfo('packageName')}</h2>
+ <p>{$archive->getPackageInfo('packageDescription')}</p>
+ </div>
+</div>
+
+{if $missingPackages > 0}
+ <p class="error">{lang}wcf.acp.package.install.error{/lang}</p>
+{/if}
+
+{if $excludingPackages|count > 0}
+ <div class="error">{lang}wcf.acp.package.install.error.excludingPackages{/lang}
+ <ul>
+ {foreach from=$excludingPackages item=excludingPackage}
+ <li>{lang}wcf.acp.package.install.error.excludingPackages.excludingPackage{/lang}</li>
+ {/foreach}
+ </ul>
+ </div>
+{/if}
+
+{if $excludedPackages|count > 0}
+ <div class="error">{lang}wcf.acp.package.install.error.excludedPackages{/lang}
+ <ul>
+ {foreach from=$excludedPackages item=excludedPackage}
+ <li>{lang}wcf.acp.package.install.error.excludedPackages.excludedPackage{/lang}</li>
+ {/foreach}
+ </ul>
+ </div>
+{/if}
+
+<fieldset>
+ <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>
+
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>
+ <p class="formField">{$archive->getPackageInfo('name')}</p>
+ </div>
+
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.install.version{/lang}</p>
+ <p class="formField">{$archive->getPackageInfo('version')}</p>
+ </div>
+
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>
+ <p class="formField">{@$archive->getPackageInfo('date')|date}</p>
+ </div>
+
+ {if $archive->getPackageInfo('packageURL') != ''}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>
+ <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$archive->getPackageInfo('packageURL')|rawurlencode}" class="externalURL">{$archive->getPackageInfo('packageURL')}</a></p>
+ </div>
+ {/if}
+
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>
+ <p class="formField">{if $archive->getPackageInfo('authorURL')}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$archive->getPackageInfo('authorURL')|rawurlencode}" class="externalURL">{$archive->getPackageInfo('author')}</a>{else}{$archive->getPackageInfo('author')}{/if}</p>
+ </div>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+</fieldset>
+
+{if $updatableInstances|count > 0}
+ <p class="warning" style="margin: 20px 0 10px 0">{lang}wcf.acp.package.install.updatableInstances.warning{/lang}</p>
+
+ <div class="border titleBarPanel">
+ <div class="containerHead">
+ <h3>{lang}wcf.acp.package.install.updatableInstances{/lang}</h3>
+ <p class="smallFont light">{lang}wcf.acp.package.install.updatableInstances.description{/lang}</p>
+ </div>
+ </div>
+ <div class="border borderMarginRemove">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+ </tr>
+ </thead>
+ <tbody>
+ {foreach from=$updatableInstances item=$package}
+ <tr class="{cycle values="container-1,container-2"}">
+ <td class="columnText"><a href="index.php?page=Package&action=install&queueID={@$queueID}&step=changeToUpdate&updatePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>
+ <td class="columnText">{$package.packageVersion}</td>
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+ </div>
+{/if}
+
+{if $requiredPackages|count > 0}
+ <div class="border titleBarPanel">
+ <div class="containerHead">
+ <h3>{lang}wcf.acp.package.view.requiredPackages{/lang}</h3>
+ <p class="smallFont light">{lang}wcf.acp.package.view.requiredPackages.description{/lang}</p>
+ </div>
+ </div>
+ <div class="border borderMarginRemove">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+ </tr>
+ </thead>
+ <tbody>
+ {foreach from=$requiredPackages item=$package}
+ <tr class="{cycle values="container-1,container-2"}">
+ <td class="columnText">{lang}wcf.acp.package.install.packageName{/lang}</td>
+ <td class="columnText">{if $package.minversion|isset}{$package.minversion}{/if}</td>
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+ </div>
+{/if}
+
+<div class="formSubmit">
+ <input type="button" accesskey="c" value="{lang}wcf.global.button.back{/lang}" onclick="document.location.href=fixURL('index.php?page=Package&action={@$action}&queueID={@$queueID}&step=cancel{@SID_ARG_2ND}')" />
+
+ {if $missingPackages == 0 && $excludingPackages|count == 0 && $excludedPackages|count == 0}
+ <input type="button" accesskey="s" id="submitButton" value="{lang}wcf.global.button.next{/lang}" />
+ {/if}
+</div>
+
{include file='footer'}
\ No newline at end of file
-{include file='header' templateName='packageInstallationSetup'}\r
-\r
+{include file='header' templateName='packageInstallationSetup'}
+
<script type="text/javascript">
- //<![CDATA[\r
- $installation = new WCF.ACP.PackageInstallation('install', {@$queueID}, false);\r
- $installation.prepareInstallation();\r
+ //<![CDATA[
+ $installation = new WCF.ACP.PackageInstallation('install', {@$queueID}, false);
+ $installation.prepareInstallation();
//]]>
-</script>\r
-\r
+</script>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- $(function() {\r
- WCF.Language.add('wcf.acp.package.view.button.uninstall.sure', '{lang}wcf.acp.package.view.button.uninstall.sure{/lang}');\r
- \r
- new WCF.ACP.PackageUninstallation($('.packageRow .uninstallButton'));\r
- });\r
- //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageL.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.package.list{/lang}</h1>\r
- </hgroup>\r
-</header>\r
-\r
-<div class="contentHeader">\r
- {pages print=true assign=pagesLinks link="index.php?page=PackageList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}\r
-\r
- {if $__wcf->session->getPermission('admin.system.package.canInstallPackage') || $additionalLargeButtons|isset}\r
- <nav class="largeButtons">\r
- <ul>\r
- {if $__wcf->session->getPermission('admin.system.package.canInstallPackage')}<li><a href="index.php?form=PackageStartInstall&action=install{@SID_ARG_2ND}" title="{lang}wcf.acp.package.startInstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageInstallM.png" alt="" /> <span>{lang}wcf.acp.package.startInstall{/lang}</span></a></li>{/if}\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </nav>\r
- {/if}\r
-</div>\r
-\r
-{if $packages|count > 0}\r
- <div class="border titleBarPanel">\r
- <div class="containerHead"><h3>{lang}wcf.acp.package.list.count{/lang}</h3></div>\r
- </div>\r
- <div class="border borderMarginRemove">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th colspan="2"{if $sortField == 'packageID'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=packageID&sortOrder={if $sortField == 'packageID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.id{/lang}{if $sortField == 'packageID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th colspan="2"{if $sortField == 'packageName'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=packageName&sortOrder={if $sortField == 'packageName' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.name{/lang}{if $sortField == 'packageName'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th{if $sortField == 'author'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=author&sortOrder={if $sortField == 'author' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.author{/lang}{if $sortField == 'author'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th{if $sortField == 'packageVersion'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=packageVersion&sortOrder={if $sortField == 'packageVersion' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.version{/lang}{if $sortField == 'packageVersion'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th{if $sortField == 'updateDate'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=updateDate&sortOrder={if $sortField == 'updateDate' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.updateDate{/lang}{if $sortField == 'updateDate'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- \r
- {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {foreach from=$packages item=$package}\r
- <tr class="packageRow {cycle values="container-1,container-2"}">\r
- <td class="columnIcon">\r
- {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}\r
- <a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package->packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />\r
- {/if}\r
- {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package->package != 'com.woltlab.wcf' && $package->packageID != PACKAGE_ID}\r
- <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" class="uninstallButton" data-objectID="{@$package->packageID}" />\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />\r
- {/if}\r
- \r
- {if $additionalButtons[$package->packageID]|isset}{@$additionalButtons[$package->packageID]}{/if}\r
- </td>\r
- <td class="columnID">{@$package->packageID}</td>\r
- <td class="columnIcon">\r
- {if $package->standalone}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />\r
- {elseif $package->isPlugin()}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />\r
- {/if}\r
- </td>\r
- <td class="columnText" title="{$package->packageDescription}" id="packageName{@$package->packageID}">\r
- <a href="index.php?page=PackageView&activePackageID={@$package->packageID}{@SID_ARG_2ND}"><span>{$package->getName()}{if $package->instanceNo > 1 && $package->instanceName == ''} (#{#$package->instanceNo}){/if}</span></a>\r
- </td>\r
- <td class="columnText">{if $package->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->authorURL|rawurlencode}" class="externalURL">{$package->author}</a>{else}{$package->author}{/if}</td>\r
- <td class="columnText">{$package->packageVersion}</td>\r
- <td class="columnDate">{@$package->updateDate|time}</td>\r
- \r
- {if $additionalColumns[$package->packageID]|isset}{@$additionalColumns[$package->packageID]}{/if}\r
- </tr>\r
- {/foreach}\r
- </tbody>\r
- </table>\r
- </div>\r
-{/if}\r
-\r
-<div class="contentFooter">\r
- {@$pagesLinks}\r
- \r
- {if $__wcf->session->getPermission('admin.system.package.canInstallPackage') || $additionalLargeButtons|isset}\r
- <nav class="largeButtons">\r
- <ul>\r
- {if $__wcf->session->getPermission('admin.system.package.canInstallPackage')}<li><a href="index.php?form=PackageStartInstall&action=install{@SID_ARG_2ND}" title="{lang}wcf.acp.package.startInstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageInstallM.png" alt="" /> <span>{lang}wcf.acp.package.startInstall{/lang}</span></a></li>{/if}\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </nav>\r
- {/if}\r
-</div>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>
+<script type="text/javascript">
+ //<![CDATA[
+ $(function() {
+ WCF.Language.add('wcf.acp.package.view.button.uninstall.sure', '{lang}wcf.acp.package.view.button.uninstall.sure{/lang}');
+
+ new WCF.ACP.PackageUninstallation($('.packageRow .uninstallButton'));
+ });
+ //]]>
+</script>
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/packageL.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.package.list{/lang}</h1>
+ </hgroup>
+</header>
+
+<div class="contentHeader">
+ {pages print=true assign=pagesLinks link="index.php?page=PackageList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}
+
+ {if $__wcf->session->getPermission('admin.system.package.canInstallPackage') || $additionalLargeButtons|isset}
+ <nav class="largeButtons">
+ <ul>
+ {if $__wcf->session->getPermission('admin.system.package.canInstallPackage')}<li><a href="index.php?form=PackageStartInstall&action=install{@SID_ARG_2ND}" title="{lang}wcf.acp.package.startInstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageInstallM.png" alt="" /> <span>{lang}wcf.acp.package.startInstall{/lang}</span></a></li>{/if}
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </nav>
+ {/if}
+</div>
+
+{if $packages|count > 0}
+ <div class="border titleBarPanel">
+ <div class="containerHead"><h3>{lang}wcf.acp.package.list.count{/lang}</h3></div>
+ </div>
+ <div class="border borderMarginRemove">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th colspan="2"{if $sortField == 'packageID'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=packageID&sortOrder={if $sortField == 'packageID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.id{/lang}{if $sortField == 'packageID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th colspan="2"{if $sortField == 'packageName'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=packageName&sortOrder={if $sortField == 'packageName' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.name{/lang}{if $sortField == 'packageName'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th{if $sortField == 'author'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=author&sortOrder={if $sortField == 'author' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.author{/lang}{if $sortField == 'author'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th{if $sortField == 'packageVersion'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=packageVersion&sortOrder={if $sortField == 'packageVersion' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.list.version{/lang}{if $sortField == 'packageVersion'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th{if $sortField == 'updateDate'} class="active"{/if}><div><a href="index.php?page=PackageList&pageNo={@$pageNo}&sortField=updateDate&sortOrder={if $sortField == 'updateDate' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.package.updateDate{/lang}{if $sortField == 'updateDate'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+
+ {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}
+ </tr>
+ </thead>
+ <tbody>
+ {foreach from=$packages item=$package}
+ <tr class="packageRow {cycle values="container-1,container-2"}">
+ <td class="columnIcon">
+ {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}
+ <a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package->packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />
+ {/if}
+ {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package->package != 'com.woltlab.wcf' && $package->packageID != PACKAGE_ID}
+ <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" class="uninstallButton" data-objectID="{@$package->packageID}" />
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />
+ {/if}
+
+ {if $additionalButtons[$package->packageID]|isset}{@$additionalButtons[$package->packageID]}{/if}
+ </td>
+ <td class="columnID">{@$package->packageID}</td>
+ <td class="columnIcon">
+ {if $package->standalone}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />
+ {elseif $package->isPlugin()}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />
+ {/if}
+ </td>
+ <td class="columnText" title="{$package->packageDescription}" id="packageName{@$package->packageID}">
+ <a href="index.php?page=PackageView&activePackageID={@$package->packageID}{@SID_ARG_2ND}"><span>{$package->getName()}{if $package->instanceNo > 1 && $package->instanceName == ''} (#{#$package->instanceNo}){/if}</span></a>
+ </td>
+ <td class="columnText">{if $package->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->authorURL|rawurlencode}" class="externalURL">{$package->author}</a>{else}{$package->author}{/if}</td>
+ <td class="columnText">{$package->packageVersion}</td>
+ <td class="columnDate">{@$package->updateDate|time}</td>
+
+ {if $additionalColumns[$package->packageID]|isset}{@$additionalColumns[$package->packageID]}{/if}
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+ </div>
+{/if}
+
+<div class="contentFooter">
+ {@$pagesLinks}
+
+ {if $__wcf->session->getPermission('admin.system.package.canInstallPackage') || $additionalLargeButtons|isset}
+ <nav class="largeButtons">
+ <ul>
+ {if $__wcf->session->getPermission('admin.system.package.canInstallPackage')}<li><a href="index.php?form=PackageStartInstall&action=install{@SID_ARG_2ND}" title="{lang}wcf.acp.package.startInstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageInstallM.png" alt="" /> <span>{lang}wcf.acp.package.startInstall{/lang}</span></a></li>{/if}
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </nav>
+ {/if}
+</div>
+
+{include file='footer'}
-{include file='header'}\r
-\r
-\r
-<header class="mainHeading">\r
- {if $packageID == 0}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageInstallL.png" alt="" />\r
- <hgroup class="headlineContainer">\r
- <h1>{lang}wcf.acp.package.startInstall{/lang}</h1>\r
- </hgroup>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateL.png" alt="" />\r
- <hgroup class="headlineContainer">\r
- <h1>{lang}wcf.acp.package.startUpdate{/lang}</h1>\r
- </hgroup>\r
- {/if}\r
-</header>\r
-\r
-{if $errorField != ''}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<div class="contentHeader">\r
- <nav class="largeButtons">\r
- <ul>\r
- <li><a href="index.php?page=PackageList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.package.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageM.png" alt="" /> <span>{lang}wcf.acp.menu.link.package.view{/lang}</span></a></li>\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=PackageStartInstall" enctype="multipart/form-data">\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.package.startInstall.source{/lang}</legend>\r
- \r
- <div class="formElement{if $errorField == 'uploadPackage'} formError{/if}" id="uploadPackageDiv">\r
- <div class="formFieldLabel">\r
- <label for="uploadPackage">{lang}wcf.acp.package.startInstall.source.upload{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="file" id="uploadPackage" name="uploadPackage" value="" />\r
- {if $errorField == 'uploadPackage'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType == 'noValidPackage'}{lang}wcf.acp.package.startInstall.error.noValidPackage{/lang}{/if}\r
- {if $errorType == 'noValidUpdate'}{lang}wcf.acp.package.startInstall.error.noValidUpdate{/lang}{/if}\r
- {if $errorType == 'noValidInstall'}{lang}wcf.acp.package.startInstall.error.noValidInstall{/lang}{/if}\r
- {if $errorType == 'uploadFailed'}{lang}wcf.acp.package.startInstall.error.uploadFailed{/lang}{/if}\r
- {if $errorType == 'uniqueAlreadyInstalled'}{lang}wcf.acp.package.startInstall.error.uniqueAlreadyInstalled{/lang}{/if}\r
- {if $errorType == 'phpRequirements'}<pre>{$phpRequirements|print_r}</pre>{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="uploadPackageHelpMessage">\r
- <p>{lang}wcf.acp.package.startInstall.source.upload.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('uploadPackage');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'downloadPackage'} formError{/if}" id="downloadPackageDiv">\r
- <div class="formFieldLabel">\r
- <label for="downloadPackage">{lang}wcf.acp.package.startInstall.source.download{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="downloadPackage" name="downloadPackage" value="" />\r
- {if $errorField == 'downloadPackage'}\r
- <p class="innerError">\r
- {if $errorType == 'notFound'}{lang}wcf.acp.package.startInstall.error.notFound{/lang}{/if}\r
- {if $errorType == 'noValidPackage'}{lang}wcf.acp.package.startInstall.error.noValidPackage{/lang}{/if}\r
- {if $errorType == 'noValidUpdate'}{lang}wcf.acp.package.startInstall.error.noValidUpdate{/lang}{/if}\r
- {if $errorType == 'noValidInstall'}{lang}wcf.acp.package.startInstall.error.noValidInstall{/lang}{/if}\r
- {if $errorType == 'uniqueAlreadyInstalled'}{lang}wcf.acp.package.startInstall.error.uniqueAlreadyInstalled{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="downloadPackageHelpMessage">\r
- <p>{lang}wcf.acp.package.startInstall.source.download.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('downloadPackage');\r
- //]]></script>\r
- \r
- </fieldset>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </div>\r
- </div>\r
-\r
- <div class="formSubmit">\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />\r
- \r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="action" value="{$action}" />\r
- {if $packageID != 0}<input type="hidden" name="activePackageID" value="{@$packageID}" />{/if}\r
- </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+
+<header class="mainHeading">
+ {if $packageID == 0}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageInstallL.png" alt="" />
+ <hgroup class="headlineContainer">
+ <h1>{lang}wcf.acp.package.startInstall{/lang}</h1>
+ </hgroup>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateL.png" alt="" />
+ <hgroup class="headlineContainer">
+ <h1>{lang}wcf.acp.package.startUpdate{/lang}</h1>
+ </hgroup>
+ {/if}
+</header>
+
+{if $errorField != ''}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+ <nav class="largeButtons">
+ <ul>
+ <li><a href="index.php?page=PackageList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.package.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageM.png" alt="" /> <span>{lang}wcf.acp.menu.link.package.view{/lang}</span></a></li>
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </nav>
+</div>
+
+<form method="post" action="index.php?form=PackageStartInstall" enctype="multipart/form-data">
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.package.startInstall.source{/lang}</legend>
+
+ <div class="formElement{if $errorField == 'uploadPackage'} formError{/if}" id="uploadPackageDiv">
+ <div class="formFieldLabel">
+ <label for="uploadPackage">{lang}wcf.acp.package.startInstall.source.upload{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="file" id="uploadPackage" name="uploadPackage" value="" />
+ {if $errorField == 'uploadPackage'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType == 'noValidPackage'}{lang}wcf.acp.package.startInstall.error.noValidPackage{/lang}{/if}
+ {if $errorType == 'noValidUpdate'}{lang}wcf.acp.package.startInstall.error.noValidUpdate{/lang}{/if}
+ {if $errorType == 'noValidInstall'}{lang}wcf.acp.package.startInstall.error.noValidInstall{/lang}{/if}
+ {if $errorType == 'uploadFailed'}{lang}wcf.acp.package.startInstall.error.uploadFailed{/lang}{/if}
+ {if $errorType == 'uniqueAlreadyInstalled'}{lang}wcf.acp.package.startInstall.error.uniqueAlreadyInstalled{/lang}{/if}
+ {if $errorType == 'phpRequirements'}<pre>{$phpRequirements|print_r}</pre>{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="uploadPackageHelpMessage">
+ <p>{lang}wcf.acp.package.startInstall.source.upload.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('uploadPackage');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'downloadPackage'} formError{/if}" id="downloadPackageDiv">
+ <div class="formFieldLabel">
+ <label for="downloadPackage">{lang}wcf.acp.package.startInstall.source.download{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="downloadPackage" name="downloadPackage" value="" />
+ {if $errorField == 'downloadPackage'}
+ <p class="innerError">
+ {if $errorType == 'notFound'}{lang}wcf.acp.package.startInstall.error.notFound{/lang}{/if}
+ {if $errorType == 'noValidPackage'}{lang}wcf.acp.package.startInstall.error.noValidPackage{/lang}{/if}
+ {if $errorType == 'noValidUpdate'}{lang}wcf.acp.package.startInstall.error.noValidUpdate{/lang}{/if}
+ {if $errorType == 'noValidInstall'}{lang}wcf.acp.package.startInstall.error.noValidInstall{/lang}{/if}
+ {if $errorType == 'uniqueAlreadyInstalled'}{lang}wcf.acp.package.startInstall.error.uniqueAlreadyInstalled{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="downloadPackageHelpMessage">
+ <p>{lang}wcf.acp.package.startInstall.source.download.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('downloadPackage');
+ //]]></script>
+
+ </fieldset>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ <input type="submit" accesskey="s" name="submitButton" value="{lang}wcf.global.button.submit{/lang}" />
+
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="action" value="{$action}" />
+ {if $packageID != 0}<input type="hidden" name="activePackageID" value="{@$packageID}" />{/if}
+ </div>
+</form>
+
+{include file='footer'}
-{include file='header'}\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- $(function() {\r
- new WCF.ACP.PackageUninstallation({@$packageObj->packageID});\r
- });\r
-// ]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageUninstallL.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{lang}wcf.acp.package.uninstall{/lang}: {$packageObj->getName()}</h2>\r
- <p>{$packageObj->packageDescription}</p>\r
- </div>\r
-</div>\r
-\r
-<fieldset>\r
- <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>\r
- <p class="formField">{$packageObj->package}</p>\r
- </div>\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.version{/lang}</p>\r
- <p class="formField">{$packageObj->packageVersion}</p>\r
- </div>\r
- {if $packageObj->instanceNo > 0}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>\r
- <p class="formField">{$packageObj->instanceNo}</p>\r
- </div>\r
- {/if}\r
- {if $packageObj->packageDir != ''}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>\r
- <p class="formField"><a href="{@RELATIVE_WCF_DIR}{$packageObj->packageDir}">{$packageObj->packageDir}</a></p>\r
- </div>\r
- {/if}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>\r
- <p class="formField">{@$packageObj->packageDate|date}</p>\r
- </div>\r
- {if $packageObj->packageURL != ''}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>\r
- <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$packageObj->packageURL|rawurlencode}" class="externalURL">{$packageObj->packageURL}</a></p>\r
- </div>\r
- {/if}\r
- {if $packageObj->parentPackageID}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.parent{/lang}</p>\r
- <p class="formField"><a href="index.php?page=PackageView&activePackageID={@$packageObj->parentPackageID}{@SID_ARG_2ND}">{$packageObj->getParentPackage()->getName()}</a></p>\r
- </div>\r
- {/if}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>\r
- <p class="formField">{if $packageObj->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$packageObj->authorURL|rawurlencode}" class="externalURL">{$packageObj->author}</a>{else}{$packageObj->author}{/if}</p>\r
- </div>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
-</fieldset>\r
-\r
-{if $dependentPackages|count > 0}\r
- {if $uninstallAvailable}\r
- <p class="warning">{lang}wcf.acp.package.uninstall.dependentPackages.warning{/lang}</p>\r
- {else}\r
- <p class="error">{lang}wcf.acp.package.uninstall.dependentPackages.error{/lang}</p>\r
- {/if}\r
-\r
- <div class="border titleBarPanel">\r
- <div class="containerHead"><h3>{lang}wcf.acp.package.view.dependentPackages{/lang}</h3></div>\r
- </div>\r
- <div class="border borderMarginRemove">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>\r
- <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>\r
- \r
- {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {foreach from=$dependentPackages item=package}\r
- <tr class="{cycle values="container-1,container-2"}">\r
- <td class="columnIcon">\r
- {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}\r
- <a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />\r
- {/if}\r
- {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}\r
- <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&action=startUninstall&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />\r
- {/if}\r
- \r
- {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}\r
- </td>\r
- <td class="columnID">{@$package.packageID}</td>\r
- <td class="columnIcon">\r
- {if $package.standalone}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />\r
- {elseif $package.parentPackageID}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />\r
- {/if}\r
- </td>\r
- <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>\r
- <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>\r
- <td class="columnText">{$package.packageVersion}</td>\r
- <td class="columnDate">{@$package.packageDate|date}</td>\r
- \r
- {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}\r
- </tr>\r
- {/foreach}\r
- </tbody>\r
- </table>\r
- </div>\r
-{/if}\r
-\r
-<div class="formSubmit">\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="action" value="startUninstall" />\r
- <input type="hidden" name="activePackageID" value="{@$packageObj->packageID}" />\r
- <input type="hidden" name="send" value="1" />\r
- <input type="button" accesskey="c" value="{lang}wcf.global.button.back{/lang}" onclick="document.location.href=fixURL('index.php?page=PackageView&activePackageID={$activePackageID}{@SID_ARG_2ND}')" />\r
- <input type="button" accesskey="s" id="uninstallPackage" value="{lang}wcf.global.button.next{/lang}" />\r
-</div>\r
-\r
+{include file='header'}
+
+<script type="text/javascript">
+ //<![CDATA[
+ $(function() {
+ new WCF.ACP.PackageUninstallation({@$packageObj->packageID});
+ });
+// ]]>
+</script>
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/packageUninstallL.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{lang}wcf.acp.package.uninstall{/lang}: {$packageObj->getName()}</h2>
+ <p>{$packageObj->packageDescription}</p>
+ </div>
+</div>
+
+<fieldset>
+ <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>
+ <p class="formField">{$packageObj->package}</p>
+ </div>
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.version{/lang}</p>
+ <p class="formField">{$packageObj->packageVersion}</p>
+ </div>
+ {if $packageObj->instanceNo > 0}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>
+ <p class="formField">{$packageObj->instanceNo}</p>
+ </div>
+ {/if}
+ {if $packageObj->packageDir != ''}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>
+ <p class="formField"><a href="{@RELATIVE_WCF_DIR}{$packageObj->packageDir}">{$packageObj->packageDir}</a></p>
+ </div>
+ {/if}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>
+ <p class="formField">{@$packageObj->packageDate|date}</p>
+ </div>
+ {if $packageObj->packageURL != ''}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>
+ <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$packageObj->packageURL|rawurlencode}" class="externalURL">{$packageObj->packageURL}</a></p>
+ </div>
+ {/if}
+ {if $packageObj->parentPackageID}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.parent{/lang}</p>
+ <p class="formField"><a href="index.php?page=PackageView&activePackageID={@$packageObj->parentPackageID}{@SID_ARG_2ND}">{$packageObj->getParentPackage()->getName()}</a></p>
+ </div>
+ {/if}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>
+ <p class="formField">{if $packageObj->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$packageObj->authorURL|rawurlencode}" class="externalURL">{$packageObj->author}</a>{else}{$packageObj->author}{/if}</p>
+ </div>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+</fieldset>
+
+{if $dependentPackages|count > 0}
+ {if $uninstallAvailable}
+ <p class="warning">{lang}wcf.acp.package.uninstall.dependentPackages.warning{/lang}</p>
+ {else}
+ <p class="error">{lang}wcf.acp.package.uninstall.dependentPackages.error{/lang}</p>
+ {/if}
+
+ <div class="border titleBarPanel">
+ <div class="containerHead"><h3>{lang}wcf.acp.package.view.dependentPackages{/lang}</h3></div>
+ </div>
+ <div class="border borderMarginRemove">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>
+ <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>
+
+ {if $additionalColumns|isset}{@$additionalColumns}{/if}
+ </tr>
+ </thead>
+ <tbody>
+ {foreach from=$dependentPackages item=package}
+ <tr class="{cycle values="container-1,container-2"}">
+ <td class="columnIcon">
+ {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}
+ <a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />
+ {/if}
+ {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}
+ <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&action=startUninstall&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />
+ {/if}
+
+ {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}
+ </td>
+ <td class="columnID">{@$package.packageID}</td>
+ <td class="columnIcon">
+ {if $package.standalone}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />
+ {elseif $package.parentPackageID}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />
+ {/if}
+ </td>
+ <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>
+ <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>
+ <td class="columnText">{$package.packageVersion}</td>
+ <td class="columnDate">{@$package.packageDate|date}</td>
+
+ {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+ </div>
+{/if}
+
+<div class="formSubmit">
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="action" value="startUninstall" />
+ <input type="hidden" name="activePackageID" value="{@$packageObj->packageID}" />
+ <input type="hidden" name="send" value="1" />
+ <input type="button" accesskey="c" value="{lang}wcf.global.button.back{/lang}" onclick="document.location.href=fixURL('index.php?page=PackageView&activePackageID={$activePackageID}{@SID_ARG_2ND}')" />
+ <input type="button" accesskey="s" id="uninstallPackage" value="{lang}wcf.global.button.next{/lang}" />
+</div>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateL.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{lang}wcf.acp.packageUpdate.auth{/lang}</h2>\r
- </div>\r
-</div>\r
-\r
-{if $errorField != ''}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="{$requestMethod}" action="index.php{if $getParameters}?{@$getParameters}{/if}">\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.packageUpdate.auth.data{/lang}</legend>\r
- \r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.url{/lang}</p>\r
- <p class="formField">{$url}</p>\r
- </div>\r
- {if $realm}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.realm{/lang}</p>\r
- <p class="formField">{$realm}</p>\r
- </div>\r
- {/if}\r
- {if $message}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.message{/lang}</p>\r
- <p class="formField">{@$message}</p>\r
- </div>\r
- {/if}\r
- </fieldset>\r
- \r
- <fieldset>\r
- <legend>{lang}wcf.acp.packageUpdate.auth.input{/lang}</legend>\r
- \r
- <div class="formElement{if $errorField == 'loginPassword'} formError{/if}" id="loginUsernameDiv">\r
- <div class="formFieldLabel">\r
- <label for="loginUsername">{lang}wcf.acp.packageUpdate.auth.loginUsername{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="loginUsername" name="loginUsername" value="{$loginUsername}" />\r
- </div>\r
- <div class="formFieldDesc hidden" id="loginUsernameHelpMessage">\r
- <p>{lang}wcf.acp.packageUpdate.auth.loginUsername.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('loginUsername');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'loginPassword'} formError{/if}" id="loginPasswordDiv">\r
- <div class="formFieldLabel">\r
- <label for="loginPassword">{lang}wcf.acp.packageUpdate.auth.loginPassword{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="password" class="inputText" id="loginPassword" name="loginPassword" value="{$loginPassword}" />\r
- {if $errorField == 'loginPassword'}\r
- <p class="innerError">\r
- {if $errorType == 'invalid'}{lang}wcf.acp.packageUpdate.auth.error{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="loginPasswordHelpMessage">\r
- <p>{lang}wcf.acp.packageUpdate.auth.loginPassword.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('loginPassword');\r
- //]]></script>\r
- \r
- <div class="formElement" id="saveAuthDataDiv">\r
- <div class="formField">\r
- <label><input type="checkbox" id="saveAuthData" name="saveAuthData" value="1" {if $saveAuthData == 1}checked="checked" {/if}/> {lang}wcf.acp.packageUpdate.auth.save{/lang}</label>\r
- </div>\r
- <div class="formFieldDesc hidden" id="saveAuthDataHelpMessage">\r
- <p>{lang}wcf.acp.packageUpdate.auth.save.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('saveAuthData');\r
- //]]></script>\r
- </fieldset>\r
- \r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- \r
- <input type="hidden" name="form" value="PackageUpdateAuth" />\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="packageUpdateServerID" value="{@$packageUpdateServerID}" />\r
- \r
- {@$postParameters}\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateL.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{lang}wcf.acp.packageUpdate.auth{/lang}</h2>
+ </div>
+</div>
+
+{if $errorField != ''}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="{$requestMethod}" action="index.php{if $getParameters}?{@$getParameters}{/if}">
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.packageUpdate.auth.data{/lang}</legend>
+
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.url{/lang}</p>
+ <p class="formField">{$url}</p>
+ </div>
+ {if $realm}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.realm{/lang}</p>
+ <p class="formField">{$realm}</p>
+ </div>
+ {/if}
+ {if $message}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.packageUpdate.auth.message{/lang}</p>
+ <p class="formField">{@$message}</p>
+ </div>
+ {/if}
+ </fieldset>
+
+ <fieldset>
+ <legend>{lang}wcf.acp.packageUpdate.auth.input{/lang}</legend>
+
+ <div class="formElement{if $errorField == 'loginPassword'} formError{/if}" id="loginUsernameDiv">
+ <div class="formFieldLabel">
+ <label for="loginUsername">{lang}wcf.acp.packageUpdate.auth.loginUsername{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="loginUsername" name="loginUsername" value="{$loginUsername}" />
+ </div>
+ <div class="formFieldDesc hidden" id="loginUsernameHelpMessage">
+ <p>{lang}wcf.acp.packageUpdate.auth.loginUsername.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('loginUsername');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'loginPassword'} formError{/if}" id="loginPasswordDiv">
+ <div class="formFieldLabel">
+ <label for="loginPassword">{lang}wcf.acp.packageUpdate.auth.loginPassword{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="password" class="inputText" id="loginPassword" name="loginPassword" value="{$loginPassword}" />
+ {if $errorField == 'loginPassword'}
+ <p class="innerError">
+ {if $errorType == 'invalid'}{lang}wcf.acp.packageUpdate.auth.error{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="loginPasswordHelpMessage">
+ <p>{lang}wcf.acp.packageUpdate.auth.loginPassword.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('loginPassword');
+ //]]></script>
+
+ <div class="formElement" id="saveAuthDataDiv">
+ <div class="formField">
+ <label><input type="checkbox" id="saveAuthData" name="saveAuthData" value="1" {if $saveAuthData == 1}checked="checked" {/if}/> {lang}wcf.acp.packageUpdate.auth.save{/lang}</label>
+ </div>
+ <div class="formFieldDesc hidden" id="saveAuthDataHelpMessage">
+ <p>{lang}wcf.acp.packageUpdate.auth.save.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('saveAuthData');
+ //]]></script>
+ </fieldset>
+
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+
+ <input type="hidden" name="form" value="PackageUpdateAuth" />
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="packageUpdateServerID" value="{@$packageUpdateServerID}" />
+
+ {@$postParameters}
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageL.png" alt="" />\r
- <hgroup>\r
- <h1>{$package->getName()}</h1>\r
- <h2>{$package->packageDescription}</h2>\r
- </hgroup>\r
-</header>\r
-\r
-<fieldset>\r
- <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>\r
- <p class="formField">{$package->package}</p>\r
- </div>\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.version{/lang}</p>\r
- <p class="formField">{$package->packageVersion}</p>\r
- </div>\r
- {if $package->instanceNo > 1}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>\r
- <p class="formField">{#$package->instanceNo}</p>\r
- </div>\r
- {elseif $package->package == 'com.woltlab.wcf' && WCF_N != 1}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>\r
- <p class="formField">{#WCF_N}</p>\r
- </div>\r
- {/if}\r
- {if $package->packageDir != ''}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>\r
- <p class="formField"><a href="{@RELATIVE_WCF_DIR}{$package->packageDir}">{$package->packageDir}</a></p>\r
- </div>\r
- {elseif $package->package == 'com.woltlab.wcf'}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>\r
- <p class="formField">{WCF_DIR}</p>\r
- </div>\r
- {/if}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>\r
- <p class="formField">{@$package->packageDate|date}</p>\r
- </div>\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.installDate{/lang}</p>\r
- <p class="formField">{@$package->installDate|time}</p>\r
- </div>\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.updateDate{/lang}</p>\r
- <p class="formField">{@$package->updateDate|time}</p>\r
- </div>\r
- {if $package->packageURL != ''}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>\r
- <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->packageURL|rawurlencode}" class="externalURL">{$package->packageURL}</a></p>\r
- </div>\r
- {/if}\r
- {if $package->parentPackageID}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.parent{/lang}</p>\r
- <p class="formField"><a href="index.php?page=PackageView&activePackageID={@$package->parentPackageID}{@SID_ARG_2ND}">{$package->parentPackage()->getName()}</a></p>\r
- </div>\r
- {/if}\r
- <div class="formElement">\r
- <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>\r
- <p class="formField">{if $package->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->authorURL|rawurlencode}" class="externalURL">{$package->author}</a>{else}{$package->author}{/if}</p>\r
- </div>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
-</fieldset>\r
-\r
-{assign var=noDependentIsActive value=true}\r
-{foreach from=$dependentPackages item=dependentPackage}\r
- {if $dependentPackage.package != 'com.woltlab.wcf' && $dependentPackage.packageID == PACKAGE_ID}\r
- {assign var=noDependentIsActive value=false}\r
- {* TODO: maybe show user that this package can't be uninstalled because a dependent package is the active standalone application *}\r
- {/if}\r
-{/foreach}\r
-\r
-<div class="contentHeader">\r
- <nav class="largeButtons">\r
- <ul>\r
- {if PACKAGE_ID != $package->packageID}\r
- {if $package->standalone && $package->package != 'com.woltlab.wcf'}<li><a href="{@RELATIVE_WCF_DIR}{$package->packageDir}acp/index.php?packageID={@$package->packageID}{@SID_ARG_2ND}" title="{lang}wcf.acp.package.view.button.makeActive{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageMakeActiveM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.makeActive{/lang}</span></a></li>{/if}\r
- {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $noDependentIsActive}<li><a href="index.php?page=Package&action=startUninstall&activePackageID={@$package->packageID}{@SID_ARG_2ND}" onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" title="{lang}wcf.acp.package.view.button.uninstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageUninstallM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.uninstall{/lang}</span></a></li>{/if}\r
- {/if}\r
- {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}<li><a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package->packageID}{@SID_ARG_2ND}" title="{lang}wcf.acp.package.view.button.update{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.update{/lang}</span></a></li>{/if}\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </nav>\r
-</div>\r
-\r
-{if $requiredPackages|count > 0}\r
- <div class="border titleBarPanel">\r
- <div class="containerHead">\r
- <div class="containerIcon"><a onclick="openList('requiredPackages')"><img id="requiredPackagesImage" src="{@RELATIVE_WCF_DIR}icon/minusS.png" alt="" /></a></div>\r
- <div class="containerContent">\r
- <h3><a onclick="openList('requiredPackages')">{lang}wcf.acp.package.view.requiredPackages{/lang}</a></h3>\r
- <p class="smallFont light">{lang}wcf.acp.package.view.requiredPackages.description{/lang}</p>\r
- </div>\r
- </div>\r
- </div>\r
- <div class="border borderMarginRemove" id="requiredPackages">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>\r
- <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>\r
- \r
- {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {foreach from=$requiredPackages item=$package}\r
- <tr class="{cycle values="container-1,container-2"}">\r
- <td class="columnIcon">\r
- {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}\r
- <a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />\r
- {/if}\r
- {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}\r
- <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&action=startUninstall&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />\r
- {/if}\r
- \r
- {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}\r
- </td>\r
- <td class="columnID">{@$package.packageID}</td>\r
- <td class="columnIcon">\r
- {if $package.standalone}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />\r
- {elseif $package.parentPackageID}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />\r
- {/if}\r
- </td>\r
- <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>\r
- <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>\r
- <td class="columnText">{$package.packageVersion}</td>\r
- <td class="columnDate">{@$package.packageDate|date}</td>\r
- \r
- {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}\r
- </tr>\r
- {/foreach}\r
- </tbody>\r
- </table>\r
- </div>\r
- \r
- <script type="text/javascript">\r
- //<![CDATA[\r
- initList('requiredPackages', 0);\r
- //]]>\r
- </script>\r
-{/if}\r
-\r
-{if $dependentPackages|count > 0}\r
- <div class="border titleBarPanel">\r
- <div class="containerHead">\r
- <div class="containerIcon"><a onclick="openList('dependentPackages')"><img id="dependentPackagesImage" src="{@RELATIVE_WCF_DIR}icon/minusS.png" alt="" /></a></div>\r
- <div class="containerContent">\r
- <h3><a onclick="openList('dependentPackages')">{lang}wcf.acp.package.view.dependentPackages{/lang}</a></h3>\r
- <p class="smallFont light">{lang}wcf.acp.package.view.dependentPackages.description{/lang}</p>\r
- </div>\r
- </div>\r
- </div>\r
- <div class="border borderMarginRemove" id="dependentPackages">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>\r
- <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>\r
- <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>\r
- \r
- {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {foreach from=$dependentPackages item=$package}\r
- <tr class="{cycle values="container-1,container-2"}">\r
- <td class="columnIcon">\r
- {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}\r
- <a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />\r
- {/if}\r
- {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}\r
- <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&action=startUninstall&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />\r
- {/if}\r
- \r
- {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}\r
- </td>\r
- <td class="columnID">{@$package.packageID}</td>\r
- <td class="columnIcon">\r
- {if $package.standalone}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />\r
- {elseif $package.parentPackageID}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />\r
- {/if}\r
- </td>\r
- <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>\r
- <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>\r
- <td class="columnText">{$package.packageVersion}</td>\r
- <td class="columnDate">{@$package.packageDate|date}</td>\r
- \r
- {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}\r
- </tr>\r
- {/foreach}\r
- </tbody>\r
- </table>\r
- </div>\r
- \r
- <script type="text/javascript">\r
- //<![CDATA[\r
- initList('dependentPackages', 0);\r
- //]]>\r
- </script>\r
-{/if}\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/packageL.png" alt="" />
+ <hgroup>
+ <h1>{$package->getName()}</h1>
+ <h2>{$package->packageDescription}</h2>
+ </hgroup>
+</header>
+
+<fieldset>
+ <legend>{lang}wcf.acp.package.view.properties{/lang}</legend>
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.identifier{/lang}</p>
+ <p class="formField">{$package->package}</p>
+ </div>
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.version{/lang}</p>
+ <p class="formField">{$package->packageVersion}</p>
+ </div>
+ {if $package->instanceNo > 1}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>
+ <p class="formField">{#$package->instanceNo}</p>
+ </div>
+ {elseif $package->package == 'com.woltlab.wcf' && WCF_N != 1}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.instanceNo{/lang}</p>
+ <p class="formField">{#WCF_N}</p>
+ </div>
+ {/if}
+ {if $package->packageDir != ''}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>
+ <p class="formField"><a href="{@RELATIVE_WCF_DIR}{$package->packageDir}">{$package->packageDir}</a></p>
+ </div>
+ {elseif $package->package == 'com.woltlab.wcf'}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.dir{/lang}</p>
+ <p class="formField">{WCF_DIR}</p>
+ </div>
+ {/if}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.date{/lang}</p>
+ <p class="formField">{@$package->packageDate|date}</p>
+ </div>
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.installDate{/lang}</p>
+ <p class="formField">{@$package->installDate|time}</p>
+ </div>
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.updateDate{/lang}</p>
+ <p class="formField">{@$package->updateDate|time}</p>
+ </div>
+ {if $package->packageURL != ''}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.url{/lang}</p>
+ <p class="formField"><a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->packageURL|rawurlencode}" class="externalURL">{$package->packageURL}</a></p>
+ </div>
+ {/if}
+ {if $package->parentPackageID}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.parent{/lang}</p>
+ <p class="formField"><a href="index.php?page=PackageView&activePackageID={@$package->parentPackageID}{@SID_ARG_2ND}">{$package->parentPackage()->getName()}</a></p>
+ </div>
+ {/if}
+ <div class="formElement">
+ <p class="formFieldLabel">{lang}wcf.acp.package.view.author{/lang}</p>
+ <p class="formField">{if $package->authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package->authorURL|rawurlencode}" class="externalURL">{$package->author}</a>{else}{$package->author}{/if}</p>
+ </div>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+</fieldset>
+
+{assign var=noDependentIsActive value=true}
+{foreach from=$dependentPackages item=dependentPackage}
+ {if $dependentPackage.package != 'com.woltlab.wcf' && $dependentPackage.packageID == PACKAGE_ID}
+ {assign var=noDependentIsActive value=false}
+ {* TODO: maybe show user that this package can't be uninstalled because a dependent package is the active standalone application *}
+ {/if}
+{/foreach}
+
+<div class="contentHeader">
+ <nav class="largeButtons">
+ <ul>
+ {if PACKAGE_ID != $package->packageID}
+ {if $package->standalone && $package->package != 'com.woltlab.wcf'}<li><a href="{@RELATIVE_WCF_DIR}{$package->packageDir}acp/index.php?packageID={@$package->packageID}{@SID_ARG_2ND}" title="{lang}wcf.acp.package.view.button.makeActive{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageMakeActiveM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.makeActive{/lang}</span></a></li>{/if}
+ {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $noDependentIsActive}<li><a href="index.php?page=Package&action=startUninstall&activePackageID={@$package->packageID}{@SID_ARG_2ND}" onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" title="{lang}wcf.acp.package.view.button.uninstall{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageUninstallM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.uninstall{/lang}</span></a></li>{/if}
+ {/if}
+ {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}<li><a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package->packageID}{@SID_ARG_2ND}" title="{lang}wcf.acp.package.view.button.update{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateM.png" alt="" /> <span>{lang}wcf.acp.package.view.button.update{/lang}</span></a></li>{/if}
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </nav>
+</div>
+
+{if $requiredPackages|count > 0}
+ <div class="border titleBarPanel">
+ <div class="containerHead">
+ <div class="containerIcon"><a onclick="openList('requiredPackages')"><img id="requiredPackagesImage" src="{@RELATIVE_WCF_DIR}icon/minusS.png" alt="" /></a></div>
+ <div class="containerContent">
+ <h3><a onclick="openList('requiredPackages')">{lang}wcf.acp.package.view.requiredPackages{/lang}</a></h3>
+ <p class="smallFont light">{lang}wcf.acp.package.view.requiredPackages.description{/lang}</p>
+ </div>
+ </div>
+ </div>
+ <div class="border borderMarginRemove" id="requiredPackages">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>
+ <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>
+
+ {if $additionalColumns|isset}{@$additionalColumns}{/if}
+ </tr>
+ </thead>
+ <tbody>
+ {foreach from=$requiredPackages item=$package}
+ <tr class="{cycle values="container-1,container-2"}">
+ <td class="columnIcon">
+ {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}
+ <a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />
+ {/if}
+ {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}
+ <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&action=startUninstall&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />
+ {/if}
+
+ {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}
+ </td>
+ <td class="columnID">{@$package.packageID}</td>
+ <td class="columnIcon">
+ {if $package.standalone}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />
+ {elseif $package.parentPackageID}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />
+ {/if}
+ </td>
+ <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>
+ <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>
+ <td class="columnText">{$package.packageVersion}</td>
+ <td class="columnDate">{@$package.packageDate|date}</td>
+
+ {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+ </div>
+
+ <script type="text/javascript">
+ //<![CDATA[
+ initList('requiredPackages', 0);
+ //]]>
+ </script>
+{/if}
+
+{if $dependentPackages|count > 0}
+ <div class="border titleBarPanel">
+ <div class="containerHead">
+ <div class="containerIcon"><a onclick="openList('dependentPackages')"><img id="dependentPackagesImage" src="{@RELATIVE_WCF_DIR}icon/minusS.png" alt="" /></a></div>
+ <div class="containerContent">
+ <h3><a onclick="openList('dependentPackages')">{lang}wcf.acp.package.view.dependentPackages{/lang}</a></h3>
+ <p class="smallFont light">{lang}wcf.acp.package.view.dependentPackages.description{/lang}</p>
+ </div>
+ </div>
+ </div>
+ <div class="border borderMarginRemove" id="dependentPackages">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.id{/lang}</span></div></th>
+ <th colspan="2"><div><span class="emptyHead">{lang}wcf.acp.package.list.name{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.author{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.version{/lang}</span></div></th>
+ <th><div><span class="emptyHead">{lang}wcf.acp.package.list.date{/lang}</span></div></th>
+
+ {if $additionalColumns|isset}{@$additionalColumns}{/if}
+ </tr>
+ </thead>
+ <tbody>
+ {foreach from=$dependentPackages item=$package}
+ <tr class="{cycle values="container-1,container-2"}">
+ <td class="columnIcon">
+ {if $__wcf->session->getPermission('admin.system.package.canUpdatePackage')}
+ <a href="index.php?form=PackageStartInstall&action=update&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/packageUpdateS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageUpdateDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.update{/lang}" />
+ {/if}
+ {if $__wcf->session->getPermission('admin.system.package.canUninstallPackage') && $package.package != 'com.woltlab.wcf' && $package.packageID != PACKAGE_ID}
+ <a onclick="return confirm('{lang}wcf.acp.package.view.button.uninstall.sure{/lang}')" href="index.php?page=Package&action=startUninstall&activePackageID={@$package.packageID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.package.view.button.uninstall{/lang}" />
+ {/if}
+
+ {if $package.additionalButtons|isset}{@$package.additionalButtons}{/if}
+ </td>
+ <td class="columnID">{@$package.packageID}</td>
+ <td class="columnIcon">
+ {if $package.standalone}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageTypeStandaloneS.png" alt="" title="{lang}wcf.acp.package.list.standalone{/lang}" />
+ {elseif $package.parentPackageID}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageTypePluginS.png" alt="" title="{lang}wcf.acp.package.list.plugin{/lang}" />
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/packageS.png" alt="" title="{lang}wcf.acp.package.list.other{/lang}" />
+ {/if}
+ </td>
+ <td class="columnText" title="{$package.packageDescription}"><a href="index.php?page=PackageView&activePackageID={@$package.packageID}{@SID_ARG_2ND}">{$package.packageName}{if $package.instanceNo > 1 && $package.instanceName == ''} (#{#$package.instanceNo}){/if}</a></td>
+ <td class="columnText">{if $package.authorURL}<a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={$package.authorURL|rawurlencode}" class="externalURL">{$package.author}</a>{else}{$package.author}{/if}</td>
+ <td class="columnText">{$package.packageVersion}</td>
+ <td class="columnDate">{@$package.packageDate|date}</td>
+
+ {if $package.additionalColumns|isset}{@$package.additionalColumns}{/if}
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+ </div>
+
+ <script type="text/javascript">
+ //<![CDATA[
+ initList('dependentPackages', 0);
+ //]]>
+ </script>
+{/if}
+
+{include file='footer'}
-{if $__wcf->session->getPermission('admin.general.canUseAcp')}{include file='header' templateName='permissionDenied'}\r
-\r
-<p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>\r
-\r
-{include file='footer'}\r
-{else}{capture assign='pageTitle'}{lang}wcf.global.error.permissionDenied.title{/lang}{/capture}\r
-{include file='setupHeader'}\r
-\r
-<img class="icon" src="{@RELATIVE_WCF_DIR}icon/loginXL.png" alt="" />\r
-\r
-<h1><b>{@$pageTitle}</b></h1>\r
-\r
-<hr />\r
-\r
-<p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>\r
-\r
-{include file='setupFooter'}\r
-{/if}\r
+{if $__wcf->session->getPermission('admin.general.canUseAcp')}{include file='header' templateName='permissionDenied'}
+
+<p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>
+
+{include file='footer'}
+{else}{capture assign='pageTitle'}{lang}wcf.global.error.permissionDenied.title{/lang}{/capture}
+{include file='setupHeader'}
+
+<img class="icon" src="{@RELATIVE_WCF_DIR}icon/loginXL.png" alt="" />
+
+<h1><b>{@$pageTitle}</b></h1>
+
+<hr />
+
+<p class="error">{lang}wcf.global.error.permissionDenied{/lang}</p>
+
+{include file='setupFooter'}
+{/if}
-</div>\r
-</body>\r
+</div>
+</body>
</html>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" dir="{@$__wcf->getLanguage()->getPageDirection()}" xml:lang="{@$__wcf->getLanguage()->getFixedLanguageCode()}">\r
- <head>\r
- <title>{@$pageTitle} - {lang}wcf.global.pageTitle{/lang}</title>\r
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
- <script type="text/javascript">\r
- //<![CDATA[\r
- var SID_ARG_2ND = '{@SID_ARG_2ND_NOT_ENCODED}';\r
- var RELATIVE_WCF_DIR = '{@RELATIVE_WCF_DIR}';\r
- //]]>\r
- </script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/x.js"></script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/protoaculous.1.8.2.min.js"></script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/default.js"></script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/default.js"></script>\r
- <style type="text/css">\r
- @import url("{@RELATIVE_WCF_DIR}acp/style/extra/setupStyle{if $__wcf->getLanguage()->getPageDirection() == 'rtl'}-rtl{/if}.css");\r
- </style>\r
- \r
- <!--[if lt IE 7]>\r
- <style type="text/css">\r
- .page {\r
- width: 800px;\r
- }\r
- .progressText {\r
- margin-top: -16px;\r
- }\r
- </style>\r
- <![endif]-->\r
- <!--[if IE]>\r
- <style type="text/css">\r
- hr {\r
- margin: 0;\r
- }\r
- fieldset p, fieldset div {\r
- min-height: 0;\r
- }\r
- </style>\r
- <![endif]-->\r
- </head>\r
-<body>\r
-<div class="page">\r
-\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" dir="{@$__wcf->getLanguage()->getPageDirection()}" xml:lang="{@$__wcf->getLanguage()->getFixedLanguageCode()}">
+ <head>
+ <title>{@$pageTitle} - {lang}wcf.global.pageTitle{/lang}</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <script type="text/javascript">
+ //<![CDATA[
+ var SID_ARG_2ND = '{@SID_ARG_2ND_NOT_ENCODED}';
+ var RELATIVE_WCF_DIR = '{@RELATIVE_WCF_DIR}';
+ //]]>
+ </script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/x.js"></script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/3rdParty/protoaculous.1.8.2.min.js"></script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/default.js"></script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/default.js"></script>
+ <style type="text/css">
+ @import url("{@RELATIVE_WCF_DIR}acp/style/extra/setupStyle{if $__wcf->getLanguage()->getPageDirection() == 'rtl'}-rtl{/if}.css");
+ </style>
+
+ <!--[if lt IE 7]>
+ <style type="text/css">
+ .page {
+ width: 800px;
+ }
+ .progressText {
+ margin-top: -16px;
+ }
+ </style>
+ <![endif]-->
+ <!--[if IE]>
+ <style type="text/css">
+ hr {
+ margin: 0;
+ }
+ fieldset p, fieldset div {
+ min-height: 0;
+ }
+ </style>
+ <![endif]-->
+ </head>
+<body>
+<div class="page">
+
-</div>\r
-</body>\r
+</div>
+</body>
</html>
\ No newline at end of file
-{include file='header'}\r
-\r
-<p class="success">{lang}{@$message}{/lang}</p> \r
-\r
+{include file='header'}
+
+<p class="success">{lang}{@$message}{/lang}</p>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/updateServer{@$action|ucfirst}L.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.updateServer.{$action}{/lang}</h1>\r
- </hgroup>\r
-</header>\r
-\r
-{if $errorField}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $success|isset}\r
- <p class="success">{lang}wcf.acp.updateServer.{$action}.success{/lang}</p> \r
-{/if}\r
-\r
-{if $packageUpdateServer|isset && $packageUpdateServer->errorMessage}\r
- <p class="warning">{lang}wcf.acp.updateServer.lastErrorMessage{/lang}<br />{$packageUpdateServer->errorMessage}</p> \r
-{/if}\r
-\r
-<div class="contentHeader">\r
- <nav class="largeButtons">\r
- <ul><li><a href="index.php?page=UpdateServerList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.package.server.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerM.png" alt="" /> <span>{lang}wcf.acp.menu.link.package.server.view{/lang}</span></a></li></ul>\r
- </nav>\r
-</div>\r
-<form method="post" action="index.php?form=UpdateServer{@$action|ucfirst}{if $packageUpdateServerID|isset}&packageUpdateServerID={@$packageUpdateServerID}{/if}">\r
- <div class="border content">\r
- <div class="container-1">\r
- \r
- <fieldset>\r
- <legend>{lang}wcf.acp.updateServer.data{/lang}</legend>\r
- \r
- <div class="formElement{if $errorField == 'server'} formError{/if}" id="serverDiv">\r
- <div class="formFieldLabel">\r
- <label for="server">{lang}wcf.acp.updateServer.server{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" name="server" value="{$server}" id="server" />\r
- {if $errorField == 'server'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType == 'notValid'}{lang}wcf.acp.updateServer.server.error.notValid{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="serverHelpMessage">\r
- <p>{lang}wcf.acp.updateServer.server.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('server');\r
- //]]></script>\r
- \r
- <div class="formElement" id="loginUsernameDiv">\r
- <div class="formFieldLabel">\r
- <label for="loginUsername">{lang}wcf.acp.updateServer.loginUsername{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" name="loginUsername" value="{$loginUsername}" id="loginUsername" />\r
- </div>\r
- <div class="formFieldDesc hidden" id="loginUsernameHelpMessage">\r
- <p>{lang}wcf.acp.updateServer.loginUsername.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('loginUsername');\r
- //]]></script>\r
- \r
- <div class="formElement" id="loginPasswordDiv">\r
- <div class="formFieldLabel">\r
- <label for="loginPassword">{lang}wcf.acp.updateServer.loginPassword{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="password" class="inputText" name="loginPassword" value="{$loginPassword}" id="loginPassword" />\r
- </div>\r
- <div class="formFieldDesc hidden" id="loginPasswordHelpMessage">\r
- <p>{lang}wcf.acp.updateServer.loginPassword.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('loginPassword');\r
- //]]></script>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </fieldset>\r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- {@SID_INPUT_TAG}\r
- </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/updateServer{@$action|ucfirst}L.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.updateServer.{$action}{/lang}</h1>
+ </hgroup>
+</header>
+
+{if $errorField}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $success|isset}
+ <p class="success">{lang}wcf.acp.updateServer.{$action}.success{/lang}</p>
+{/if}
+
+{if $packageUpdateServer|isset && $packageUpdateServer->errorMessage}
+ <p class="warning">{lang}wcf.acp.updateServer.lastErrorMessage{/lang}<br />{$packageUpdateServer->errorMessage}</p>
+{/if}
+
+<div class="contentHeader">
+ <nav class="largeButtons">
+ <ul><li><a href="index.php?page=UpdateServerList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.package.server.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerM.png" alt="" /> <span>{lang}wcf.acp.menu.link.package.server.view{/lang}</span></a></li></ul>
+ </nav>
+</div>
+<form method="post" action="index.php?form=UpdateServer{@$action|ucfirst}{if $packageUpdateServerID|isset}&packageUpdateServerID={@$packageUpdateServerID}{/if}">
+ <div class="border content">
+ <div class="container-1">
+
+ <fieldset>
+ <legend>{lang}wcf.acp.updateServer.data{/lang}</legend>
+
+ <div class="formElement{if $errorField == 'server'} formError{/if}" id="serverDiv">
+ <div class="formFieldLabel">
+ <label for="server">{lang}wcf.acp.updateServer.server{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" name="server" value="{$server}" id="server" />
+ {if $errorField == 'server'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType == 'notValid'}{lang}wcf.acp.updateServer.server.error.notValid{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="serverHelpMessage">
+ <p>{lang}wcf.acp.updateServer.server.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('server');
+ //]]></script>
+
+ <div class="formElement" id="loginUsernameDiv">
+ <div class="formFieldLabel">
+ <label for="loginUsername">{lang}wcf.acp.updateServer.loginUsername{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" name="loginUsername" value="{$loginUsername}" id="loginUsername" />
+ </div>
+ <div class="formFieldDesc hidden" id="loginUsernameHelpMessage">
+ <p>{lang}wcf.acp.updateServer.loginUsername.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('loginUsername');
+ //]]></script>
+
+ <div class="formElement" id="loginPasswordDiv">
+ <div class="formFieldLabel">
+ <label for="loginPassword">{lang}wcf.acp.updateServer.loginPassword{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="password" class="inputText" name="loginPassword" value="{$loginPassword}" id="loginPassword" />
+ </div>
+ <div class="formFieldDesc hidden" id="loginPasswordHelpMessage">
+ <p>{lang}wcf.acp.updateServer.loginPassword.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('loginPassword');
+ //]]></script>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </fieldset>
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ {@SID_INPUT_TAG}
+ </div>
+</form>
+
+{include file='footer'}
-{include file='header'}\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- $(function() {\r
- new WCF.Action.Delete('wcf\\data\\package\\update\\server\\PackageUpdateServerAction', $('.updateServerRow'));\r
- new WCF.Action.Toggle('wcf\\data\\package\\update\\server\\PackageUpdateServerAction', $('.updateServerRow'));\r
- });\r
- //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/updateServerL.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.updateServer.view{/lang}</h1>\r
- </hgroup>\r
-</header>\r
-\r
-{if $deletedPackageUpdateServerID}\r
- <p class="success">{lang}wcf.acp.updateServer.delete.success{/lang}</p>\r
-{/if}\r
-\r
-<div class="contentHeader">\r
- <nav class="largeButtons">\r
- <ul><li><a href="index.php?form=UpdateServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.updateServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerAddM.png" alt="" /> <span>{lang}wcf.acp.updateServer.add{/lang}</span></a></li></ul>\r
- </nav>\r
-</div>\r
-\r
-{if !$updateServers|count}\r
- <div class="border content">\r
- <div class="container-1">\r
- <p>{lang}wcf.acp.updateServer.view.noneAvailable{/lang}</p>\r
- </div>\r
- </div>\r
-{else}\r
- <div class="border titleBarPanel">\r
- <div class="containerHead"><h3>{lang}wcf.acp.updateServer.list.available{/lang}</h3></div>\r
- </div>\r
- <div class="border borderMarginRemove">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th class="columnPackageUpdateServerID{if $sortField == 'packageUpdateServerID'} active{/if}" colspan="2"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=packageUpdateServerID&sortOrder={if $sortField == 'packageUpdateServerID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.packageUpdateServerID{/lang}{if $sortField == 'packageUpdateServerID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnServer{if $sortField == 'server'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=server&sortOrder={if $sortField == 'server' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.server{/lang}{if $sortField == 'server'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnPackages{if $sortField == 'packages'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=packages&sortOrder={if $sortField == 'packages' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.packages{/lang}{if $sortField == 'packages'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnStatus{if $sortField == 'status'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=status&sortOrder={if $sortField == 'status' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.status{/lang}{if $sortField == 'status'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnErrorText{if $sortField == 'errorMessage'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=errorMessage&sortOrder={if $sortField == 'errorMessage' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.errorMessage{/lang}{if $sortField == 'errorMessage'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnTimestamp{if $sortField == 'lastUpdateTime'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=lastUpdateTime&sortOrder={if $sortField == 'lastUpdateTime' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.lastUpdateTime{/lang}{if $sortField == 'lastUpdateTime'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- \r
- {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {foreach from=$updateServers item=updateServer}\r
- <tr class="updateServerRow {cycle values="container-1,container-2"}">\r
- <td class="columnIcon">\r
- <img src="{@RELATIVE_WCF_DIR}icon/{if !$updateServer->disabled}enabled{else}disabled{/if}S.png" alt="" class="toggleButton" title="{lang}wcf.acp.updateServer.{if !$updateServer->disabled}disable{else}enable{/if}{/lang}" data-objectID="{@$updateServer->packageUpdateServerID}" data-disableMessage="{lang}wcf.acp.updateServer.disable{/lang}" data-enableMessage="{lang}wcf.acp.updateServer.enable{/lang}" />\r
- <a href="index.php?form=UpdateServerEdit&packageUpdateServerID={@$updateServer->packageUpdateServerID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.updateServer.edit{/lang}" /></a>\r
- <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.updateServer.delete{/lang}" class="deleteButton" data-objectID="{@$updateServer->packageUpdateServerID}" data-confirmMessage="{lang}wcf.acp.updateServer.delete.sure{/lang}" />\r
- \r
- {if $additionalButtons[$updateServer->packageUpdateServerID]|isset}{@$additionalButtons[$updateServer->packageUpdateServerID]}{/if}\r
- </td>\r
- <td class="columnID">{@$updateServer->packageUpdateServerID}</td>\r
- <td class="columnText">\r
- <a href="index.php?form=UpdateServerEdit&packageUpdateServerID={@$updateServer->packageUpdateServerID}{@SID_ARG_2ND}">\r
- {@$updateServer->serverURL}\r
- </a>\r
- </td>\r
- <td class="columnText smallFont">\r
- {#$updateServer->packages}\r
- </td>\r
- <td class="columnText smallFont" style="color: {if $updateServer->status == 'online'}green{else}red{/if}">\r
- {@$updateServer->status}\r
- </td>\r
- <td class="columnText smallFont">\r
- <div title="{@$updateServer->errorMessage}">\r
- {@$updateServer->errorMessage|truncate:"30"}\r
- </div>\r
- </td>\r
- <td class="columnDate smallFont">\r
- {if $updateServer->lastUpdateTime}{@$updateServer->lastUpdateTime|time}{/if}\r
- </td>\r
- \r
- {if $additionalColumns[$updateServer->packageUpdateServerID]|isset}{@$additionalColumns[$updateServer->packageUpdateServerID]}{/if}\r
- </tr>\r
- {/foreach}\r
- </tbody>\r
- </table>\r
- </div>\r
- <div class="contentHeader">\r
- <nav class="largeButtons">\r
- <ul><li><a href="index.php?form=UpdateServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.updateServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerAddM.png" alt="" /> <span>{lang}wcf.acp.updateServer.add{/lang}</span></a></li></ul>\r
- </nav>\r
- </div>\r
-{/if}\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<script type="text/javascript">
+ //<![CDATA[
+ $(function() {
+ new WCF.Action.Delete('wcf\\data\\package\\update\\server\\PackageUpdateServerAction', $('.updateServerRow'));
+ new WCF.Action.Toggle('wcf\\data\\package\\update\\server\\PackageUpdateServerAction', $('.updateServerRow'));
+ });
+ //]]>
+</script>
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/updateServerL.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.updateServer.view{/lang}</h1>
+ </hgroup>
+</header>
+
+{if $deletedPackageUpdateServerID}
+ <p class="success">{lang}wcf.acp.updateServer.delete.success{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+ <nav class="largeButtons">
+ <ul><li><a href="index.php?form=UpdateServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.updateServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerAddM.png" alt="" /> <span>{lang}wcf.acp.updateServer.add{/lang}</span></a></li></ul>
+ </nav>
+</div>
+
+{if !$updateServers|count}
+ <div class="border content">
+ <div class="container-1">
+ <p>{lang}wcf.acp.updateServer.view.noneAvailable{/lang}</p>
+ </div>
+ </div>
+{else}
+ <div class="border titleBarPanel">
+ <div class="containerHead"><h3>{lang}wcf.acp.updateServer.list.available{/lang}</h3></div>
+ </div>
+ <div class="border borderMarginRemove">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th class="columnPackageUpdateServerID{if $sortField == 'packageUpdateServerID'} active{/if}" colspan="2"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=packageUpdateServerID&sortOrder={if $sortField == 'packageUpdateServerID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.packageUpdateServerID{/lang}{if $sortField == 'packageUpdateServerID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnServer{if $sortField == 'server'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=server&sortOrder={if $sortField == 'server' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.server{/lang}{if $sortField == 'server'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnPackages{if $sortField == 'packages'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=packages&sortOrder={if $sortField == 'packages' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.packages{/lang}{if $sortField == 'packages'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnStatus{if $sortField == 'status'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=status&sortOrder={if $sortField == 'status' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.status{/lang}{if $sortField == 'status'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnErrorText{if $sortField == 'errorMessage'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=errorMessage&sortOrder={if $sortField == 'errorMessage' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.errorMessage{/lang}{if $sortField == 'errorMessage'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnTimestamp{if $sortField == 'lastUpdateTime'} active{/if}"><div><a href="index.php?page=UpdateServerList&pageNo={@$pageNo}&sortField=lastUpdateTime&sortOrder={if $sortField == 'lastUpdateTime' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.updateServer.lastUpdateTime{/lang}{if $sortField == 'lastUpdateTime'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+
+ {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}
+ </tr>
+ </thead>
+ <tbody>
+ {foreach from=$updateServers item=updateServer}
+ <tr class="updateServerRow {cycle values="container-1,container-2"}">
+ <td class="columnIcon">
+ <img src="{@RELATIVE_WCF_DIR}icon/{if !$updateServer->disabled}enabled{else}disabled{/if}S.png" alt="" class="toggleButton" title="{lang}wcf.acp.updateServer.{if !$updateServer->disabled}disable{else}enable{/if}{/lang}" data-objectID="{@$updateServer->packageUpdateServerID}" data-disableMessage="{lang}wcf.acp.updateServer.disable{/lang}" data-enableMessage="{lang}wcf.acp.updateServer.enable{/lang}" />
+ <a href="index.php?form=UpdateServerEdit&packageUpdateServerID={@$updateServer->packageUpdateServerID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.updateServer.edit{/lang}" /></a>
+ <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.updateServer.delete{/lang}" class="deleteButton" data-objectID="{@$updateServer->packageUpdateServerID}" data-confirmMessage="{lang}wcf.acp.updateServer.delete.sure{/lang}" />
+
+ {if $additionalButtons[$updateServer->packageUpdateServerID]|isset}{@$additionalButtons[$updateServer->packageUpdateServerID]}{/if}
+ </td>
+ <td class="columnID">{@$updateServer->packageUpdateServerID}</td>
+ <td class="columnText">
+ <a href="index.php?form=UpdateServerEdit&packageUpdateServerID={@$updateServer->packageUpdateServerID}{@SID_ARG_2ND}">
+ {@$updateServer->serverURL}
+ </a>
+ </td>
+ <td class="columnText smallFont">
+ {#$updateServer->packages}
+ </td>
+ <td class="columnText smallFont" style="color: {if $updateServer->status == 'online'}green{else}red{/if}">
+ {@$updateServer->status}
+ </td>
+ <td class="columnText smallFont">
+ <div title="{@$updateServer->errorMessage}">
+ {@$updateServer->errorMessage|truncate:"30"}
+ </div>
+ </td>
+ <td class="columnDate smallFont">
+ {if $updateServer->lastUpdateTime}{@$updateServer->lastUpdateTime|time}{/if}
+ </td>
+
+ {if $additionalColumns[$updateServer->packageUpdateServerID]|isset}{@$additionalColumns[$updateServer->packageUpdateServerID]}{/if}
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+ </div>
+ <div class="contentHeader">
+ <nav class="largeButtons">
+ <ul><li><a href="index.php?form=UpdateServerAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.updateServer.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/updateServerAddM.png" alt="" /> <span>{lang}wcf.acp.updateServer.add{/lang}</span></a></li></ul>
+ </nav>
+ </div>
+{/if}
+
+{include file='footer'}
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>\r
-{if $userID|isset}\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/InlineListEdit.class.js"></script>\r
- <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/UserListEdit.class.js"></script>\r
-{/if}\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- var tabMenu = new TabMenu();\r
- {if $optionTree|count}onloadEvents.push(function() { tabMenu.showSubTabMenu('{@$options[0][object]->categoryName}') });{/if}\r
- \r
- {if $userID|isset}\r
- var userData = new Hash();\r
- userData.set({@$userID}, {\r
- 'isMarked': {@$user->isMarked()}\r
- });\r
- \r
- var url = '{@$url|encodeJS}';\r
- \r
- // language\r
- var language = new Object();\r
- language['wcf.global.button.mark'] = '{lang}wcf.global.button.mark{/lang}';\r
- language['wcf.global.button.unmark'] = '{lang}wcf.global.button.unmark{/lang}';\r
- language['wcf.global.button.delete'] = '{lang}wcf.global.button.delete{/lang}';\r
- language['wcf.acp.user.button.sendMail'] = '{lang}wcf.acp.user.button.sendMail{/lang}';\r
- language['wcf.acp.user.button.exportMail'] = '{lang}wcf.acp.user.button.exportMail{/lang}';\r
- language['wcf.acp.user.button.assignGroup'] = '{lang}wcf.acp.user.button.assignGroup{/lang}';\r
- language['wcf.acp.user.deleteMarked.sure'] = '{lang}wcf.acp.user.deleteMarked.sure{/lang}';\r
- language['wcf.acp.user.delete.sure'] = '{lang}wcf.acp.user.delete.sure{/lang}';\r
- language['wcf.acp.user.markedUsers'] = '{lang}wcf.acp.user.markedUsers{/lang}';\r
- \r
- // additional options\r
- var additionalOptions = new Array();\r
- var additionalUserOptions = new Array();\r
- {if $additionalUserOptions|isset}{@$additionalUserOptions}{/if}\r
- {if $additionalMarkedOptions|isset}{@$additionalMarkedOptions}{/if}\r
- \r
- // permissions\r
- var permissions = new Object();\r
- permissions['canEditUser'] = {if $__wcf->session->getPermission('admin.user.canEditUser')}1{else}0{/if};\r
- permissions['canDeleteUser'] = {if $__wcf->session->getPermission('admin.user.canDeleteUser')}1{else}0{/if};\r
- permissions['canMailUser'] = {if $__wcf->session->getPermission('admin.user.canMailUser')}1{else}0{/if};\r
- permissions['canEditMailAddress'] = {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}1{else}0{/if};\r
- permissions['canEditPassword'] = {if $__wcf->session->getPermission('admin.user.canEditPassword')}1{else}0{/if};\r
- \r
- onloadEvents.push(function() { userListEdit = new UserListEdit(userData, {@$markedUsers}, additionalUserOptions, additionalOptions); });\r
- {/if}\r
- //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
- <img {if $userID|isset}id="userEdit{@$userID}" {/if}src="{@RELATIVE_WCF_DIR}icon/user{@$action|ucfirst}L.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.user.{@$action}{/lang}</h1>\r
- </hgroup>\r
-</header>\r
-\r
-{if $errorField}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $success|isset}\r
- <p class="success">{lang}wcf.acp.user.{@$action}.success{/lang}</p> \r
-{/if}\r
-\r
-{if $userID|isset && $__wcf->user->userID == $userID}\r
- <p class="warning">{lang}wcf.acp.user.edit.warning.selfEdit{/lang}</p> \r
-{/if}\r
-\r
-<div class="contentHeader">\r
- <nav class="largeButtons">\r
- <ul>\r
- <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a></li>\r
- <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=User{@$action|ucfirst}">\r
- <div class="border content">\r
- <div class="container-1">\r
- <div class="formElement{if $errorType.username|isset} formError{/if}">\r
- <div class="formFieldLabel">\r
- <label for="username">{lang}wcf.user.username{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="username" name="username" value="{$username}" />\r
- {if $errorType.username|isset}\r
- <p class="innerError">\r
- {if $errorType.username == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType.username == 'notValid'}{lang}wcf.user.error.username.notValid{/lang}{/if}\r
- {if $errorType.username == 'notUnique'}{lang}wcf.user.error.username.notUnique{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- </div>\r
- \r
- {if $availableGroups|count}\r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.acp.user.groups{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
- \r
- <div class="formField">\r
- {htmlCheckboxes options=$availableGroups name=groupIDs selected=$groupIDs}\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- {/if}\r
- \r
- {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditMailAddress')}\r
- <fieldset>\r
- <legend>{lang}wcf.user.email{/lang}</legend>\r
- <div class="formElement{if $errorType.email|isset} formError{/if}">\r
- <div class="formFieldLabel">\r
- <label for="email">{lang}wcf.user.email{/lang}</label>\r
- </div>\r
- <div class="formField"> \r
- <input type="text" class="inputText" id="email" name="email" value="{$email}" />\r
- {if $errorType.email|isset}\r
- <p class="innerError">\r
- {if $errorType.email == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- {if $errorType.email == 'notValid'}{lang}wcf.user.error.email.notValid{/lang}{/if}\r
- {if $errorType.email == 'notUnique'}{lang}wcf.user.error.email.notUnique{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- </div>\r
- \r
- <div class="formElement{if $errorType.confirmEmail|isset} formError{/if}">\r
- <div class="formFieldLabel">\r
- <label for="confirmEmail">{lang}wcf.user.confirmEmail{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="confirmEmail" name="confirmEmail" value="{$confirmEmail}" />\r
- {if $errorType.confirmEmail|isset}\r
- <p class="innerError">\r
- {if $errorType.confirmEmail == 'notEqual'}{lang}wcf.user.error.confirmEmail.notEqual{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- </div>\r
- </fieldset>\r
- {/if}\r
- \r
- {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditPassword')}\r
- <fieldset>\r
- <legend>{lang}wcf.user.password{/lang}</legend>\r
- <div class="formElement{if $errorType.password|isset} formError{/if}">\r
- <div class="formFieldLabel">\r
- <label for="password">{lang}wcf.user.password{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="password" class="inputText" id="password" name="password" value="{$password}" />\r
- {if $errorType.password|isset}\r
- <p class="innerError">\r
- {if $errorType.password == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- </div>\r
- \r
- <div class="formElement{if $errorType.confirmPassword|isset} formError{/if}">\r
- <div class="formFieldLabel">\r
- <label for="confirmPassword">{lang}wcf.user.confirmPassword{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="password" class="inputText" id="confirmPassword" name="confirmPassword" value="{$confirmPassword}" />\r
- {if $errorType.confirmPassword|isset}\r
- <p class="innerError">\r
- {if $errorType.confirmPassword == 'notEqual'}{lang}wcf.user.error.confirmPassword.notEqual{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- </div>\r
- </fieldset>\r
- {/if}\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- \r
- {if $optionTree|count || $additionalTabs|isset}\r
- <nav>\r
- <div class="tabMenu">\r
- <ul>\r
- {foreach from=$optionTree item=categoryLevel1}\r
- <li id="{@$categoryLevel1[object]->categoryName}"><a onclick="tabMenu.showSubTabMenu('{@$categoryLevel1[object]->categoryName}');"><span>{lang}wcf.user.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</span></a></li>\r
- {/foreach}\r
- \r
- {if $additionalTabs|isset}{@$additionalTabs}{/if}\r
- </ul>\r
- </div>\r
- <nav>\r
- <div class="subTabMenu">\r
- <div class="containerHead"><div> </div></div>\r
- </div>\r
- \r
- {foreach from=$optionTree item=categoryLevel1}\r
- <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}-content">\r
- <div class="container-1">\r
- <h3 class="subHeading">{lang}wcf.user.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</h3>\r
- \r
- {foreach from=$categoryLevel1[categories] item=categoryLevel2}\r
- <fieldset>\r
- <legend>{lang}wcf.user.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</legend>\r
- \r
- {if $categoryLevel2[object]->categoryName == 'settings.general' && $availableLanguages|count > 1}\r
- <div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="languageID">{lang}wcf.user.language{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- {htmlOptions options=$availableLanguages selected=$languageID name=languageID id=languageID disableEncoding=true}\r
- </div>\r
- </div>\r
- \r
- {if $availableContentLanguages|count > 1}\r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- {lang}wcf.user.visibleLanguages{/lang}\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.user.visibleLanguages{/lang}</legend>\r
- <div class="formField">\r
- <ul class="formOptions">\r
- {foreach from=$availableContentLanguages key=availableLanguageID item=availableLanguage}\r
- <li><label><input type="checkbox" name="visibleLanguages[]" value="{@$availableLanguageID}"{if $availableLanguageID|in_array:$visibleLanguages} checked="checked"{/if} /> {@$availableLanguage}</label></li>\r
- {/foreach}\r
- </ul>\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- {/if}\r
- {/if}\r
- \r
- {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.user.option.'}\r
- </fieldset>\r
- {/foreach}\r
- </div>\r
- </div>\r
- {/foreach}\r
- {/if}\r
- \r
- {if $additionalTabContents|isset}{@$additionalTabContents}{/if}\r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="action" value="{@$action}" />\r
- {if $userID|isset}<input type="hidden" name="userID" value="{@$userID}" />{/if}\r
- </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>
+{if $userID|isset}
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/InlineListEdit.class.js"></script>
+ <script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/UserListEdit.class.js"></script>
+{/if}
+<script type="text/javascript">
+ //<![CDATA[
+ var tabMenu = new TabMenu();
+ {if $optionTree|count}onloadEvents.push(function() { tabMenu.showSubTabMenu('{@$options[0][object]->categoryName}') });{/if}
+
+ {if $userID|isset}
+ var userData = new Hash();
+ userData.set({@$userID}, {
+ 'isMarked': {@$user->isMarked()}
+ });
+
+ var url = '{@$url|encodeJS}';
+
+ // language
+ var language = new Object();
+ language['wcf.global.button.mark'] = '{lang}wcf.global.button.mark{/lang}';
+ language['wcf.global.button.unmark'] = '{lang}wcf.global.button.unmark{/lang}';
+ language['wcf.global.button.delete'] = '{lang}wcf.global.button.delete{/lang}';
+ language['wcf.acp.user.button.sendMail'] = '{lang}wcf.acp.user.button.sendMail{/lang}';
+ language['wcf.acp.user.button.exportMail'] = '{lang}wcf.acp.user.button.exportMail{/lang}';
+ language['wcf.acp.user.button.assignGroup'] = '{lang}wcf.acp.user.button.assignGroup{/lang}';
+ language['wcf.acp.user.deleteMarked.sure'] = '{lang}wcf.acp.user.deleteMarked.sure{/lang}';
+ language['wcf.acp.user.delete.sure'] = '{lang}wcf.acp.user.delete.sure{/lang}';
+ language['wcf.acp.user.markedUsers'] = '{lang}wcf.acp.user.markedUsers{/lang}';
+
+ // additional options
+ var additionalOptions = new Array();
+ var additionalUserOptions = new Array();
+ {if $additionalUserOptions|isset}{@$additionalUserOptions}{/if}
+ {if $additionalMarkedOptions|isset}{@$additionalMarkedOptions}{/if}
+
+ // permissions
+ var permissions = new Object();
+ permissions['canEditUser'] = {if $__wcf->session->getPermission('admin.user.canEditUser')}1{else}0{/if};
+ permissions['canDeleteUser'] = {if $__wcf->session->getPermission('admin.user.canDeleteUser')}1{else}0{/if};
+ permissions['canMailUser'] = {if $__wcf->session->getPermission('admin.user.canMailUser')}1{else}0{/if};
+ permissions['canEditMailAddress'] = {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}1{else}0{/if};
+ permissions['canEditPassword'] = {if $__wcf->session->getPermission('admin.user.canEditPassword')}1{else}0{/if};
+
+ onloadEvents.push(function() { userListEdit = new UserListEdit(userData, {@$markedUsers}, additionalUserOptions, additionalOptions); });
+ {/if}
+ //]]>
+</script>
+
+<header class="mainHeading">
+ <img {if $userID|isset}id="userEdit{@$userID}" {/if}src="{@RELATIVE_WCF_DIR}icon/user{@$action|ucfirst}L.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.user.{@$action}{/lang}</h1>
+ </hgroup>
+</header>
+
+{if $errorField}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $success|isset}
+ <p class="success">{lang}wcf.acp.user.{@$action}.success{/lang}</p>
+{/if}
+
+{if $userID|isset && $__wcf->user->userID == $userID}
+ <p class="warning">{lang}wcf.acp.user.edit.warning.selfEdit{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+ <nav class="largeButtons">
+ <ul>
+ <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a></li>
+ <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </nav>
+</div>
+
+<form method="post" action="index.php?form=User{@$action|ucfirst}">
+ <div class="border content">
+ <div class="container-1">
+ <div class="formElement{if $errorType.username|isset} formError{/if}">
+ <div class="formFieldLabel">
+ <label for="username">{lang}wcf.user.username{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="username" name="username" value="{$username}" />
+ {if $errorType.username|isset}
+ <p class="innerError">
+ {if $errorType.username == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType.username == 'notValid'}{lang}wcf.user.error.username.notValid{/lang}{/if}
+ {if $errorType.username == 'notUnique'}{lang}wcf.user.error.username.notUnique{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ </div>
+
+ {if $availableGroups|count}
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.acp.user.groups{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+
+ <div class="formField">
+ {htmlCheckboxes options=$availableGroups name=groupIDs selected=$groupIDs}
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ {/if}
+
+ {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditMailAddress')}
+ <fieldset>
+ <legend>{lang}wcf.user.email{/lang}</legend>
+ <div class="formElement{if $errorType.email|isset} formError{/if}">
+ <div class="formFieldLabel">
+ <label for="email">{lang}wcf.user.email{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="email" name="email" value="{$email}" />
+ {if $errorType.email|isset}
+ <p class="innerError">
+ {if $errorType.email == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ {if $errorType.email == 'notValid'}{lang}wcf.user.error.email.notValid{/lang}{/if}
+ {if $errorType.email == 'notUnique'}{lang}wcf.user.error.email.notUnique{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ </div>
+
+ <div class="formElement{if $errorType.confirmEmail|isset} formError{/if}">
+ <div class="formFieldLabel">
+ <label for="confirmEmail">{lang}wcf.user.confirmEmail{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="confirmEmail" name="confirmEmail" value="{$confirmEmail}" />
+ {if $errorType.confirmEmail|isset}
+ <p class="innerError">
+ {if $errorType.confirmEmail == 'notEqual'}{lang}wcf.user.error.confirmEmail.notEqual{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ </div>
+ </fieldset>
+ {/if}
+
+ {if $action == 'add' || $__wcf->session->getPermission('admin.user.canEditPassword')}
+ <fieldset>
+ <legend>{lang}wcf.user.password{/lang}</legend>
+ <div class="formElement{if $errorType.password|isset} formError{/if}">
+ <div class="formFieldLabel">
+ <label for="password">{lang}wcf.user.password{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="password" class="inputText" id="password" name="password" value="{$password}" />
+ {if $errorType.password|isset}
+ <p class="innerError">
+ {if $errorType.password == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ </div>
+
+ <div class="formElement{if $errorType.confirmPassword|isset} formError{/if}">
+ <div class="formFieldLabel">
+ <label for="confirmPassword">{lang}wcf.user.confirmPassword{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="password" class="inputText" id="confirmPassword" name="confirmPassword" value="{$confirmPassword}" />
+ {if $errorType.confirmPassword|isset}
+ <p class="innerError">
+ {if $errorType.confirmPassword == 'notEqual'}{lang}wcf.user.error.confirmPassword.notEqual{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ </div>
+ </fieldset>
+ {/if}
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+
+ {if $optionTree|count || $additionalTabs|isset}
+ <nav>
+ <div class="tabMenu">
+ <ul>
+ {foreach from=$optionTree item=categoryLevel1}
+ <li id="{@$categoryLevel1[object]->categoryName}"><a onclick="tabMenu.showSubTabMenu('{@$categoryLevel1[object]->categoryName}');"><span>{lang}wcf.user.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</span></a></li>
+ {/foreach}
+
+ {if $additionalTabs|isset}{@$additionalTabs}{/if}
+ </ul>
+ </div>
+ <nav>
+ <div class="subTabMenu">
+ <div class="containerHead"><div> </div></div>
+ </div>
+
+ {foreach from=$optionTree item=categoryLevel1}
+ <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}-content">
+ <div class="container-1">
+ <h3 class="subHeading">{lang}wcf.user.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</h3>
+
+ {foreach from=$categoryLevel1[categories] item=categoryLevel2}
+ <fieldset>
+ <legend>{lang}wcf.user.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</legend>
+
+ {if $categoryLevel2[object]->categoryName == 'settings.general' && $availableLanguages|count > 1}
+ <div class="formElement">
+ <div class="formFieldLabel">
+ <label for="languageID">{lang}wcf.user.language{/lang}</label>
+ </div>
+ <div class="formField">
+ {htmlOptions options=$availableLanguages selected=$languageID name=languageID id=languageID disableEncoding=true}
+ </div>
+ </div>
+
+ {if $availableContentLanguages|count > 1}
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ {lang}wcf.user.visibleLanguages{/lang}
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.user.visibleLanguages{/lang}</legend>
+ <div class="formField">
+ <ul class="formOptions">
+ {foreach from=$availableContentLanguages key=availableLanguageID item=availableLanguage}
+ <li><label><input type="checkbox" name="visibleLanguages[]" value="{@$availableLanguageID}"{if $availableLanguageID|in_array:$visibleLanguages} checked="checked"{/if} /> {@$availableLanguage}</label></li>
+ {/foreach}
+ </ul>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ {/if}
+ {/if}
+
+ {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.user.option.'}
+ </fieldset>
+ {/foreach}
+ </div>
+ </div>
+ {/foreach}
+ {/if}
+
+ {if $additionalTabContents|isset}{@$additionalTabContents}{/if}
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="action" value="{@$action}" />
+ {if $userID|isset}<input type="hidden" name="userID" value="{@$userID}" />{/if}
+ </div>
+</form>
+
+{include file='footer'}
-{include file='header'}\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/usersL.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{lang}wcf.acp.user.assignToGroup{/lang}</h2>\r
- </div>\r
-</div>\r
-\r
-{if $errorField}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="index.php?form=UserAssignToGroup">\r
-\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.assignToGroup.markedUsers{/lang}</legend>\r
- \r
- <div>\r
- {implode from=$users item=$user}<a href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}\r
- </div>\r
- </fieldset> \r
- \r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
- \r
- <div>\r
- <div class="formField{if $errorField == 'groupIDs'} formError{/if}">\r
- {htmlCheckboxes options=$groups name=groupIDs selected=$groupIDs}\r
- {if $errorField == 'groupIDs'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="userIDs" value="{@$userIDs}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/usersL.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{lang}wcf.acp.user.assignToGroup{/lang}</h2>
+ </div>
+</div>
+
+{if $errorField}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<form method="post" action="index.php?form=UserAssignToGroup">
+
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.assignToGroup.markedUsers{/lang}</legend>
+
+ <div>
+ {implode from=$users item=$user}<a href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}
+ </div>
+ </fieldset>
+
+ <fieldset>
+ <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+
+ <div>
+ <div class="formField{if $errorField == 'groupIDs'} formError{/if}">
+ {htmlCheckboxes options=$groups name=groupIDs selected=$groupIDs}
+ {if $errorField == 'groupIDs'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="userIDs" value="{@$userIDs}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- function setFileType(newType) {\r
- switch (newType) {\r
- case 'csv':\r
- showOptions('separatorDiv', 'textSeparatorDiv');\r
- break;\r
- case 'xml':\r
- hideOptions('separatorDiv', 'textSeparatorDiv');\r
- break;\r
- }\r
- }\r
- onloadEvents.push(function() { setFileType('{@$fileType}'); });\r
- //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/usersL.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{lang}wcf.acp.user.exportEmailAddress{/lang}</h2>\r
- </div>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=UserEmailAddressExport">\r
-\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.exportEmailAddress.markedUsers{/lang}</legend>\r
- \r
- <div>\r
- {implode from=$users item=$user}<a href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}\r
- </div>\r
- </fieldset> \r
- \r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.exportEmailAddress.format{/lang}</legend>\r
- \r
- <div>\r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</legend>\r
- \r
- <div class="formField">\r
- <ul class="formOptionsLong">\r
- <li><label><input onclick="if (IS_SAFARI) setFileType('csv')" onfocus="setFileType('csv')" type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label></li>\r
- <li><label><input onclick="if (IS_SAFARI) setFileType('xml')" onfocus="setFileType('xml')" type="radio" name="fileType" value="xml" {if $fileType == 'xml'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label></li>\r
- </ul>\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- \r
- <div class="formElement" id="separatorDiv">\r
- <div class="formFieldLabel">\r
- <label for="separator">{lang}wcf.acp.user.exportEmailAddress.separator{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <textarea id="separator" name="separator" rows="2" cols="40">{$separator}</textarea>\r
- </div>\r
- </div>\r
- \r
- <div class="formElement" id="textSeparatorDiv">\r
- <div class="formFieldLabel">\r
- <label for="textSeparator">{lang}wcf.acp.user.exportEmailAddress.textSeparator{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="textSeparator" name="textSeparator" value="{$textSeparator}" />\r
- </div>\r
- </div>\r
- </div>\r
- </fieldset>\r
- \r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="userIDs" value="{@$userIDs}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+<script type="text/javascript">
+ //<![CDATA[
+ function setFileType(newType) {
+ switch (newType) {
+ case 'csv':
+ showOptions('separatorDiv', 'textSeparatorDiv');
+ break;
+ case 'xml':
+ hideOptions('separatorDiv', 'textSeparatorDiv');
+ break;
+ }
+ }
+ onloadEvents.push(function() { setFileType('{@$fileType}'); });
+ //]]>
+</script>
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/usersL.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{lang}wcf.acp.user.exportEmailAddress{/lang}</h2>
+ </div>
+</div>
+
+<form method="post" action="index.php?form=UserEmailAddressExport">
+
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.exportEmailAddress.markedUsers{/lang}</legend>
+
+ <div>
+ {implode from=$users item=$user}<a href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}
+ </div>
+ </fieldset>
+
+ <fieldset>
+ <legend>{lang}wcf.acp.user.exportEmailAddress.format{/lang}</legend>
+
+ <div>
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</legend>
+
+ <div class="formField">
+ <ul class="formOptionsLong">
+ <li><label><input onclick="if (IS_SAFARI) setFileType('csv')" onfocus="setFileType('csv')" type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label></li>
+ <li><label><input onclick="if (IS_SAFARI) setFileType('xml')" onfocus="setFileType('xml')" type="radio" name="fileType" value="xml" {if $fileType == 'xml'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label></li>
+ </ul>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+
+ <div class="formElement" id="separatorDiv">
+ <div class="formFieldLabel">
+ <label for="separator">{lang}wcf.acp.user.exportEmailAddress.separator{/lang}</label>
+ </div>
+ <div class="formField">
+ <textarea id="separator" name="separator" rows="2" cols="40">{$separator}</textarea>
+ </div>
+ </div>
+
+ <div class="formElement" id="textSeparatorDiv">
+ <div class="formFieldLabel">
+ <label for="textSeparator">{lang}wcf.acp.user.exportEmailAddress.textSeparator{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="textSeparator" name="textSeparator" value="{$textSeparator}" />
+ </div>
+ </div>
+ </div>
+ </fieldset>
+
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="userIDs" value="{@$userIDs}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header' templateName='userException'}\r
-\r
-<p class="error" id="errorMessage">\r
- {@$message}\r
-</p>\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- if (document.referrer) {\r
- onloadEvents.push(function() { document.getElementById('errorMessage').innerHTML += "<br /><a href=\"" + document.referrer + "{@SID_ARG_2ND_NOT_ENCODED}\">{lang}wcf.global.error.backward{/lang}</a>"; });\r
- }\r
- //]]>\r
-</script>\r
-\r
-<!-- \r
-{$name} thrown in {$file} ({@$line})\r
-Stracktrace:\r
-{$stacktrace}\r
--->\r
-\r
+{include file='header' templateName='userException'}
+
+<p class="error" id="errorMessage">
+ {@$message}
+</p>
+
+<script type="text/javascript">
+ //<![CDATA[
+ if (document.referrer) {
+ onloadEvents.push(function() { document.getElementById('errorMessage').innerHTML += "<br /><a href=\"" + document.referrer + "{@SID_ARG_2ND_NOT_ENCODED}\">{lang}wcf.global.error.backward{/lang}</a>"; });
+ }
+ //]]>
+</script>
+
+<!--
+{$name} thrown in {$file} ({@$line})
+Stracktrace:
+{$stacktrace}
+-->
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- var tabMenu = new TabMenu();\r
- onloadEvents.push(function() { tabMenu.showSubTabMenu("{$activeTabMenuItem}", "{$activeSubTabMenuItem}"); });\r
- //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/userGroup{@$action|ucfirst}L.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{lang}wcf.acp.group.{@$action}{/lang}</h2>\r
- </div>\r
-</div>\r
-\r
-{if $errorField}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $success|isset}\r
- <p class="success">{lang}wcf.acp.group.{@$action}.success{/lang}</p> \r
-{/if}\r
-\r
-{if $warningSelfEdit|isset}\r
- <p class="warning">{lang}wcf.acp.group.edit.warning.selfIsMember{/lang}</p> \r
-{/if}\r
-\r
-<div class="contentHeader">\r
- <div class="largeButtons">\r
- <ul>\r
- <li><a href="index.php?page=UserGroupList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.group.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupM.png" alt="" /> <span>{lang}wcf.acp.menu.link.group.view{/lang}</span></a></li>\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </div>\r
-</div>\r
-<form method="post" action="index.php?form=UserGroup{@$action|ucfirst}">\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.group.data{/lang}</legend>\r
- \r
- <div class="formElement{if $errorType.groupName|isset} formError{/if}" id="groupNameDiv">\r
- <div class="formFieldLabel">\r
- <label for="groupName">{lang}wcf.acp.group.groupName{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="groupName" name="groupName" value="{$groupName}" />\r
- {if $errorType.groupName|isset}\r
- <p class="innerError">\r
- {if $errorType.groupName == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="groupNameHelpMessage">\r
- <p>{lang}wcf.acp.group.groupName.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('groupName');\r
- //]]></script>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </fieldset>\r
- \r
- {if $additionalFieldSets|isset}{@$additionalFieldSets}{/if}\r
- \r
- <div class="tabMenu">\r
- <ul>\r
- {foreach from=$optionTree item=categoryLevel1}\r
- <li id="{@$categoryLevel1[object]->categoryName}"><a onclick="tabMenu.showSubTabMenu('{@$categoryLevel1[object]->categoryName}');"><span>{lang}wcf.acp.group.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</span></a></li>\r
- {/foreach}\r
- </ul>\r
- </div>\r
- <div class="subTabMenu">\r
- <div class="containerHead">\r
- {foreach from=$optionTree item=categoryLevel1}\r
- <ul class="hidden" id="{@$categoryLevel1[object]->categoryName}-categories">\r
- {foreach from=$categoryLevel1[categories] item=categoryLevel2}\r
- <li id="{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}"><a onclick="tabMenu.showTabMenuContent('{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}');"><span>{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</span></a></li>\r
- {/foreach}\r
- </ul>\r
- {/foreach}\r
- </div>\r
- </div>\r
- \r
- {foreach from=$optionTree item=categoryLevel1}\r
- {foreach from=$categoryLevel1[categories] item=categoryLevel2}\r
- <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}-content">\r
- <div class="container-1">\r
- <h3 class="subHeadline">{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</h3>\r
- <p class="description">{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}.description{/lang}</p>\r
- \r
- {if $categoryLevel2[options]|count}\r
- {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.acp.group.option.'}\r
- {/if}\r
- \r
- {if $categoryLevel2[categories]|count}\r
- {foreach from=$categoryLevel2[categories] item=categoryLevel3}\r
- <fieldset>\r
- <legend>{lang}wcf.acp.group.option.category.{@$categoryLevel3[object]->categoryName}{/lang}</legend>\r
- <p class="description">{lang}wcf.acp.group.option.category.{@$categoryLevel3[object]->categoryName}.description{/lang}</p>\r
- \r
- <div>\r
- {include file='optionFieldList' options=$categoryLevel3[options] langPrefix='wcf.acp.group.option.'}\r
- </div>\r
- </fieldset>\r
- {/foreach}\r
- {/if}\r
- </div>\r
- </div>\r
- {/foreach}\r
- {/foreach}\r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="action" value="{@$action}" />\r
- {if $groupID|isset}<input type="hidden" name="groupID" value="{@$groupID}" />{/if}\r
- \r
- <input type="hidden" id="activeTabMenuItem" name="activeTabMenuItem" value="{$activeTabMenuItem}" />\r
- <input type="hidden" id="activeSubTabMenuItem" name="activeSubTabMenuItem" value="{$activeSubTabMenuItem}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>
+<script type="text/javascript">
+ //<![CDATA[
+ var tabMenu = new TabMenu();
+ onloadEvents.push(function() { tabMenu.showSubTabMenu("{$activeTabMenuItem}", "{$activeSubTabMenuItem}"); });
+ //]]>
+</script>
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/userGroup{@$action|ucfirst}L.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{lang}wcf.acp.group.{@$action}{/lang}</h2>
+ </div>
+</div>
+
+{if $errorField}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $success|isset}
+ <p class="success">{lang}wcf.acp.group.{@$action}.success{/lang}</p>
+{/if}
+
+{if $warningSelfEdit|isset}
+ <p class="warning">{lang}wcf.acp.group.edit.warning.selfIsMember{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+ <div class="largeButtons">
+ <ul>
+ <li><a href="index.php?page=UserGroupList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.group.view{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupM.png" alt="" /> <span>{lang}wcf.acp.menu.link.group.view{/lang}</span></a></li>
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </div>
+</div>
+<form method="post" action="index.php?form=UserGroup{@$action|ucfirst}">
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.group.data{/lang}</legend>
+
+ <div class="formElement{if $errorType.groupName|isset} formError{/if}" id="groupNameDiv">
+ <div class="formFieldLabel">
+ <label for="groupName">{lang}wcf.acp.group.groupName{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="groupName" name="groupName" value="{$groupName}" />
+ {if $errorType.groupName|isset}
+ <p class="innerError">
+ {if $errorType.groupName == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="groupNameHelpMessage">
+ <p>{lang}wcf.acp.group.groupName.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('groupName');
+ //]]></script>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </fieldset>
+
+ {if $additionalFieldSets|isset}{@$additionalFieldSets}{/if}
+
+ <div class="tabMenu">
+ <ul>
+ {foreach from=$optionTree item=categoryLevel1}
+ <li id="{@$categoryLevel1[object]->categoryName}"><a onclick="tabMenu.showSubTabMenu('{@$categoryLevel1[object]->categoryName}');"><span>{lang}wcf.acp.group.option.category.{@$categoryLevel1[object]->categoryName}{/lang}</span></a></li>
+ {/foreach}
+ </ul>
+ </div>
+ <div class="subTabMenu">
+ <div class="containerHead">
+ {foreach from=$optionTree item=categoryLevel1}
+ <ul class="hidden" id="{@$categoryLevel1[object]->categoryName}-categories">
+ {foreach from=$categoryLevel1[categories] item=categoryLevel2}
+ <li id="{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}"><a onclick="tabMenu.showTabMenuContent('{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}');"><span>{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</span></a></li>
+ {/foreach}
+ </ul>
+ {/foreach}
+ </div>
+ </div>
+
+ {foreach from=$optionTree item=categoryLevel1}
+ {foreach from=$categoryLevel1[categories] item=categoryLevel2}
+ <div class="border tabMenuContent hidden" id="{@$categoryLevel1[object]->categoryName}-{@$categoryLevel2[object]->categoryName}-content">
+ <div class="container-1">
+ <h3 class="subHeadline">{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}{/lang}</h3>
+ <p class="description">{lang}wcf.acp.group.option.category.{@$categoryLevel2[object]->categoryName}.description{/lang}</p>
+
+ {if $categoryLevel2[options]|count}
+ {include file='optionFieldList' options=$categoryLevel2[options] langPrefix='wcf.acp.group.option.'}
+ {/if}
+
+ {if $categoryLevel2[categories]|count}
+ {foreach from=$categoryLevel2[categories] item=categoryLevel3}
+ <fieldset>
+ <legend>{lang}wcf.acp.group.option.category.{@$categoryLevel3[object]->categoryName}{/lang}</legend>
+ <p class="description">{lang}wcf.acp.group.option.category.{@$categoryLevel3[object]->categoryName}.description{/lang}</p>
+
+ <div>
+ {include file='optionFieldList' options=$categoryLevel3[options] langPrefix='wcf.acp.group.option.'}
+ </div>
+ </fieldset>
+ {/foreach}
+ {/if}
+ </div>
+ </div>
+ {/foreach}
+ {/foreach}
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="action" value="{@$action}" />
+ {if $groupID|isset}<input type="hidden" name="groupID" value="{@$groupID}" />{/if}
+
+ <input type="hidden" id="activeTabMenuItem" name="activeTabMenuItem" value="{$activeTabMenuItem}" />
+ <input type="hidden" id="activeSubTabMenuItem" name="activeSubTabMenuItem" value="{$activeSubTabMenuItem}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/RemoveObjectAction.class.js"></script>\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- var removeGroup = new RemoveObjectAction();\r
- removeGroup.setOptions({\r
- actionClass: 'UserGroup',\r
- containerPrefix: 'groupContainer',\r
- iconPrefix: 'groupDeleteIcon',\r
- langDeleteSure: '{lang}wcf.acp.group.delete.sure{/lang}',\r
- url: 'index.php?action=RemoveObject'\r
- });\r
- //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/userGroupL.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{lang}wcf.acp.group.list{/lang}</h2>\r
- </div>\r
-</div>\r
-\r
-{if $deletedGroups}\r
- <p class="success">{lang}wcf.acp.group.delete.success{/lang}</p>\r
-{/if}\r
-\r
-<div class="contentHeader">\r
- {pages print=true assign=pagesLinks link="index.php?page=UserGroupList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}\r
- <div class="largeButtons">\r
- <ul>\r
- <li><a href="index.php?form=UserGroupAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.group.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupAddM.png" alt="" /> <span>{lang}wcf.acp.group.add{/lang}</span></a></li>\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if} \r
- </ul>\r
- </div>\r
-</div>\r
-\r
-{if $groups|count}\r
- <div class="border titleBarPanel">\r
- <div class="containerHead"><h3>{lang}wcf.acp.group.list.data{/lang}</h3></div>\r
- </div>\r
- <div class="border borderMarginRemove">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th class="columnGroupID{if $sortField == 'groupID'} active{/if}" colspan="2"><div><a href="index.php?page=UserGroupList&pageNo={@$pageNo}&sortField=groupID&sortOrder={if $sortField == 'groupID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.groupID{/lang}{if $sortField == 'groupID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnGroupName{if $sortField == 'groupName'} active{/if}"><div><a href="index.php?page=UserGroupList&pageNo={@$pageNo}&sortField=groupName&sortOrder={if $sortField == 'groupName' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.groupName{/lang}{if $sortField == 'groupName'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnMembers{if $sortField == 'members'} active{/if}"><div><a href="index.php?page=UserGroupList&pageNo={@$pageNo}&sortField=members&sortOrder={if $sortField == 'members' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.members{/lang}{if $sortField == 'members'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- \r
- {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {foreach from=$groups item=group}\r
- <tr class="{cycle values="container-1,container-2"}" id="groupContainer{@$group->groupID}">\r
- <td class="columnIcon">\r
- {if $group->isEditable()}\r
- <a href="index.php?form=UserGroupEdit&groupID={@$group->groupID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.group.edit{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/editDisabledS.png" alt="" title="{lang}wcf.acp.group.edit{/lang}" />\r
- {/if}\r
- {if $group->isDeletable()}\r
- <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.group.delete{/lang}" id="groupDeleteIcon{@$group->groupID}" />\r
- <script type="text/javascript">\r
- //<![CDATA[\r
- removeGroup.registerObject({@$group->groupID}, {\r
- objectID: {@$group->groupID}\r
- });\r
- //]]>\r
- </script>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.group.delete{/lang}" />\r
- {/if}\r
- \r
- {if $additionalButtons[$group->groupID]|isset}{@$additionalButtons[$group->groupID]}{/if}\r
- </td>\r
- <td class="columnGroupID columnID">{@$group->groupID}</td>\r
- <td class="columnGroupName columnText">{if $group->isEditable()}<a title="{lang}wcf.acp.group.edit{/lang}" href="index.php?form=UserGroupEdit&groupID={@$group->groupID}{@SID_ARG_2ND}">{$group->groupName}</a>{else}{$group->groupName}{/if}</td>\r
- <td class="columnMembers columnNumbers"><a title="{lang}wcf.acp.group.showMembers{/lang}" href="index.php?form=UserSearch&groupID={@$group->groupID}{@SID_ARG_2ND}">{#$group->members}</a></td>\r
- \r
- {if $additionalColumns[$group->groupID]|isset}{@$additionalColumns[$group->groupID]}{/if}\r
- </tr>\r
- {/foreach}\r
- </tbody>\r
- </table>\r
- </div>\r
-{/if}\r
-\r
-<div class="contentFooter">\r
- {@$pagesLinks}\r
- <div class="largeButtons">\r
- <ul>\r
- <li><a href="index.php?form=UserGroupAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.group.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupAddM.png" alt="" /> <span>{lang}wcf.acp.group.add{/lang}</span></a></li>\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </div>\r
-</div>\r
-\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/RemoveObjectAction.class.js"></script>
+
+<script type="text/javascript">
+ //<![CDATA[
+ var removeGroup = new RemoveObjectAction();
+ removeGroup.setOptions({
+ actionClass: 'UserGroup',
+ containerPrefix: 'groupContainer',
+ iconPrefix: 'groupDeleteIcon',
+ langDeleteSure: '{lang}wcf.acp.group.delete.sure{/lang}',
+ url: 'index.php?action=RemoveObject'
+ });
+ //]]>
+</script>
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/userGroupL.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{lang}wcf.acp.group.list{/lang}</h2>
+ </div>
+</div>
+
+{if $deletedGroups}
+ <p class="success">{lang}wcf.acp.group.delete.success{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+ {pages print=true assign=pagesLinks link="index.php?page=UserGroupList&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}
+ <div class="largeButtons">
+ <ul>
+ <li><a href="index.php?form=UserGroupAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.group.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupAddM.png" alt="" /> <span>{lang}wcf.acp.group.add{/lang}</span></a></li>
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </div>
+</div>
+
+{if $groups|count}
+ <div class="border titleBarPanel">
+ <div class="containerHead"><h3>{lang}wcf.acp.group.list.data{/lang}</h3></div>
+ </div>
+ <div class="border borderMarginRemove">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th class="columnGroupID{if $sortField == 'groupID'} active{/if}" colspan="2"><div><a href="index.php?page=UserGroupList&pageNo={@$pageNo}&sortField=groupID&sortOrder={if $sortField == 'groupID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.groupID{/lang}{if $sortField == 'groupID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnGroupName{if $sortField == 'groupName'} active{/if}"><div><a href="index.php?page=UserGroupList&pageNo={@$pageNo}&sortField=groupName&sortOrder={if $sortField == 'groupName' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.groupName{/lang}{if $sortField == 'groupName'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnMembers{if $sortField == 'members'} active{/if}"><div><a href="index.php?page=UserGroupList&pageNo={@$pageNo}&sortField=members&sortOrder={if $sortField == 'members' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.acp.group.members{/lang}{if $sortField == 'members'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+
+ {if $additionalHeadColumns|isset}{@$additionalHeadColumns}{/if}
+ </tr>
+ </thead>
+ <tbody>
+ {foreach from=$groups item=group}
+ <tr class="{cycle values="container-1,container-2"}" id="groupContainer{@$group->groupID}">
+ <td class="columnIcon">
+ {if $group->isEditable()}
+ <a href="index.php?form=UserGroupEdit&groupID={@$group->groupID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.group.edit{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/editDisabledS.png" alt="" title="{lang}wcf.acp.group.edit{/lang}" />
+ {/if}
+ {if $group->isDeletable()}
+ <img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.group.delete{/lang}" id="groupDeleteIcon{@$group->groupID}" />
+ <script type="text/javascript">
+ //<![CDATA[
+ removeGroup.registerObject({@$group->groupID}, {
+ objectID: {@$group->groupID}
+ });
+ //]]>
+ </script>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.group.delete{/lang}" />
+ {/if}
+
+ {if $additionalButtons[$group->groupID]|isset}{@$additionalButtons[$group->groupID]}{/if}
+ </td>
+ <td class="columnGroupID columnID">{@$group->groupID}</td>
+ <td class="columnGroupName columnText">{if $group->isEditable()}<a title="{lang}wcf.acp.group.edit{/lang}" href="index.php?form=UserGroupEdit&groupID={@$group->groupID}{@SID_ARG_2ND}">{$group->groupName}</a>{else}{$group->groupName}{/if}</td>
+ <td class="columnMembers columnNumbers"><a title="{lang}wcf.acp.group.showMembers{/lang}" href="index.php?form=UserSearch&groupID={@$group->groupID}{@SID_ARG_2ND}">{#$group->members}</a></td>
+
+ {if $additionalColumns[$group->groupID]|isset}{@$additionalColumns[$group->groupID]}{/if}
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+ </div>
+{/if}
+
+<div class="contentFooter">
+ {@$pagesLinks}
+ <div class="largeButtons">
+ <ul>
+ <li><a href="index.php?form=UserGroupAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.group.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userGroupAddM.png" alt="" /> <span>{lang}wcf.acp.group.add{/lang}</span></a></li>
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </div>
+</div>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/InlineListEdit.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/UserListEdit.class.js"></script>\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- // data array\r
- var userData = new Hash();\r
- var url = '{@$url|encodeJS}';\r
- \r
- // language\r
- var language = new Object();\r
- language['wcf.global.button.mark'] = '{lang}wcf.global.button.mark{/lang}';\r
- language['wcf.global.button.unmark'] = '{lang}wcf.global.button.unmark{/lang}';\r
- language['wcf.global.button.delete'] = '{lang}wcf.global.button.delete{/lang}';\r
- language['wcf.acp.user.button.sendMail'] = '{lang}wcf.acp.user.button.sendMail{/lang}';\r
- language['wcf.acp.user.button.exportMail'] = '{lang}wcf.acp.user.button.exportMail{/lang}';\r
- language['wcf.acp.user.button.assignGroup'] = '{lang}wcf.acp.user.button.assignGroup{/lang}';\r
- language['wcf.acp.user.deleteMarked.sure'] = '{lang}wcf.acp.user.deleteMarked.sure{/lang}';\r
- language['wcf.acp.user.delete.sure'] = '{lang}wcf.acp.user.delete.sure{/lang}';\r
- language['wcf.acp.user.markedUsers'] = '{lang}wcf.acp.user.markedUsers{/lang}';\r
- \r
- // additional options\r
- var additionalOptions = new Array();\r
- var additionalUserOptions = new Array();\r
- {if $additionalMarkedOptions|isset}{@$additionalMarkedOptions}{/if}\r
- \r
- // permissions\r
- var permissions = new Object();\r
- permissions['canEditUser'] = {if $__wcf->session->getPermission('admin.user.canEditUser')}1{else}0{/if};\r
- permissions['canDeleteUser'] = {if $__wcf->session->getPermission('admin.user.canDeleteUser')}1{else}0{/if};\r
- permissions['canMailUser'] = {if $__wcf->session->getPermission('admin.user.canMailUser')}1{else}0{/if};\r
- permissions['canEditMailAddress'] = {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}1{else}0{/if};\r
- permissions['canEditPassword'] = {if $__wcf->session->getPermission('admin.user.canEditPassword')}1{else}0{/if};\r
- \r
- onloadEvents.push(function() { userListEdit = new UserListEdit(userData, {@$markedUsers}, additionalUserOptions, additionalOptions); });\r
- //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/{if $searchID}userSearch{else}users{/if}L.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.user.{if $searchID}search{else}list{/if}{/lang}</h1>\r
- <h2>{if $searchID}{lang}wcf.acp.user.search.matches{/lang}{else}{lang}wcf.acp.user.list.count{/lang}{/if}</h2>\r
- </hgroup>\r
-</header>\r
-\r
-{assign var=encodedURL value=$url|rawurlencode}\r
-{assign var=encodedAction value=$action|rawurlencode}\r
-<div class="contentHeader">\r
- {pages print=true assign=pagesLinks link="index.php?page=UserList&pageNo=%d&searchID=$searchID&action=$encodedAction&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}\r
- \r
- <nav class="largeButtons">\r
- <ul>\r
- {if $__wcf->session->getPermission('admin.user.canAddUser')}\r
- <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>\r
- {/if}\r
- <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </nav>\r
-</div>\r
-\r
-<div class="subTabMenu">\r
- <div class="containerHead">\r
- <ul>\r
- <li{if $action == ''} class="activeSubTabMenu"{/if}><a href="index.php?page=UserList{@SID_ARG_2ND}"><span>{lang}wcf.acp.user.list.all{/lang}</span></a></li>\r
- {if $additionalUserListOptions|isset}{@$additionalUserListOptions}{/if}\r
- </ul>\r
- </div>\r
-</div>\r
-{if $users|count}\r
- <div class="border">\r
- <table class="tableList">\r
- <thead>\r
- <tr class="tableHead">\r
- <th class="columnMark"><div><label class="emptyHead"><input name="userMarkAll" type="checkbox" /></label></div></th>\r
- <th class="columnUserID{if $sortField == 'userID'} active{/if}" colspan="2"><div><a href="index.php?page=UserList&searchID={@$searchID}&action={@$encodedAction}&pageNo={@$pageNo}&sortField=userID&sortOrder={if $sortField == 'userID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.user.userID{/lang}{if $sortField == 'userID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- <th class="columnUsername{if $sortField == 'username'} active{/if}"><div><a href="index.php?page=UserList&searchID={@$searchID}&action={@$encodedAction}&pageNo={@$pageNo}&sortField=username&sortOrder={if $sortField == 'username' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.user.username{/lang}{if $sortField == 'username'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- \r
- {foreach from=$columnHeads key=column item=columnLanguageVariable}\r
- <th class="column{$column|ucfirst}{if $sortField == $column} active{/if}"><div><a href="index.php?page=UserList&searchID={@$searchID}&action={@$encodedAction}&pageNo={@$pageNo}&sortField={$column}&sortOrder={if $sortField == $column && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}{$columnLanguageVariable}{/lang}{if $sortField == $column} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>\r
- {/foreach}\r
- \r
- {if $additionalColumnHeads|isset}{@$additionalColumnHeads}{/if}\r
- </tr>\r
- </thead>\r
- <tbody>\r
- {foreach from=$users item=user}\r
- <tr class="{cycle values="container-1,container-2" advance=false}" id="userRow{@$user->userID}">\r
- <td class="columnMark"><input name="userMark" id="userMark{@$user->userID}" type="checkbox" value="{@$user->userID}" /></td>\r
- <td class="columnIcon">\r
- <script type="text/javascript">\r
- //<![CDATA[\r
- userData.set({@$user->userID}, {\r
- 'isMarked': {@$user->isMarked},\r
- 'className': '{cycle values="container-1,container-2"}'\r
- });\r
- //]]>\r
- </script>\r
- \r
- {if $user->editable}\r
- <a href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.user.edit{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/editDisabledS.png" alt="" title="{lang}wcf.acp.user.edit{/lang}" />\r
- {/if}\r
- {if $user->deletable}\r
- <a onclick="return confirm('{lang}wcf.acp.user.delete.sure{/lang}')" href="index.php?action=UserDelete&userID={@$user->userID}&url={@$encodedURL}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.user.delete{/lang}" /></a>\r
- {else}\r
- <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.user.delete{/lang}" />\r
- {/if}\r
- \r
- {if $additionalButtons[$user->userID]|isset}{@$additionalButtons[$user->userID]}{/if}\r
- </td>\r
- <td class="columnUserID columnID">{@$user->userID}</td>\r
- <td class="columnUsername columnText">{if $user->editable}<a title="{lang}wcf.acp.user.edit{/lang}" href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}">{$user->username}</a>{else}{$user->username}{/if}</td>\r
- \r
- {foreach from=$columnHeads key=column item=columnLanguageVariable}\r
- <td class="column{$column|ucfirst}">{if $columnValues[$user->userID][$column]|isset}{@$columnValues[$user->userID][$column]}{/if}</td>\r
- {/foreach}\r
- \r
- {if $additionalColumns[$user->userID]|isset}{@$additionalColumns[$user->userID]}{/if}\r
- </tr>\r
- {/foreach}\r
- </tbody>\r
- </table>\r
- </div>\r
- \r
- <div class="contentFooter">\r
- {@$pagesLinks} <div id="userEditMarked" class="optionButtons"></div>\r
- \r
- <nav class="largeButtons">\r
- <ul>\r
- {if $__wcf->session->getPermission('admin.user.canAddUser')}\r
- <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>\r
- {/if}\r
- <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </nav>\r
- </div>\r
-{else}\r
- <div class="border content">\r
- <div class="container-1">\r
- <p class="info">{lang}wcf.acp.user.search.error.noMatches{/lang}</p>\r
- </div>\r
- </div>\r
-{/if}\r
-\r
-{include file='footer'}\r
+{include file='header'}
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/MultiPagesLinks.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/AjaxRequest.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/InlineListEdit.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}acp/js/UserListEdit.class.js"></script>
+<script type="text/javascript">
+ //<![CDATA[
+ // data array
+ var userData = new Hash();
+ var url = '{@$url|encodeJS}';
+
+ // language
+ var language = new Object();
+ language['wcf.global.button.mark'] = '{lang}wcf.global.button.mark{/lang}';
+ language['wcf.global.button.unmark'] = '{lang}wcf.global.button.unmark{/lang}';
+ language['wcf.global.button.delete'] = '{lang}wcf.global.button.delete{/lang}';
+ language['wcf.acp.user.button.sendMail'] = '{lang}wcf.acp.user.button.sendMail{/lang}';
+ language['wcf.acp.user.button.exportMail'] = '{lang}wcf.acp.user.button.exportMail{/lang}';
+ language['wcf.acp.user.button.assignGroup'] = '{lang}wcf.acp.user.button.assignGroup{/lang}';
+ language['wcf.acp.user.deleteMarked.sure'] = '{lang}wcf.acp.user.deleteMarked.sure{/lang}';
+ language['wcf.acp.user.delete.sure'] = '{lang}wcf.acp.user.delete.sure{/lang}';
+ language['wcf.acp.user.markedUsers'] = '{lang}wcf.acp.user.markedUsers{/lang}';
+
+ // additional options
+ var additionalOptions = new Array();
+ var additionalUserOptions = new Array();
+ {if $additionalMarkedOptions|isset}{@$additionalMarkedOptions}{/if}
+
+ // permissions
+ var permissions = new Object();
+ permissions['canEditUser'] = {if $__wcf->session->getPermission('admin.user.canEditUser')}1{else}0{/if};
+ permissions['canDeleteUser'] = {if $__wcf->session->getPermission('admin.user.canDeleteUser')}1{else}0{/if};
+ permissions['canMailUser'] = {if $__wcf->session->getPermission('admin.user.canMailUser')}1{else}0{/if};
+ permissions['canEditMailAddress'] = {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}1{else}0{/if};
+ permissions['canEditPassword'] = {if $__wcf->session->getPermission('admin.user.canEditPassword')}1{else}0{/if};
+
+ onloadEvents.push(function() { userListEdit = new UserListEdit(userData, {@$markedUsers}, additionalUserOptions, additionalOptions); });
+ //]]>
+</script>
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/{if $searchID}userSearch{else}users{/if}L.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.user.{if $searchID}search{else}list{/if}{/lang}</h1>
+ <h2>{if $searchID}{lang}wcf.acp.user.search.matches{/lang}{else}{lang}wcf.acp.user.list.count{/lang}{/if}</h2>
+ </hgroup>
+</header>
+
+{assign var=encodedURL value=$url|rawurlencode}
+{assign var=encodedAction value=$action|rawurlencode}
+<div class="contentHeader">
+ {pages print=true assign=pagesLinks link="index.php?page=UserList&pageNo=%d&searchID=$searchID&action=$encodedAction&sortField=$sortField&sortOrder=$sortOrder&packageID="|concat:SID_ARG_2ND_NOT_ENCODED}
+
+ <nav class="largeButtons">
+ <ul>
+ {if $__wcf->session->getPermission('admin.user.canAddUser')}
+ <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>
+ {/if}
+ <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </nav>
+</div>
+
+<div class="subTabMenu">
+ <div class="containerHead">
+ <ul>
+ <li{if $action == ''} class="activeSubTabMenu"{/if}><a href="index.php?page=UserList{@SID_ARG_2ND}"><span>{lang}wcf.acp.user.list.all{/lang}</span></a></li>
+ {if $additionalUserListOptions|isset}{@$additionalUserListOptions}{/if}
+ </ul>
+ </div>
+</div>
+{if $users|count}
+ <div class="border">
+ <table class="tableList">
+ <thead>
+ <tr class="tableHead">
+ <th class="columnMark"><div><label class="emptyHead"><input name="userMarkAll" type="checkbox" /></label></div></th>
+ <th class="columnUserID{if $sortField == 'userID'} active{/if}" colspan="2"><div><a href="index.php?page=UserList&searchID={@$searchID}&action={@$encodedAction}&pageNo={@$pageNo}&sortField=userID&sortOrder={if $sortField == 'userID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.user.userID{/lang}{if $sortField == 'userID'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ <th class="columnUsername{if $sortField == 'username'} active{/if}"><div><a href="index.php?page=UserList&searchID={@$searchID}&action={@$encodedAction}&pageNo={@$pageNo}&sortField=username&sortOrder={if $sortField == 'username' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}wcf.user.username{/lang}{if $sortField == 'username'} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+
+ {foreach from=$columnHeads key=column item=columnLanguageVariable}
+ <th class="column{$column|ucfirst}{if $sortField == $column} active{/if}"><div><a href="index.php?page=UserList&searchID={@$searchID}&action={@$encodedAction}&pageNo={@$pageNo}&sortField={$column}&sortOrder={if $sortField == $column && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@SID_ARG_2ND}">{lang}{$columnLanguageVariable}{/lang}{if $sortField == $column} <img src="{@RELATIVE_WCF_DIR}icon/sort{@$sortOrder}S.png" alt="" />{/if}</a></div></th>
+ {/foreach}
+
+ {if $additionalColumnHeads|isset}{@$additionalColumnHeads}{/if}
+ </tr>
+ </thead>
+ <tbody>
+ {foreach from=$users item=user}
+ <tr class="{cycle values="container-1,container-2" advance=false}" id="userRow{@$user->userID}">
+ <td class="columnMark"><input name="userMark" id="userMark{@$user->userID}" type="checkbox" value="{@$user->userID}" /></td>
+ <td class="columnIcon">
+ <script type="text/javascript">
+ //<![CDATA[
+ userData.set({@$user->userID}, {
+ 'isMarked': {@$user->isMarked},
+ 'className': '{cycle values="container-1,container-2"}'
+ });
+ //]]>
+ </script>
+
+ {if $user->editable}
+ <a href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" title="{lang}wcf.acp.user.edit{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/editDisabledS.png" alt="" title="{lang}wcf.acp.user.edit{/lang}" />
+ {/if}
+ {if $user->deletable}
+ <a onclick="return confirm('{lang}wcf.acp.user.delete.sure{/lang}')" href="index.php?action=UserDelete&userID={@$user->userID}&url={@$encodedURL}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/deleteS.png" alt="" title="{lang}wcf.acp.user.delete{/lang}" /></a>
+ {else}
+ <img src="{@RELATIVE_WCF_DIR}icon/deleteDisabledS.png" alt="" title="{lang}wcf.acp.user.delete{/lang}" />
+ {/if}
+
+ {if $additionalButtons[$user->userID]|isset}{@$additionalButtons[$user->userID]}{/if}
+ </td>
+ <td class="columnUserID columnID">{@$user->userID}</td>
+ <td class="columnUsername columnText">{if $user->editable}<a title="{lang}wcf.acp.user.edit{/lang}" href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}">{$user->username}</a>{else}{$user->username}{/if}</td>
+
+ {foreach from=$columnHeads key=column item=columnLanguageVariable}
+ <td class="column{$column|ucfirst}">{if $columnValues[$user->userID][$column]|isset}{@$columnValues[$user->userID][$column]}{/if}</td>
+ {/foreach}
+
+ {if $additionalColumns[$user->userID]|isset}{@$additionalColumns[$user->userID]}{/if}
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+ </div>
+
+ <div class="contentFooter">
+ {@$pagesLinks} <div id="userEditMarked" class="optionButtons"></div>
+
+ <nav class="largeButtons">
+ <ul>
+ {if $__wcf->session->getPermission('admin.user.canAddUser')}
+ <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>
+ {/if}
+ <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </nav>
+ </div>
+{else}
+ <div class="border content">
+ <div class="container-1">
+ <p class="info">{lang}wcf.acp.user.search.error.noMatches{/lang}</p>
+ </div>
+ </div>
+{/if}
+
+{include file='footer'}
-{include file='header'}\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/emailL.png" alt="" />\r
- <hgroup>\r
- <h1>\r
- {if $action == 'all'}\r
- {lang}wcf.acp.user.sendMail.all{/lang}\r
- {elseif $action == 'group'}\r
- {lang}wcf.acp.user.sendMail.group{/lang}\r
- {else}\r
- {lang}wcf.acp.user.sendMail{/lang}\r
- {/if}\r
- </h1>\r
- </hgroup>\r
-</header>\r
-\r
-{if $errorField}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-<div class="contentHeader">\r
- <nav class="largeButtons">\r
- <ul>\r
- <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a></li>\r
- <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>\r
- {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}\r
- </ul>\r
- </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=UserMail">\r
- <div class="border content">\r
- <div class="container-1">\r
- {if $action == ''}\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.sendMail.markedUsers{/lang}</legend>\r
- \r
- <div>\r
- {implode from=$users item=$user}<a href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}\r
- </div>\r
- </fieldset> \r
- {/if}\r
- {if $action == 'group'}\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.sendMail.groups{/lang}</legend>\r
- \r
- <div class="formGroup{if $errorField == 'groupIDs'} formError{/if}">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.acp.user.groups{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
- \r
- <div class="formField">\r
- {htmlCheckboxes options=$groups name=groupIDs selected=$groupIDs}\r
- </div>\r
- </fieldset>\r
- {if $errorField == 'groupIDs'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- </div>\r
- </fieldset> \r
- {/if}\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.sendMail.mail{/lang}</legend>\r
- \r
- <div>\r
- <div class="formElement{if $errorField == 'subject'} formError{/if}" id="subjectDiv">\r
- <div class="formFieldLabel">\r
- <label for="subject">{lang}wcf.acp.user.sendMail.subject{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="subject" name="subject" value="{$subject}" />\r
- {if $errorField == 'subject'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="subjectHelpMessage">\r
- <p>{lang}wcf.acp.user.sendMail.subject.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('subject');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'from'} formError{/if}" id="fromDiv">\r
- <div class="formFieldLabel">\r
- <label for="from">{lang}wcf.acp.user.sendMail.from{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="from" name="from" value="{$from}" />\r
- {if $errorField == 'from'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="fromHelpMessage">\r
- <p>{lang}wcf.acp.user.sendMail.from.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('from');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'text'} formError{/if}" id="textDiv">\r
- <div class="formFieldLabel">\r
- <label for="text">{lang}wcf.acp.user.sendMail.text{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <textarea id="text" name="text" rows="15" cols="40">{$text}</textarea>\r
- {if $errorField == 'text'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="textHelpMessage">\r
- <p>{lang}wcf.acp.user.sendMail.text.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('text');\r
- //]]></script>\r
- \r
- <div class="formElement">\r
- <div class="formField">\r
- <label><input type="checkbox" name="enableHTML" id="enableHTML" value="1" {if $enableHTML == 1}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail.enableHTML{/lang}</label>\r
- </div>\r
- </div>\r
- </div>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- </fieldset>\r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- <input type="hidden" name="action" value="{@$action}" />\r
- {@SID_INPUT_TAG}\r
- <input type="hidden" name="userIDs" value="{@$userIDs}" />\r
- </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/emailL.png" alt="" />
+ <hgroup>
+ <h1>
+ {if $action == 'all'}
+ {lang}wcf.acp.user.sendMail.all{/lang}
+ {elseif $action == 'group'}
+ {lang}wcf.acp.user.sendMail.group{/lang}
+ {else}
+ {lang}wcf.acp.user.sendMail{/lang}
+ {/if}
+ </h1>
+ </hgroup>
+</header>
+
+{if $errorField}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+<div class="contentHeader">
+ <nav class="largeButtons">
+ <ul>
+ <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a></li>
+ <li><a href="index.php?form=UserSearch{@SID_ARG_2ND}" title="{lang}wcf.acp.user.search{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/searchM.png" alt="" /> <span>{lang}wcf.acp.user.search{/lang}</span></a></li>
+ {if $additionalLargeButtons|isset}{@$additionalLargeButtons}{/if}
+ </ul>
+ </nav>
+</div>
+
+<form method="post" action="index.php?form=UserMail">
+ <div class="border content">
+ <div class="container-1">
+ {if $action == ''}
+ <fieldset>
+ <legend>{lang}wcf.acp.user.sendMail.markedUsers{/lang}</legend>
+
+ <div>
+ {implode from=$users item=$user}<a href="index.php?form=UserEdit&userID={@$user->userID}{@SID_ARG_2ND}">{$user}</a>{/implode}
+ </div>
+ </fieldset>
+ {/if}
+ {if $action == 'group'}
+ <fieldset>
+ <legend>{lang}wcf.acp.user.sendMail.groups{/lang}</legend>
+
+ <div class="formGroup{if $errorField == 'groupIDs'} formError{/if}">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.acp.user.groups{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+
+ <div class="formField">
+ {htmlCheckboxes options=$groups name=groupIDs selected=$groupIDs}
+ </div>
+ </fieldset>
+ {if $errorField == 'groupIDs'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ </div>
+ </fieldset>
+ {/if}
+ <fieldset>
+ <legend>{lang}wcf.acp.user.sendMail.mail{/lang}</legend>
+
+ <div>
+ <div class="formElement{if $errorField == 'subject'} formError{/if}" id="subjectDiv">
+ <div class="formFieldLabel">
+ <label for="subject">{lang}wcf.acp.user.sendMail.subject{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="subject" name="subject" value="{$subject}" />
+ {if $errorField == 'subject'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="subjectHelpMessage">
+ <p>{lang}wcf.acp.user.sendMail.subject.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('subject');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'from'} formError{/if}" id="fromDiv">
+ <div class="formFieldLabel">
+ <label for="from">{lang}wcf.acp.user.sendMail.from{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="from" name="from" value="{$from}" />
+ {if $errorField == 'from'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="fromHelpMessage">
+ <p>{lang}wcf.acp.user.sendMail.from.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('from');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'text'} formError{/if}" id="textDiv">
+ <div class="formFieldLabel">
+ <label for="text">{lang}wcf.acp.user.sendMail.text{/lang}</label>
+ </div>
+ <div class="formField">
+ <textarea id="text" name="text" rows="15" cols="40">{$text}</textarea>
+ {if $errorField == 'text'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="textHelpMessage">
+ <p>{lang}wcf.acp.user.sendMail.text.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('text');
+ //]]></script>
+
+ <div class="formElement">
+ <div class="formField">
+ <label><input type="checkbox" name="enableHTML" id="enableHTML" value="1" {if $enableHTML == 1}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail.enableHTML{/lang}</label>
+ </div>
+ </div>
+ </div>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+ </fieldset>
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ <input type="hidden" name="action" value="{@$action}" />
+ {@SID_INPUT_TAG}
+ <input type="hidden" name="userIDs" value="{@$userIDs}" />
+ </div>
+</form>
+
+{include file='footer'}
-{include file='header'}\r
-\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/Suggestion.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- var tabMenu = new TabMenu();\r
- onloadEvents.push(function() {\r
- //tabMenu.showSubTabMenu('profile');\r
- tabMenu.showSubTabMenu('resultOptions');\r
- $('username').focus();\r
- });\r
- //]]>\r
-</script>\r
-\r
-<header class="mainHeading">\r
- <img src="{@RELATIVE_WCF_DIR}icon/userSearchL.png" alt="" />\r
- <hgroup>\r
- <h1>{lang}wcf.acp.user.search{/lang}</h1>\r
- </hgroup>\r
-</header>\r
-\r
-{if $errorField == 'search'}\r
-<p class="error">{lang}wcf.acp.user.search.error.noMatches{/lang}</p>\r
-{/if}\r
-\r
-{*if $deletedUsers}\r
- <p class="success">{lang}wcf.acp.user.delete.success{/lang}</p> \r
-{elseif $deletedUsers === 0}\r
- <p class="error">{lang}wcf.acp.user.delete.error{/lang}</p> \r
-{/if*}\r
-\r
-<div class="contentHeader">\r
- <nav class="largeButtons">\r
- <ul>\r
- {if $__wcf->session->getPermission('admin.user.canAddUser')}\r
- <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>\r
- {/if}\r
- <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a>\r
- </li>\r
- </ul>\r
- </nav>\r
-</div>\r
-\r
-<form method="post" action="index.php?form=UserSearch">\r
- <div class="border content">\r
- <div class="container-1">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.search.conditions.general{/lang}</legend>\r
- <div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="username">{lang}wcf.user.username{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="username" name="username" value="{$username}" />\r
- <script type="text/javascript">\r
- //<![CDATA[\r
- var suggestion = new Suggestion('username');\r
- suggestion.enableMultiple(false);\r
- //]]>\r
- </script>\r
- </div>\r
- </div>\r
- \r
- <div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="userID">{lang}wcf.user.userID{/lang}</label>\r
- </div>\r
- <div class="formField"> \r
- <input type="text" class="inputText" id="userID" name="userID" value="{$userID}" />\r
- </div>\r
- </div>\r
- \r
- {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}\r
- <div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="email">{lang}wcf.user.email{/lang}</label>\r
- </div>\r
- <div class="formField"> \r
- <input type="text" class="inputText" id="email" name="email" value="{$email}" />\r
- </div>\r
- </div>\r
- {/if}\r
- \r
- {if $availableGroups|count}\r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.acp.user.groups{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
- \r
- <div class="formField">\r
- {htmlCheckboxes options=$availableGroups name='groupIDs' selected=$groupIDs}\r
- \r
- <label style="margin-top: 10px"><input type="checkbox" name="invertGroupIDs" value="1" {if $invertGroupIDs == 1}checked="checked" {/if}/> {lang}wcf.acp.user.groups.invertSearch{/lang}</label>\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- {/if}\r
- \r
- {if $availableLanguages|count > 1}\r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.user.language{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.language{/lang}</legend>\r
- \r
- <div class="formField">\r
- {htmlCheckboxes options=$availableLanguages name='languageIDs' selected=$languageIDs disableEncoding=true}\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- {/if}\r
- </fieldset>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- \r
- <nav>\r
- <div class="tabMenu">\r
- <ul>\r
- {if $optionTree|count}<li id="profile"><a onclick="tabMenu.showSubTabMenu('profile');"><span>{lang}wcf.acp.user.search.conditions.profile{/lang}</span></a></li>{/if}\r
- {if $additionalTabs|isset}{@$additionalTabs}{/if}\r
- <li id="resultOptions"><a onclick="tabMenu.showSubTabMenu('resultOptions');"><span>{lang}wcf.acp.user.search.display{/lang}</span></a></li>\r
- </ul>\r
- </div>\r
- </nav>\r
- <div class="subTabMenu">\r
- <div class="containerHead"><div> </div></div>\r
- </div>\r
- \r
- {if $optionTree|count}\r
- <div class="border tabMenuContent hidden" id="profile-content">\r
- <div class="container-1">\r
- <h3 class="subHeading">{lang}wcf.acp.user.search.conditions.profile{/lang}</h3>\r
- {include file='optionFieldList' langPrefix='wcf.user.option.' options=$optionTree}\r
- </div>\r
- </div>\r
- {/if}\r
- \r
- {if $additionalTabContents|isset}{@$additionalTabContents}{/if}\r
- \r
- <div class="border tabMenuContent hidden" id="resultOptions-content">\r
- <div class="container-1">\r
- <h3 class="subHeading">{lang}wcf.acp.user.search.display{/lang}</h3>\r
- \r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.search.display.general{/lang}</legend>\r
- \r
- <div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="sortField">{lang}wcf.acp.user.search.display.sort{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <select name="sortField" id="sortField">\r
- <option value="userID"{if $sortField == 'userID'} selected="selected"{/if}>{lang}wcf.user.userID{/lang}</option>\r
- <option value="username"{if $sortField == 'username'} selected="selected"{/if}>{lang}wcf.user.username{/lang}</option>\r
- <option value="email"{if $sortField == 'email'} selected="selected"{/if}>{lang}wcf.user.email{/lang}</option>\r
- <option value="registrationDate"{if $sortField == 'registrationDate'} selected="selected"{/if}>{lang}wcf.user.registrationDate{/lang}</option>\r
- \r
- {if $additionalSortFields|isset}{@$additionalSortFields}{/if}\r
- </select>\r
- <select name="sortOrder" id="sortOrder">\r
- <option value="ASC"{if $sortOrder == 'ASC'} selected="selected"{/if}>{lang}wcf.global.sortOrder.ascending{/lang}</option>\r
- <option value="DESC"{if $sortOrder == 'DESC'} selected="selected"{/if}>{lang}wcf.global.sortOrder.descending{/lang}</option>\r
- </select>\r
- </div>\r
- </div>\r
- \r
- <div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="itemsPerPage">{lang}wcf.acp.user.search.display.itemsPerPage{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="itemsPerPage" name="itemsPerPage" value="{@$itemsPerPage}" />\r
- </div>\r
- </div>\r
- </fieldset>\r
- \r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.search.display.columns{/lang}</legend>\r
- \r
- {if $optionTree|count}\r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.acp.user.search.display.columns.profile{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.search.display.columns.profile{/lang}</legend>\r
- \r
- <div class="formField">\r
- {foreach from=$optionTree item=option}\r
- <label><input type="checkbox" name="columns[]" value="{$option->optionName}" {if $option->optionName|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.option.{$option->optionName}{/lang}</label>\r
- {/foreach}\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- {/if}\r
- \r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.acp.user.search.display.columns.other{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.search.display.columns.other{/lang}</legend>\r
- \r
- <div class="formField">\r
- <label><input type="checkbox" name="columns[]" value="email" {if "email"|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.email{/lang}</label>\r
- <label><input type="checkbox" name="columns[]" value="registrationDate" {if "registrationDate"|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.registrationDate{/lang}</label>\r
- \r
- {if $additionalColumns|isset}{@$additionalColumns}{/if}\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- \r
- \r
- </fieldset>\r
- </div>\r
- </div>\r
- \r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- {@SID_INPUT_TAG}\r
- </div>\r
-</form>\r
-\r
-{include file='footer'}\r
+{include file='header'}
+
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/Suggestion.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>
+<script type="text/javascript">
+ //<![CDATA[
+ var tabMenu = new TabMenu();
+ onloadEvents.push(function() {
+ //tabMenu.showSubTabMenu('profile');
+ tabMenu.showSubTabMenu('resultOptions');
+ $('username').focus();
+ });
+ //]]>
+</script>
+
+<header class="mainHeading">
+ <img src="{@RELATIVE_WCF_DIR}icon/userSearchL.png" alt="" />
+ <hgroup>
+ <h1>{lang}wcf.acp.user.search{/lang}</h1>
+ </hgroup>
+</header>
+
+{if $errorField == 'search'}
+<p class="error">{lang}wcf.acp.user.search.error.noMatches{/lang}</p>
+{/if}
+
+{*if $deletedUsers}
+ <p class="success">{lang}wcf.acp.user.delete.success{/lang}</p>
+{elseif $deletedUsers === 0}
+ <p class="error">{lang}wcf.acp.user.delete.error{/lang}</p>
+{/if*}
+
+<div class="contentHeader">
+ <nav class="largeButtons">
+ <ul>
+ {if $__wcf->session->getPermission('admin.user.canAddUser')}
+ <li><a href="index.php?form=UserAdd{@SID_ARG_2ND}" title="{lang}wcf.acp.user.add{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/userAddM.png" alt="" /> <span>{lang}wcf.acp.user.add{/lang}</span></a></li>
+ {/if}
+ <li><a href="index.php?page=UserList{@SID_ARG_2ND}" title="{lang}wcf.acp.menu.link.user.list{/lang}"><img src="{@RELATIVE_WCF_DIR}icon/usersM.png" alt="" /> <span>{lang}wcf.acp.menu.link.user.list{/lang}</span></a>
+ </li>
+ </ul>
+ </nav>
+</div>
+
+<form method="post" action="index.php?form=UserSearch">
+ <div class="border content">
+ <div class="container-1">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.search.conditions.general{/lang}</legend>
+ <div class="formElement">
+ <div class="formFieldLabel">
+ <label for="username">{lang}wcf.user.username{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="username" name="username" value="{$username}" />
+ <script type="text/javascript">
+ //<![CDATA[
+ var suggestion = new Suggestion('username');
+ suggestion.enableMultiple(false);
+ //]]>
+ </script>
+ </div>
+ </div>
+
+ <div class="formElement">
+ <div class="formFieldLabel">
+ <label for="userID">{lang}wcf.user.userID{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="userID" name="userID" value="{$userID}" />
+ </div>
+ </div>
+
+ {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}
+ <div class="formElement">
+ <div class="formFieldLabel">
+ <label for="email">{lang}wcf.user.email{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="email" name="email" value="{$email}" />
+ </div>
+ </div>
+ {/if}
+
+ {if $availableGroups|count}
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.acp.user.groups{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+
+ <div class="formField">
+ {htmlCheckboxes options=$availableGroups name='groupIDs' selected=$groupIDs}
+
+ <label style="margin-top: 10px"><input type="checkbox" name="invertGroupIDs" value="1" {if $invertGroupIDs == 1}checked="checked" {/if}/> {lang}wcf.acp.user.groups.invertSearch{/lang}</label>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ {/if}
+
+ {if $availableLanguages|count > 1}
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.user.language{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.language{/lang}</legend>
+
+ <div class="formField">
+ {htmlCheckboxes options=$availableLanguages name='languageIDs' selected=$languageIDs disableEncoding=true}
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ {/if}
+ </fieldset>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+
+ <nav>
+ <div class="tabMenu">
+ <ul>
+ {if $optionTree|count}<li id="profile"><a onclick="tabMenu.showSubTabMenu('profile');"><span>{lang}wcf.acp.user.search.conditions.profile{/lang}</span></a></li>{/if}
+ {if $additionalTabs|isset}{@$additionalTabs}{/if}
+ <li id="resultOptions"><a onclick="tabMenu.showSubTabMenu('resultOptions');"><span>{lang}wcf.acp.user.search.display{/lang}</span></a></li>
+ </ul>
+ </div>
+ </nav>
+ <div class="subTabMenu">
+ <div class="containerHead"><div> </div></div>
+ </div>
+
+ {if $optionTree|count}
+ <div class="border tabMenuContent hidden" id="profile-content">
+ <div class="container-1">
+ <h3 class="subHeading">{lang}wcf.acp.user.search.conditions.profile{/lang}</h3>
+ {include file='optionFieldList' langPrefix='wcf.user.option.' options=$optionTree}
+ </div>
+ </div>
+ {/if}
+
+ {if $additionalTabContents|isset}{@$additionalTabContents}{/if}
+
+ <div class="border tabMenuContent hidden" id="resultOptions-content">
+ <div class="container-1">
+ <h3 class="subHeading">{lang}wcf.acp.user.search.display{/lang}</h3>
+
+ <fieldset>
+ <legend>{lang}wcf.acp.user.search.display.general{/lang}</legend>
+
+ <div class="formElement">
+ <div class="formFieldLabel">
+ <label for="sortField">{lang}wcf.acp.user.search.display.sort{/lang}</label>
+ </div>
+ <div class="formField">
+ <select name="sortField" id="sortField">
+ <option value="userID"{if $sortField == 'userID'} selected="selected"{/if}>{lang}wcf.user.userID{/lang}</option>
+ <option value="username"{if $sortField == 'username'} selected="selected"{/if}>{lang}wcf.user.username{/lang}</option>
+ <option value="email"{if $sortField == 'email'} selected="selected"{/if}>{lang}wcf.user.email{/lang}</option>
+ <option value="registrationDate"{if $sortField == 'registrationDate'} selected="selected"{/if}>{lang}wcf.user.registrationDate{/lang}</option>
+
+ {if $additionalSortFields|isset}{@$additionalSortFields}{/if}
+ </select>
+ <select name="sortOrder" id="sortOrder">
+ <option value="ASC"{if $sortOrder == 'ASC'} selected="selected"{/if}>{lang}wcf.global.sortOrder.ascending{/lang}</option>
+ <option value="DESC"{if $sortOrder == 'DESC'} selected="selected"{/if}>{lang}wcf.global.sortOrder.descending{/lang}</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="formElement">
+ <div class="formFieldLabel">
+ <label for="itemsPerPage">{lang}wcf.acp.user.search.display.itemsPerPage{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="itemsPerPage" name="itemsPerPage" value="{@$itemsPerPage}" />
+ </div>
+ </div>
+ </fieldset>
+
+ <fieldset>
+ <legend>{lang}wcf.acp.user.search.display.columns{/lang}</legend>
+
+ {if $optionTree|count}
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.acp.user.search.display.columns.profile{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.search.display.columns.profile{/lang}</legend>
+
+ <div class="formField">
+ {foreach from=$optionTree item=option}
+ <label><input type="checkbox" name="columns[]" value="{$option->optionName}" {if $option->optionName|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.option.{$option->optionName}{/lang}</label>
+ {/foreach}
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ {/if}
+
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.acp.user.search.display.columns.other{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.search.display.columns.other{/lang}</legend>
+
+ <div class="formField">
+ <label><input type="checkbox" name="columns[]" value="email" {if "email"|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.email{/lang}</label>
+ <label><input type="checkbox" name="columns[]" value="registrationDate" {if "registrationDate"|in_array:$columns}checked="checked" {/if}/> {lang}wcf.user.registrationDate{/lang}</label>
+
+ {if $additionalColumns|isset}{@$additionalColumns}{/if}
+ </div>
+ </fieldset>
+ </div>
+ </div>
+
+
+ </fieldset>
+ </div>
+ </div>
+
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ {@SID_INPUT_TAG}
+ </div>
+</form>
+
+{include file='footer'}
-{include file='header'}\r
-\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/Suggestion.class.js"></script>\r
-<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>\r
-<script type="text/javascript">\r
- //<![CDATA[\r
+{include file='header'}
+
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/Suggestion.class.js"></script>
+<script type="text/javascript" src="{@RELATIVE_WCF_DIR}js/TabMenu.class.js"></script>
+<script type="text/javascript">
+ //<![CDATA[
// disable
function disableAll() {
{foreach from=$availableActions item=availableAction}
disableAll();
}
- var tabMenu = new TabMenu();\r
+ var tabMenu = new TabMenu();
onloadEvents.push(function() {
tabMenu.showSubTabMenu('profile')
{if $action != ''}enable{@$action|ucfirst}();{else}disableAll();{/if}
break;
}
}
- onloadEvents.push(function() { setFileType('{@$fileType}'); });\r
- //]]>\r
-</script>\r
-\r
-<div class="mainHeadline">\r
- <img src="{@RELATIVE_WCF_DIR}icon/usersMassProcessingL.png" alt="" />\r
- <div class="headlineContainer">\r
- <h2>{lang}wcf.acp.user.massProcessing{/lang}</h2>\r
- </div>\r
-</div>\r
-\r
-{if $errorField}\r
- <p class="error">{lang}wcf.global.form.error{/lang}</p>\r
-{/if}\r
-\r
-{if $affectedUsers|isset}\r
- <p class="success">{lang}wcf.acp.user.massProcessing.success{/lang}</p> \r
-{/if}\r
-\r
-<p class="warning">{lang}wcf.acp.user.massProcessing.warning{/lang}</p>\r
-\r
-<form method="post" action="index.php?form=UsersMassProcessing">\r
- <div class="border content">\r
- <div class="container-1">\r
- <h3 class="subHeadline">{lang}wcf.acp.user.massProcessing.conditions{/lang}</h3>\r
- \r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.search.conditions.general{/lang}</legend>\r
- \r
- <div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="username">{lang}wcf.user.username{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="username" name="username" value="{$username}" />\r
- <script type="text/javascript">\r
- //<![CDATA[\r
- suggestion.enableMultiple(false);\r
- suggestion.init('username');\r
- //]]>\r
- </script>\r
- </div>\r
- </div>\r
- \r
- {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}\r
- <div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="email">{lang}wcf.user.email{/lang}</label>\r
- </div>\r
- <div class="formField"> \r
- <input type="text" class="inputText" id="email" name="email" value="{$email}" />\r
- </div>\r
- </div>\r
- {/if}\r
- \r
- {if $availableGroups|count}\r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.acp.user.groups{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
- \r
- <div class="formField">\r
- {htmlCheckboxes options=$availableGroups name='groupIDArray' selected=$groupIDArray}\r
- \r
- <label style="margin-top: 10px"><input type="checkbox" name="invertGroupIDs" value="1" {if $invertGroupIDs == 1}checked="checked" {/if}/> {lang}wcf.acp.user.groups.invertSearch{/lang}</label>\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- {/if}\r
- \r
- {if $availableLanguages|count > 1}\r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.user.language{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.language{/lang}</legend>\r
- \r
- <div class="formField">\r
- {htmlCheckboxes options=$availableLanguages name='languageIDArray' selected=$languageIDArray disableEncoding=true}\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- {/if}\r
- </fieldset>\r
- \r
- {if $additionalFields|isset}{@$additionalFields}{/if}\r
- \r
- <div class="tabMenu">\r
- <ul>\r
- {if $options|count}<li id="profile"><a onclick="tabMenu.showSubTabMenu('profile');"><span>{lang}wcf.acp.user.search.conditions.profile{/lang}</span></a></li>{/if}\r
- {if $additionalTabs|isset}{@$additionalTabs}{/if}\r
- </ul>\r
- </div>\r
- <div class="subTabMenu">\r
- <div class="containerHead"><div> </div></div>\r
- </div>\r
- \r
- {if $options|count}\r
- <div class="border tabMenuContent hidden" id="profile-content">\r
- <div class="container-1">\r
- <h3 class="subHeadline">{lang}wcf.acp.user.search.conditions.profile{/lang}</h3>\r
- {include file='optionFieldList' langPrefix='wcf.user.option.'}\r
- </div>\r
- </div>\r
- {/if}\r
- \r
+ onloadEvents.push(function() { setFileType('{@$fileType}'); });
+ //]]>
+</script>
+
+<div class="mainHeadline">
+ <img src="{@RELATIVE_WCF_DIR}icon/usersMassProcessingL.png" alt="" />
+ <div class="headlineContainer">
+ <h2>{lang}wcf.acp.user.massProcessing{/lang}</h2>
+ </div>
+</div>
+
+{if $errorField}
+ <p class="error">{lang}wcf.global.form.error{/lang}</p>
+{/if}
+
+{if $affectedUsers|isset}
+ <p class="success">{lang}wcf.acp.user.massProcessing.success{/lang}</p>
+{/if}
+
+<p class="warning">{lang}wcf.acp.user.massProcessing.warning{/lang}</p>
+
+<form method="post" action="index.php?form=UsersMassProcessing">
+ <div class="border content">
+ <div class="container-1">
+ <h3 class="subHeadline">{lang}wcf.acp.user.massProcessing.conditions{/lang}</h3>
+
+ <fieldset>
+ <legend>{lang}wcf.acp.user.search.conditions.general{/lang}</legend>
+
+ <div class="formElement">
+ <div class="formFieldLabel">
+ <label for="username">{lang}wcf.user.username{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="username" name="username" value="{$username}" />
+ <script type="text/javascript">
+ //<![CDATA[
+ suggestion.enableMultiple(false);
+ suggestion.init('username');
+ //]]>
+ </script>
+ </div>
+ </div>
+
+ {if $__wcf->session->getPermission('admin.user.canEditMailAddress')}
+ <div class="formElement">
+ <div class="formFieldLabel">
+ <label for="email">{lang}wcf.user.email{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="email" name="email" value="{$email}" />
+ </div>
+ </div>
+ {/if}
+
+ {if $availableGroups|count}
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.acp.user.groups{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+
+ <div class="formField">
+ {htmlCheckboxes options=$availableGroups name='groupIDArray' selected=$groupIDArray}
+
+ <label style="margin-top: 10px"><input type="checkbox" name="invertGroupIDs" value="1" {if $invertGroupIDs == 1}checked="checked" {/if}/> {lang}wcf.acp.user.groups.invertSearch{/lang}</label>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ {/if}
+
+ {if $availableLanguages|count > 1}
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.user.language{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.language{/lang}</legend>
+
+ <div class="formField">
+ {htmlCheckboxes options=$availableLanguages name='languageIDArray' selected=$languageIDArray disableEncoding=true}
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ {/if}
+ </fieldset>
+
+ {if $additionalFields|isset}{@$additionalFields}{/if}
+
+ <div class="tabMenu">
+ <ul>
+ {if $options|count}<li id="profile"><a onclick="tabMenu.showSubTabMenu('profile');"><span>{lang}wcf.acp.user.search.conditions.profile{/lang}</span></a></li>{/if}
+ {if $additionalTabs|isset}{@$additionalTabs}{/if}
+ </ul>
+ </div>
+ <div class="subTabMenu">
+ <div class="containerHead"><div> </div></div>
+ </div>
+
+ {if $options|count}
+ <div class="border tabMenuContent hidden" id="profile-content">
+ <div class="container-1">
+ <h3 class="subHeadline">{lang}wcf.acp.user.search.conditions.profile{/lang}</h3>
+ {include file='optionFieldList' langPrefix='wcf.user.option.'}
+ </div>
+ </div>
+ {/if}
+
{if $additionalTabContents|isset}{@$additionalTabContents}{/if}
</div>
- </div>\r
- <div class="border content">\r
- <div class="container-1">\r
- <h3 class="subHeadline">{lang}wcf.acp.user.massProcessing.action{/lang}</h3>\r
- \r
- <div class="formGroup{if $errorField == 'action'} formError{/if}">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.acp.user.massProcessing.action{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.massProcessing.action{/lang}</legend>\r
- <div class="formField">\r
- <ul class="formOptionsLong">\r
- {if $__wcf->session->getPermission('admin.user.canMailUser')}\r
- <li><label><input onclick="if (IS_SAFARI) enableSendMail()" onfocus="enableSendMail()" type="radio" name="action" value="sendMail" {if $action == 'sendMail'}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail{/lang}</label></li>\r
- <li><label><input onclick="if (IS_SAFARI) enableExportMailAddress()" onfocus="enableExportMailAddress()" type="radio" name="action" value="exportMailAddress" {if $action == 'exportMailAddress'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress{/lang}</label></li>\r
- {/if}\r
- {if $__wcf->session->getPermission('admin.user.canEditUser')}\r
- <li><label><input onclick="if (IS_SAFARI) enableAssignToGroup()" onfocus="enableAssignToGroup()" type="radio" name="action" value="assignToGroup" {if $action == 'assignToGroup'}checked="checked" {/if}/> {lang}wcf.acp.user.assignToGroup{/lang}</label></li>\r
- {/if}\r
- {if $__wcf->session->getPermission('admin.user.canDeleteUser')}\r
- <li><label><input onclick="if (IS_SAFARI) enableDelete()" onfocus="enableDelete()" type="radio" name="action" value="delete" {if $action == 'delete'}checked="checked" {/if}/> {lang}wcf.acp.user.delete{/lang}</label></li>\r
- {/if}\r
- {if $additionalActions|isset}{@$additionalActions}{/if}\r
- </ul>\r
- </div>\r
- {if $errorField == 'action'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </fieldset>\r
- </div>\r
- </div>\r
- \r
- <div id="sendMailDiv">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.sendMail.mail{/lang}</legend>\r
- \r
- <div>\r
- <div class="formElement{if $errorField == 'subject'} formError{/if}" id="subjectDiv">\r
- <div class="formFieldLabel">\r
- <label for="subject">{lang}wcf.acp.user.sendMail.subject{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="subject" name="subject" value="{$subject}" />\r
- {if $errorField == 'subject'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="subjectHelpMessage">\r
- <p>{lang}wcf.acp.user.sendMail.subject.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('subject');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'from'} formError{/if}" id="fromDiv">\r
- <div class="formFieldLabel">\r
- <label for="from">{lang}wcf.acp.user.sendMail.from{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="from" name="from" value="{$from}" />\r
- {if $errorField == 'from'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="fromHelpMessage">\r
- {lang}wcf.acp.user.sendMail.from.description{/lang}\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('from');\r
- //]]></script>\r
- \r
- <div class="formElement{if $errorField == 'text'} formError{/if}" id="textDiv">\r
- <div class="formFieldLabel">\r
- <label for="text">{lang}wcf.acp.user.sendMail.text{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <textarea id="text" name="text" rows="15" cols="40">{$text}</textarea>\r
- {if $errorField == 'text'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- <div class="formFieldDesc hidden" id="textHelpMessage">\r
- <p>{lang}wcf.acp.user.sendMail.text.description{/lang}</p>\r
- </div>\r
- </div>\r
- <script type="text/javascript">//<![CDATA[\r
- inlineHelp.register('text');\r
- //]]></script>\r
- \r
- <div class="formElement">\r
- <div class="formField">\r
- <label><input type="checkbox" name="enableHTML" id="enableHTML" value="1" {if $enableHTML == 1}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail.enableHTML{/lang}</label>\r
- </div>\r
- </div>\r
- </div>\r
- </fieldset>\r
- </div>\r
- \r
- <div id="exportMailAddressDiv">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.exportEmailAddress.format{/lang}</legend>\r
- \r
- <div>\r
- <div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</legend>\r
- \r
- <div class="formField">\r
- <ul class="formOptionsLong">\r
- <li><label><input onclick="if (IS_SAFARI) setFileType('csv')" onfocus="setFileType('csv')" type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label></li>\r
- <li><label><input onclick="if (IS_SAFARI) setFileType('xml')" onfocus="setFileType('xml')" type="radio" name="fileType" value="xml" {if $fileType == 'xml'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label></li>\r
- </ul>\r
- </div>\r
- </fieldset>\r
- </div>\r
- </div>\r
- \r
- <div class="formElement" id="separatorDiv">\r
- <div class="formFieldLabel">\r
- <label for="separator">{lang}wcf.acp.user.exportEmailAddress.separator{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <textarea id="separator" name="separator" rows="2" cols="40">{$separator}</textarea>\r
- </div>\r
- </div>\r
- \r
- <div class="formElement" id="textSeparatorDiv">\r
- <div class="formFieldLabel">\r
- <label for="textSeparator">{lang}wcf.acp.user.exportEmailAddress.textSeparator{/lang}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" class="inputText" id="textSeparator" name="textSeparator" value="{$textSeparator}" />\r
- </div>\r
- </div>\r
- </div>\r
- </fieldset>\r
- </div>\r
- \r
- <div id="assignToGroupDiv">\r
- <fieldset>\r
- <legend>{lang}wcf.acp.user.groups{/lang}</legend>\r
- \r
- <div>\r
- <div class="formField{if $errorField == 'assignToGroupIDArray'} formError{/if}">\r
- {htmlCheckboxes options=$availableGroups name=assignToGroupIDArray selected=$assignToGroupIDArray}\r
- {if $errorField == 'assignToGroupIDArray'}\r
- <p class="innerError">\r
- {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- </div>\r
- </fieldset>\r
- </div>\r
+ </div>
+ <div class="border content">
+ <div class="container-1">
+ <h3 class="subHeadline">{lang}wcf.acp.user.massProcessing.action{/lang}</h3>
+
+ <div class="formGroup{if $errorField == 'action'} formError{/if}">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.acp.user.massProcessing.action{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.massProcessing.action{/lang}</legend>
+ <div class="formField">
+ <ul class="formOptionsLong">
+ {if $__wcf->session->getPermission('admin.user.canMailUser')}
+ <li><label><input onclick="if (IS_SAFARI) enableSendMail()" onfocus="enableSendMail()" type="radio" name="action" value="sendMail" {if $action == 'sendMail'}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail{/lang}</label></li>
+ <li><label><input onclick="if (IS_SAFARI) enableExportMailAddress()" onfocus="enableExportMailAddress()" type="radio" name="action" value="exportMailAddress" {if $action == 'exportMailAddress'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress{/lang}</label></li>
+ {/if}
+ {if $__wcf->session->getPermission('admin.user.canEditUser')}
+ <li><label><input onclick="if (IS_SAFARI) enableAssignToGroup()" onfocus="enableAssignToGroup()" type="radio" name="action" value="assignToGroup" {if $action == 'assignToGroup'}checked="checked" {/if}/> {lang}wcf.acp.user.assignToGroup{/lang}</label></li>
+ {/if}
+ {if $__wcf->session->getPermission('admin.user.canDeleteUser')}
+ <li><label><input onclick="if (IS_SAFARI) enableDelete()" onfocus="enableDelete()" type="radio" name="action" value="delete" {if $action == 'delete'}checked="checked" {/if}/> {lang}wcf.acp.user.delete{/lang}</label></li>
+ {/if}
+ {if $additionalActions|isset}{@$additionalActions}{/if}
+ </ul>
+ </div>
+ {if $errorField == 'action'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </fieldset>
+ </div>
+ </div>
+
+ <div id="sendMailDiv">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.sendMail.mail{/lang}</legend>
+
+ <div>
+ <div class="formElement{if $errorField == 'subject'} formError{/if}" id="subjectDiv">
+ <div class="formFieldLabel">
+ <label for="subject">{lang}wcf.acp.user.sendMail.subject{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="subject" name="subject" value="{$subject}" />
+ {if $errorField == 'subject'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="subjectHelpMessage">
+ <p>{lang}wcf.acp.user.sendMail.subject.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('subject');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'from'} formError{/if}" id="fromDiv">
+ <div class="formFieldLabel">
+ <label for="from">{lang}wcf.acp.user.sendMail.from{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="from" name="from" value="{$from}" />
+ {if $errorField == 'from'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="fromHelpMessage">
+ {lang}wcf.acp.user.sendMail.from.description{/lang}
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('from');
+ //]]></script>
+
+ <div class="formElement{if $errorField == 'text'} formError{/if}" id="textDiv">
+ <div class="formFieldLabel">
+ <label for="text">{lang}wcf.acp.user.sendMail.text{/lang}</label>
+ </div>
+ <div class="formField">
+ <textarea id="text" name="text" rows="15" cols="40">{$text}</textarea>
+ {if $errorField == 'text'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ <div class="formFieldDesc hidden" id="textHelpMessage">
+ <p>{lang}wcf.acp.user.sendMail.text.description{/lang}</p>
+ </div>
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ inlineHelp.register('text');
+ //]]></script>
+
+ <div class="formElement">
+ <div class="formField">
+ <label><input type="checkbox" name="enableHTML" id="enableHTML" value="1" {if $enableHTML == 1}checked="checked" {/if}/> {lang}wcf.acp.user.sendMail.enableHTML{/lang}</label>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
- {if $additionalActionSettings|isset}{@$additionalActionSettings}{/if}\r
- </div>\r
- </div>\r
- \r
- <div class="formSubmit">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />\r
- <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />\r
- {@SID_INPUT_TAG}\r
- </div>\r
-</form>\r
-\r
+ <div id="exportMailAddressDiv">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.exportEmailAddress.format{/lang}</legend>
+
+ <div>
+ <div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.exportEmailAddress.fileType{/lang}</legend>
+
+ <div class="formField">
+ <ul class="formOptionsLong">
+ <li><label><input onclick="if (IS_SAFARI) setFileType('csv')" onfocus="setFileType('csv')" type="radio" name="fileType" value="csv" {if $fileType == 'csv'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.csv{/lang}</label></li>
+ <li><label><input onclick="if (IS_SAFARI) setFileType('xml')" onfocus="setFileType('xml')" type="radio" name="fileType" value="xml" {if $fileType == 'xml'}checked="checked" {/if}/> {lang}wcf.acp.user.exportEmailAddress.fileType.xml{/lang}</label></li>
+ </ul>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+
+ <div class="formElement" id="separatorDiv">
+ <div class="formFieldLabel">
+ <label for="separator">{lang}wcf.acp.user.exportEmailAddress.separator{/lang}</label>
+ </div>
+ <div class="formField">
+ <textarea id="separator" name="separator" rows="2" cols="40">{$separator}</textarea>
+ </div>
+ </div>
+
+ <div class="formElement" id="textSeparatorDiv">
+ <div class="formFieldLabel">
+ <label for="textSeparator">{lang}wcf.acp.user.exportEmailAddress.textSeparator{/lang}</label>
+ </div>
+ <div class="formField">
+ <input type="text" class="inputText" id="textSeparator" name="textSeparator" value="{$textSeparator}" />
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
+
+ <div id="assignToGroupDiv">
+ <fieldset>
+ <legend>{lang}wcf.acp.user.groups{/lang}</legend>
+
+ <div>
+ <div class="formField{if $errorField == 'assignToGroupIDArray'} formError{/if}">
+ {htmlCheckboxes options=$availableGroups name=assignToGroupIDArray selected=$assignToGroupIDArray}
+ {if $errorField == 'assignToGroupIDArray'}
+ <p class="innerError">
+ {if $errorType == 'empty'}{lang}wcf.global.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+ </div>
+ </fieldset>
+ </div>
+
+ {if $additionalActionSettings|isset}{@$additionalActionSettings}{/if}
+ </div>
+ </div>
+
+ <div class="formSubmit">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.submit{/lang}" />
+ <input type="reset" accesskey="r" value="{lang}wcf.global.button.reset{/lang}" />
+ {@SID_INPUT_TAG}
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{if !$progress|isset}{assign var="progress" value=0}{/if}\r
-{assign var="actionTitle" value=$pageTitle}\r
-{capture assign="pageTitle"}{lang}wcf.acp.worker.progressBar{/lang} - {@$pageTitle}{/capture}\r
-{include file='setupHeader'}\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- function showWindow(show) {\r
- if (show) {\r
- document.getElementById('iframe').style.visibility = 'visible';\r
- window.focus();\r
- } else {\r
- xHeight('iframe', 0);\r
- document.getElementById('iframe').style.visibility = 'hidden';\r
- }\r
- }\r
- \r
- function setCurrentStep(title) {\r
- document.getElementById('currentStep').innerHTML = title;\r
- }\r
- \r
- function setProgress(progress) {\r
- document.getElementById('progressBar').style.width = Math.round(300 * progress / 100) + 'px';\r
- {literal}\r
- document.getElementById('progressText').innerHTML = document.getElementById('progressText').innerHTML.replace(/\d{1,3}%/, progress + '%');\r
- document.title = document.title.replace(/\d{1,3}%/, progress + '%');\r
- {/literal}\r
- }\r
- \r
- onloadEvents.push(function() {\r
- document.getElementById('workerIcon').onclick = function(event) {\r
- if (!event) event = window.event;\r
- \r
- if (event.altKey) {\r
- showWindow(true);\r
- if (!xHeight('iframe')) {\r
- xHeight('iframe', 300);\r
- }\r
- }\r
- }\r
- });\r
- //]]>\r
-</script>\r
-\r
-<img id="workerIcon" class="icon" src="{@RELATIVE_WCF_DIR}icon/workerXL.png" alt="" />\r
-\r
-<h1><b>{lang}wcf.global.pageTitle{/lang}</b><br />{@$actionTitle}</h1>\r
-\r
-<div class="progress">\r
- <div id="progressBar" class="progressBar" style="width: {@300*$progress/100|round:0}px"></div>\r
- <div id="progressText" class="progressText">{lang}wcf.acp.worker.progressBar{/lang}</div>\r
-</div>\r
-\r
-<hr />\r
-\r
-<h2>{lang}wcf.acp.worker.title{/lang}</h2>\r
-\r
-<p>{lang}wcf.acp.worker.description{/lang}</p>\r
-\r
-<fieldset>\r
- <legend>{lang}wcf.acp.worker.currentStep{/lang}</legend>\r
- \r
- <div class="inner">\r
- <div><span id="currentStep"></span></div>\r
- \r
- <iframe id="iframe" frameborder="0" src="{$url}"></iframe>\r
- </div>\r
-</fieldset>\r
-\r
+{if !$progress|isset}{assign var="progress" value=0}{/if}
+{assign var="actionTitle" value=$pageTitle}
+{capture assign="pageTitle"}{lang}wcf.acp.worker.progressBar{/lang} - {@$pageTitle}{/capture}
+{include file='setupHeader'}
+
+<script type="text/javascript">
+ //<![CDATA[
+ function showWindow(show) {
+ if (show) {
+ document.getElementById('iframe').style.visibility = 'visible';
+ window.focus();
+ } else {
+ xHeight('iframe', 0);
+ document.getElementById('iframe').style.visibility = 'hidden';
+ }
+ }
+
+ function setCurrentStep(title) {
+ document.getElementById('currentStep').innerHTML = title;
+ }
+
+ function setProgress(progress) {
+ document.getElementById('progressBar').style.width = Math.round(300 * progress / 100) + 'px';
+ {literal}
+ document.getElementById('progressText').innerHTML = document.getElementById('progressText').innerHTML.replace(/\d{1,3}%/, progress + '%');
+ document.title = document.title.replace(/\d{1,3}%/, progress + '%');
+ {/literal}
+ }
+
+ onloadEvents.push(function() {
+ document.getElementById('workerIcon').onclick = function(event) {
+ if (!event) event = window.event;
+
+ if (event.altKey) {
+ showWindow(true);
+ if (!xHeight('iframe')) {
+ xHeight('iframe', 300);
+ }
+ }
+ }
+ });
+ //]]>
+</script>
+
+<img id="workerIcon" class="icon" src="{@RELATIVE_WCF_DIR}icon/workerXL.png" alt="" />
+
+<h1><b>{lang}wcf.global.pageTitle{/lang}</b><br />{@$actionTitle}</h1>
+
+<div class="progress">
+ <div id="progressBar" class="progressBar" style="width: {@300*$progress/100|round:0}px"></div>
+ <div id="progressText" class="progressText">{lang}wcf.acp.worker.progressBar{/lang}</div>
+</div>
+
+<hr />
+
+<h2>{lang}wcf.acp.worker.title{/lang}</h2>
+
+<p>{lang}wcf.acp.worker.description{/lang}</p>
+
+<fieldset>
+ <legend>{lang}wcf.acp.worker.currentStep{/lang}</legend>
+
+ <div class="inner">
+ <div><span id="currentStep"></span></div>
+
+ <iframe id="iframe" frameborder="0" src="{$url}"></iframe>
+ </div>
+</fieldset>
+
{include file='setupFooter'}
\ No newline at end of file
-{include file='setupWindowHeader'}\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- window.onload = function() {\r
- changeHeight(); \r
-};\r
- parent.showWindow(true);\r
- //]]>\r
-</script>\r
-\r
-{$e->show()}\r
-\r
+{include file='setupWindowHeader'}
+
+<script type="text/javascript">
+ //<![CDATA[
+ window.onload = function() {
+ changeHeight();
+};
+ parent.showWindow(true);
+ //]]>
+</script>
+
+{$e->show()}
+
{include file='setupWindowFooter'}
\ No newline at end of file
-{include file='setupWindowHeader'}\r
-\r
-<div class="nextButton">\r
- <input type="button" value="{lang}wcf.global.button.next{/lang}" onclick="parent.location.href='{if $url|isset}{$url}{else}index.php{@SID_ARG_1ST}{/if}'; parent.stopAnimating();" />\r
-</div>\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- window.onload = function() {\r
- changeHeight(); \r
-};\r
- parent.setProgress(100);\r
- parent.showWindow(true);\r
- parent.setCurrentStep('{@$stepTitle}');\r
- //]]>\r
-</script>\r
-\r
-{if $message|isset}\r
- {@$message}\r
-{/if}\r
-\r
-{include file='setupWindowFooter'}\r
-\r
+{include file='setupWindowHeader'}
+
+<div class="nextButton">
+ <input type="button" value="{lang}wcf.global.button.next{/lang}" onclick="parent.location.href='{if $url|isset}{$url}{else}index.php{@SID_ARG_1ST}{/if}'; parent.stopAnimating();" />
+</div>
+
+<script type="text/javascript">
+ //<![CDATA[
+ window.onload = function() {
+ changeHeight();
+};
+ parent.setProgress(100);
+ parent.showWindow(true);
+ parent.setCurrentStep('{@$stepTitle}');
+ //]]>
+</script>
+
+{if $message|isset}
+ {@$message}
+{/if}
+
+{include file='setupWindowFooter'}
+
-{include file='setupWindowHeader'}\r
-\r
-<h2>Step: {@$stepTitle}</h2>\r
-\r
-<form method="post" action="{$url}">\r
- <input type="submit" value="Go" onclick="parent.stopAnimating()" />\r
-</form>\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- {if $progress|isset}parent.setProgress({@$progress});{/if}\r
- parent.showWindow(false);\r
- parent.setCurrentStep('{@$stepTitle}');\r
- \r
- window.onload = function() {\r
- document.forms[0].submit();\r
- }\r
- //]]>\r
-</script>\r
-\r
+{include file='setupWindowHeader'}
+
+<h2>Step: {@$stepTitle}</h2>
+
+<form method="post" action="{$url}">
+ <input type="submit" value="Go" onclick="parent.stopAnimating()" />
+</form>
+
+<script type="text/javascript">
+ //<![CDATA[
+ {if $progress|isset}parent.setProgress({@$progress});{/if}
+ parent.showWindow(false);
+ parent.setCurrentStep('{@$stepTitle}');
+
+ window.onload = function() {
+ document.forms[0].submit();
+ }
+ //]]>
+</script>
+
{include file='setupWindowFooter'}
\ No newline at end of file
-<?php\r
-/**\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @category Community Framework\r
- */\r
-// define the wcf-root-dir\r
-define('WCF_DIR', dirname(__FILE__).'/');\r
-\r
-// initiate wcf core\r
-require_once(WCF_DIR.'lib/system/WCF.class.php');\r
+<?php
+/**
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @category Community Framework
+ */
+// define the wcf-root-dir
+define('WCF_DIR', dirname(__FILE__).'/');
+
+// initiate wcf core
+require_once(WCF_DIR.'lib/system/WCF.class.php');
new wcf\system\WCF();
-/*!\r
- * jQuery UI 1.8.11\r
- *\r
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\r
- * Dual licensed under the MIT or GPL Version 2 licenses.\r
- * http://jquery.org/license\r
- *\r
- * http://docs.jquery.com/UI\r
- */\r
-(function(b,d){function e(g){return!b(g).parents().andSelf().filter(function(){return b.curCSS(this,"visibility")==="hidden"||b.expr.filters.hidden(this)}).length}b.ui=b.ui||{};if(!b.ui.version){b.extend(b.ui,{version:"1.8.11",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,\r
-NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});b.fn.extend({_focus:b.fn.focus,focus:function(g,f){return typeof g==="number"?this.each(function(){var a=this;setTimeout(function(){b(a).focus();f&&f.call(a)},g)}):this._focus.apply(this,arguments)},scrollParent:function(){var g;g=b.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(b.curCSS(this,\r
-"position",1))&&/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this,"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this,"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!g.length?b(document):g},zIndex:function(g){if(g!==d)return this.css("zIndex",g);if(this.length){g=b(this[0]);for(var f;g.length&&g[0]!==document;){f=g.css("position");\r
-if(f==="absolute"||f==="relative"||f==="fixed"){f=parseInt(g.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}g=g.parent()}}return 0},disableSelection:function(){return this.bind((b.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(g){g.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});b.each(["Width","Height"],function(g,f){function a(j,n,p,l){b.each(c,function(){n-=parseFloat(b.curCSS(j,"padding"+this,true))||0;if(p)n-=parseFloat(b.curCSS(j,\r
-"border"+this+"Width",true))||0;if(l)n-=parseFloat(b.curCSS(j,"margin"+this,true))||0});return n}var c=f==="Width"?["Left","Right"]:["Top","Bottom"],h=f.toLowerCase(),i={innerWidth:b.fn.innerWidth,innerHeight:b.fn.innerHeight,outerWidth:b.fn.outerWidth,outerHeight:b.fn.outerHeight};b.fn["inner"+f]=function(j){if(j===d)return i["inner"+f].call(this);return this.each(function(){b(this).css(h,a(this,j)+"px")})};b.fn["outer"+f]=function(j,n){if(typeof j!=="number")return i["outer"+f].call(this,j);return this.each(function(){b(this).css(h,\r
-a(this,j,true,n)+"px")})}});b.extend(b.expr[":"],{data:function(g,f,a){return!!b.data(g,a[3])},focusable:function(g){var f=g.nodeName.toLowerCase(),a=b.attr(g,"tabindex");if("area"===f){f=g.parentNode;a=f.name;if(!g.href||!a||f.nodeName.toLowerCase()!=="map")return false;g=b("img[usemap=#"+a+"]")[0];return!!g&&e(g)}return(/input|select|textarea|button|object/.test(f)?!g.disabled:"a"==f?g.href||!isNaN(a):!isNaN(a))&&e(g)},tabbable:function(g){var f=b.attr(g,"tabindex");return(isNaN(f)||f>=0)&&b(g).is(":focusable")}});\r
-b(function(){var g=document.body,f=g.appendChild(f=document.createElement("div"));b.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});b.support.minHeight=f.offsetHeight===100;b.support.selectstart="onselectstart"in f;g.removeChild(f).style.display="none"});b.extend(b.ui,{plugin:{add:function(g,f,a){g=b.ui[g].prototype;for(var c in a){g.plugins[c]=g.plugins[c]||[];g.plugins[c].push([f,a[c]])}},call:function(g,f,a){if((f=g.plugins[f])&&g.element[0].parentNode)for(var c=0;c<f.length;c++)g.options[f[c][0]]&&\r
-f[c][1].apply(g.element,a)}},contains:function(g,f){return document.compareDocumentPosition?g.compareDocumentPosition(f)&16:g!==f&&g.contains(f)},hasScroll:function(g,f){if(b(g).css("overflow")==="hidden")return false;f=f&&f==="left"?"scrollLeft":"scrollTop";var a=false;if(g[f]>0)return true;g[f]=1;a=g[f]>0;g[f]=0;return a},isOverAxis:function(g,f,a){return g>f&&g<f+a},isOver:function(g,f,a,c,h,i){return b.ui.isOverAxis(g,a,h)&&b.ui.isOverAxis(f,c,i)}})}})(jQuery);\r
-(function(b,d){if(b.cleanData){var e=b.cleanData;b.cleanData=function(f){for(var a=0,c;(c=f[a])!=null;a++)b(c).triggerHandler("remove");e(f)}}else{var g=b.fn.remove;b.fn.remove=function(f,a){return this.each(function(){if(!a)if(!f||b.filter(f,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return g.call(b(this),f,a)})}}b.widget=function(f,a,c){var h=f.split(".")[0],i;f=f.split(".")[1];i=h+"-"+f;if(!c){c=a;a=b.Widget}b.expr[":"][i]=function(j){return!!b.data(j,\r
-f)};b[h]=b[h]||{};b[h][f]=function(j,n){arguments.length&&this._createWidget(j,n)};a=new a;a.options=b.extend(true,{},a.options);b[h][f].prototype=b.extend(true,a,{namespace:h,widgetName:f,widgetEventPrefix:b[h][f].prototype.widgetEventPrefix||f,widgetBaseClass:i},c);b.widget.bridge(f,b[h][f])};b.widget.bridge=function(f,a){b.fn[f]=function(c){var h=typeof c==="string",i=Array.prototype.slice.call(arguments,1),j=this;c=!h&&i.length?b.extend.apply(null,[true,c].concat(i)):c;if(h&&c.charAt(0)==="_")return j;\r
-h?this.each(function(){var n=b.data(this,f),p=n&&b.isFunction(n[c])?n[c].apply(n,i):n;if(p!==n&&p!==d){j=p;return false}}):this.each(function(){var n=b.data(this,f);n?n.option(c||{})._init():b.data(this,f,new a(c,this))});return j}};b.Widget=function(f,a){arguments.length&&this._createWidget(f,a)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,a){b.data(a,this.widgetName,this);this.element=b(a);this.options=b.extend(true,{},this.options,\r
-this._getCreateOptions(),f);var c=this;this.element.bind("remove."+this.widgetName,function(){c.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},\r
-widget:function(){return this.element},option:function(f,a){var c=f;if(arguments.length===0)return b.extend({},this.options);if(typeof f==="string"){if(a===d)return this.options[f];c={};c[f]=a}this._setOptions(c);return this},_setOptions:function(f){var a=this;b.each(f,function(c,h){a._setOption(c,h)});return this},_setOption:function(f,a){this.options[f]=a;if(f==="disabled")this.widget()[a?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",a);return this},\r
-enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(f,a,c){var h=this.options[f];a=b.Event(a);a.type=(f===this.widgetEventPrefix?f:this.widgetEventPrefix+f).toLowerCase();c=c||{};if(a.originalEvent){f=b.event.props.length;for(var i;f;){i=b.event.props[--f];a[i]=a.originalEvent[i]}}this.element.trigger(a,c);return!(b.isFunction(h)&&h.call(this.element[0],a,c)===false||a.isDefaultPrevented())}}})(jQuery);\r
-(function(b){b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(d){d.originalEvent=\r
-d.originalEvent||{};if(!d.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(d);this._mouseDownEvent=d;var e=this,g=d.which==1,f=typeof this.options.cancel=="string"?b(d.target).parents().add(d.target).filter(this.options.cancel).length:false;if(!g||f||!this._mouseCapture(d))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=\r
-this._mouseStart(d)!==false;if(!this._mouseStarted){d.preventDefault();return true}}true===b.data(d.target,this.widgetName+".preventClickEvent")&&b.removeData(d.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(a){return e._mouseMove(a)};this._mouseUpDelegate=function(a){return e._mouseUp(a)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);d.preventDefault();return d.originalEvent.mouseHandled=\r
-true}},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button)return this._mouseUp(d);if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,d)!==false)?this._mouseDrag(d):this._mouseUp(d);return!this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);\r
-if(this._mouseStarted){this._mouseStarted=false;d.target==this._mouseDownEvent.target&&b.data(d.target,this.widgetName+".preventClickEvent",true);this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);\r
-(function(b){b.widget("ui.draggable",b.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==\r
-"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(d){var e=\r
-this.options;if(this.helper||e.disabled||b(d.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(d);if(!this.handle)return false;return true},_mouseStart:function(d){var e=this.options;this.helper=this._createHelper(d);this._cacheHelperProportions();if(b.ui.ddmanager)b.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-\r
-this.margins.top,left:this.offset.left-this.margins.left};b.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt);e.containment&&this._setContainment();if(this._trigger("start",d)===false){this._clear();return false}this._cacheHelperProportions();\r
-b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,d);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(d,true);return true},_mouseDrag:function(d,e){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!e){e=this._uiHash();if(this._trigger("drag",d,e)===false){this._mouseUp({});return false}this.position=e.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||\r
-this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";b.ui.ddmanager&&b.ui.ddmanager.drag(this,d);return false},_mouseStop:function(d){var e=false;if(b.ui.ddmanager&&!this.options.dropBehaviour)e=b.ui.ddmanager.drop(this,d);if(this.dropped){e=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!e||this.options.revert=="valid"&&e||this.options.revert===true||b.isFunction(this.options.revert)&&\r
-this.options.revert.call(this.element,e)){var g=this;b(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){g._trigger("stop",d)!==false&&g._clear()})}else this._trigger("stop",d)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(d){var e=!this.options.handle||!b(this.options.handle,this.element).length?true:false;b(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==\r
-d.target)e=true});return e},_createHelper:function(d){var e=this.options;d=b.isFunction(e.helper)?b(e.helper.apply(this.element[0],[d])):e.helper=="clone"?this.element.clone():this.element;d.parents("body").length||d.appendTo(e.appendTo=="parent"?this.element[0].parentNode:e.appendTo);d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(b.isArray(d))d={left:+d[0],top:+d[1]||\r
-0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],\r
-this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)d={top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.element.position();return{top:d.top-\r
-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.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(),\r
-height:this.helper.outerHeight()}},_setContainment:function(){var d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[(d.containment=="document"?0:b(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(d.containment=="document"?0:b(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(d.containment=="document"?0:b(window).scrollLeft())+b(d.containment=="document"?\r
-document:window).width()-this.helperProportions.width-this.margins.left,(d.containment=="document"?0:b(window).scrollTop())+(b(d.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)&&d.containment.constructor!=Array){var e=b(d.containment)[0];if(e){d=b(d.containment).offset();var g=b(e).css("overflow")!="hidden";this.containment=[d.left+(parseInt(b(e).css("borderLeftWidth"),\r
-10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0),d.top+(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0),d.left+(g?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,d.top+(g?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),\r
-10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom]}}else if(d.containment.constructor==Array)this.containment=d.containment},_convertPositionTo:function(d,e){if(!e)e=this.position;d=d=="absolute"?1:-1;var g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);return{top:e.top+this.offset.relative.top*d+this.offset.parent.top*d-(b.browser.safari&&\r
-b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop())*d),left:e.left+this.offset.relative.left*d+this.offset.parent.left*d-(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:g.scrollLeft())*d)}},_generatePosition:function(d){var e=this.options,g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],\r
-this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName),a=d.pageX,c=d.pageY;if(this.originalPosition){if(this.containment){if(d.pageX-this.offset.click.left<this.containment[0])a=this.containment[0]+this.offset.click.left;if(d.pageY-this.offset.click.top<this.containment[1])c=this.containment[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>this.containment[2])a=this.containment[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>this.containment[3])c=\r
-this.containment[3]+this.offset.click.top}if(e.grid){c=this.originalPageY+Math.round((c-this.originalPageY)/e.grid[1])*e.grid[1];c=this.containment?!(c-this.offset.click.top<this.containment[1]||c-this.offset.click.top>this.containment[3])?c:!(c-this.offset.click.top<this.containment[1])?c-e.grid[1]:c+e.grid[1]:c;a=this.originalPageX+Math.round((a-this.originalPageX)/e.grid[0])*e.grid[0];a=this.containment?!(a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2])?\r
-a:!(a-this.offset.click.left<this.containment[0])?a-e.grid[0]:a+e.grid[0]:a}}return{top:c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():\r
-f?0:g.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(d,e,g){g=g||this._uiHash();b.ui.plugin.call(this,d,[e,g]);if(d=="drag")this.positionAbs=this._convertPositionTo("absolute");return b.Widget.prototype._trigger.call(this,d,e,g)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,\r
-offset:this.positionAbs}}});b.extend(b.ui.draggable,{version:"1.8.11"});b.ui.plugin.add("draggable","connectToSortable",{start:function(d,e){var g=b(this).data("draggable"),f=g.options,a=b.extend({},e,{item:g.element});g.sortables=[];b(f.connectToSortable).each(function(){var c=b.data(this,"sortable");if(c&&!c.options.disabled){g.sortables.push({instance:c,shouldRevert:c.options.revert});c.refreshPositions();c._trigger("activate",d,a)}})},stop:function(d,e){var g=b(this).data("draggable"),f=b.extend({},\r
-e,{item:g.element});b.each(g.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;g.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(d);this.instance.options.helper=this.instance.options._helper;g.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",d,f)}})},drag:function(d,e){var g=\r
-b(this).data("draggable"),f=this;b.each(g.sortables,function(){this.instance.positionAbs=g.positionAbs;this.instance.helperProportions=g.helperProportions;this.instance.offset.click=g.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=b(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return e.helper[0]};\r
-d.target=this.instance.currentItem[0];this.instance._mouseCapture(d,true);this.instance._mouseStart(d,true,true);this.instance.offset.click.top=g.offset.click.top;this.instance.offset.click.left=g.offset.click.left;this.instance.offset.parent.left-=g.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=g.offset.parent.top-this.instance.offset.parent.top;g._trigger("toSortable",d);g.dropped=this.instance.element;g.currentItem=g.element;this.instance.fromOutside=g}this.instance.currentItem&&\r
-this.instance._mouseDrag(d)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",d,this.instance._uiHash(this.instance));this.instance._mouseStop(d,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();g._trigger("fromSortable",d);g.dropped=false}})}});b.ui.plugin.add("draggable","cursor",\r
-{start:function(){var d=b("body"),e=b(this).data("draggable").options;if(d.css("cursor"))e._cursor=d.css("cursor");d.css("cursor",e.cursor)},stop:function(){var d=b(this).data("draggable").options;d._cursor&&b("body").css("cursor",d._cursor)}});b.ui.plugin.add("draggable","iframeFix",{start:function(){var d=b(this).data("draggable").options;b(d.iframeFix===true?"iframe":d.iframeFix).each(function(){b('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+\r
-"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(b(this).offset()).appendTo("body")})},stop:function(){b("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});b.ui.plugin.add("draggable","opacity",{start:function(d,e){d=b(e.helper);e=b(this).data("draggable").options;if(d.css("opacity"))e._opacity=d.css("opacity");d.css("opacity",e.opacity)},stop:function(d,e){d=b(this).data("draggable").options;d._opacity&&b(e.helper).css("opacity",\r
-d._opacity)}});b.ui.plugin.add("draggable","scroll",{start:function(){var d=b(this).data("draggable");if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML")d.overflowOffset=d.scrollParent.offset()},drag:function(d){var e=b(this).data("draggable"),g=e.options,f=false;if(e.scrollParent[0]!=document&&e.scrollParent[0].tagName!="HTML"){if(!g.axis||g.axis!="x")if(e.overflowOffset.top+e.scrollParent[0].offsetHeight-d.pageY<g.scrollSensitivity)e.scrollParent[0].scrollTop=f=e.scrollParent[0].scrollTop+\r
-g.scrollSpeed;else if(d.pageY-e.overflowOffset.top<g.scrollSensitivity)e.scrollParent[0].scrollTop=f=e.scrollParent[0].scrollTop-g.scrollSpeed;if(!g.axis||g.axis!="y")if(e.overflowOffset.left+e.scrollParent[0].offsetWidth-d.pageX<g.scrollSensitivity)e.scrollParent[0].scrollLeft=f=e.scrollParent[0].scrollLeft+g.scrollSpeed;else if(d.pageX-e.overflowOffset.left<g.scrollSensitivity)e.scrollParent[0].scrollLeft=f=e.scrollParent[0].scrollLeft-g.scrollSpeed}else{if(!g.axis||g.axis!="x")if(d.pageY-b(document).scrollTop()<\r
-g.scrollSensitivity)f=b(document).scrollTop(b(document).scrollTop()-g.scrollSpeed);else if(b(window).height()-(d.pageY-b(document).scrollTop())<g.scrollSensitivity)f=b(document).scrollTop(b(document).scrollTop()+g.scrollSpeed);if(!g.axis||g.axis!="y")if(d.pageX-b(document).scrollLeft()<g.scrollSensitivity)f=b(document).scrollLeft(b(document).scrollLeft()-g.scrollSpeed);else if(b(window).width()-(d.pageX-b(document).scrollLeft())<g.scrollSensitivity)f=b(document).scrollLeft(b(document).scrollLeft()+\r
-g.scrollSpeed)}f!==false&&b.ui.ddmanager&&!g.dropBehaviour&&b.ui.ddmanager.prepareOffsets(e,d)}});b.ui.plugin.add("draggable","snap",{start:function(){var d=b(this).data("draggable"),e=d.options;d.snapElements=[];b(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var g=b(this),f=g.offset();this!=d.element[0]&&d.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})})},drag:function(d,e){for(var g=b(this).data("draggable"),\r
-f=g.options,a=f.snapTolerance,c=e.offset.left,h=c+g.helperProportions.width,i=e.offset.top,j=i+g.helperProportions.height,n=g.snapElements.length-1;n>=0;n--){var p=g.snapElements[n].left,l=p+g.snapElements[n].width,k=g.snapElements[n].top,m=k+g.snapElements[n].height;if(p-a<c&&c<l+a&&k-a<i&&i<m+a||p-a<c&&c<l+a&&k-a<j&&j<m+a||p-a<h&&h<l+a&&k-a<i&&i<m+a||p-a<h&&h<l+a&&k-a<j&&j<m+a){if(f.snapMode!="inner"){var o=Math.abs(k-j)<=a,q=Math.abs(m-i)<=a,s=Math.abs(p-h)<=a,r=Math.abs(l-c)<=a;if(o)e.position.top=\r
-g._convertPositionTo("relative",{top:k-g.helperProportions.height,left:0}).top-g.margins.top;if(q)e.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top;if(s)e.position.left=g._convertPositionTo("relative",{top:0,left:p-g.helperProportions.width}).left-g.margins.left;if(r)e.position.left=g._convertPositionTo("relative",{top:0,left:l}).left-g.margins.left}var u=o||q||s||r;if(f.snapMode!="outer"){o=Math.abs(k-i)<=a;q=Math.abs(m-j)<=a;s=Math.abs(p-c)<=a;r=Math.abs(l-h)<=a;if(o)e.position.top=\r
-g._convertPositionTo("relative",{top:k,left:0}).top-g.margins.top;if(q)e.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top;if(s)e.position.left=g._convertPositionTo("relative",{top:0,left:p}).left-g.margins.left;if(r)e.position.left=g._convertPositionTo("relative",{top:0,left:l-g.helperProportions.width}).left-g.margins.left}if(!g.snapElements[n].snapping&&(o||q||s||r||u))g.options.snap.snap&&g.options.snap.snap.call(g.element,d,b.extend(g._uiHash(),\r
-{snapItem:g.snapElements[n].item}));g.snapElements[n].snapping=o||q||s||r||u}else{g.snapElements[n].snapping&&g.options.snap.release&&g.options.snap.release.call(g.element,d,b.extend(g._uiHash(),{snapItem:g.snapElements[n].item}));g.snapElements[n].snapping=false}}}});b.ui.plugin.add("draggable","stack",{start:function(){var d=b(this).data("draggable").options;d=b.makeArray(b(d.stack)).sort(function(g,f){return(parseInt(b(g).css("zIndex"),10)||0)-(parseInt(b(f).css("zIndex"),10)||0)});if(d.length){var e=\r
-parseInt(d[0].style.zIndex)||0;b(d).each(function(g){this.style.zIndex=e+g});this[0].style.zIndex=e+d.length}}});b.ui.plugin.add("draggable","zIndex",{start:function(d,e){d=b(e.helper);e=b(this).data("draggable").options;if(d.css("zIndex"))e._zIndex=d.css("zIndex");d.css("zIndex",e.zIndex)},stop:function(d,e){d=b(this).data("draggable").options;d._zIndex&&b(e.helper).css("zIndex",d._zIndex)}})})(jQuery);\r
-(function(b){b.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var d=this.options,e=d.accept;this.isover=0;this.isout=1;this.accept=b.isFunction(e)?e:function(g){return g.is(e)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};b.ui.ddmanager.droppables[d.scope]=b.ui.ddmanager.droppables[d.scope]||[];b.ui.ddmanager.droppables[d.scope].push(this);\r
-d.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var d=b.ui.ddmanager.droppables[this.options.scope],e=0;e<d.length;e++)d[e]==this&&d.splice(e,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(d,e){if(d=="accept")this.accept=b.isFunction(e)?e:function(g){return g.is(e)};b.Widget.prototype._setOption.apply(this,arguments)},_activate:function(d){var e=b.ui.ddmanager.current;this.options.activeClass&&\r
-this.element.addClass(this.options.activeClass);e&&this._trigger("activate",d,this.ui(e))},_deactivate:function(d){var e=b.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);e&&this._trigger("deactivate",d,this.ui(e))},_over:function(d){var e=b.ui.ddmanager.current;if(!(!e||(e.currentItem||e.element)[0]==this.element[0]))if(this.accept.call(this.element[0],e.currentItem||e.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);\r
-this._trigger("over",d,this.ui(e))}},_out:function(d){var e=b.ui.ddmanager.current;if(!(!e||(e.currentItem||e.element)[0]==this.element[0]))if(this.accept.call(this.element[0],e.currentItem||e.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",d,this.ui(e))}},_drop:function(d,e){var g=e||b.ui.ddmanager.current;if(!g||(g.currentItem||g.element)[0]==this.element[0])return false;var f=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var a=\r
-b.data(this,"droppable");if(a.options.greedy&&!a.options.disabled&&a.options.scope==g.options.scope&&a.accept.call(a.element[0],g.currentItem||g.element)&&b.ui.intersect(g,b.extend(a,{offset:a.element.offset()}),a.options.tolerance)){f=true;return false}});if(f)return false;if(this.accept.call(this.element[0],g.currentItem||g.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",\r
-d,this.ui(g));return this.element}return false},ui:function(d){return{draggable:d.currentItem||d.element,helper:d.helper,position:d.position,offset:d.positionAbs}}});b.extend(b.ui.droppable,{version:"1.8.11"});b.ui.intersect=function(d,e,g){if(!e.offset)return false;var f=(d.positionAbs||d.position.absolute).left,a=f+d.helperProportions.width,c=(d.positionAbs||d.position.absolute).top,h=c+d.helperProportions.height,i=e.offset.left,j=i+e.proportions.width,n=e.offset.top,p=n+e.proportions.height;\r
-switch(g){case "fit":return i<=f&&a<=j&&n<=c&&h<=p;case "intersect":return i<f+d.helperProportions.width/2&&a-d.helperProportions.width/2<j&&n<c+d.helperProportions.height/2&&h-d.helperProportions.height/2<p;case "pointer":return b.ui.isOver((d.positionAbs||d.position.absolute).top+(d.clickOffset||d.offset.click).top,(d.positionAbs||d.position.absolute).left+(d.clickOffset||d.offset.click).left,n,i,e.proportions.height,e.proportions.width);case "touch":return(c>=n&&c<=p||h>=n&&h<=p||c<n&&h>p)&&(f>=\r
-i&&f<=j||a>=i&&a<=j||f<i&&a>j);default:return false}};b.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(d,e){var g=b.ui.ddmanager.droppables[d.options.scope]||[],f=e?e.type:null,a=(d.currentItem||d.element).find(":data(droppable)").andSelf(),c=0;a:for(;c<g.length;c++)if(!(g[c].options.disabled||d&&!g[c].accept.call(g[c].element[0],d.currentItem||d.element))){for(var h=0;h<a.length;h++)if(a[h]==g[c].element[0]){g[c].proportions.height=0;continue a}g[c].visible=g[c].element.css("display")!=\r
-"none";if(g[c].visible){f=="mousedown"&&g[c]._activate.call(g[c],e);g[c].offset=g[c].element.offset();g[c].proportions={width:g[c].element[0].offsetWidth,height:g[c].element[0].offsetHeight}}}},drop:function(d,e){var g=false;b.each(b.ui.ddmanager.droppables[d.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&b.ui.intersect(d,this,this.options.tolerance))g=g||this._drop.call(this,e);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],d.currentItem||\r
-d.element)){this.isout=1;this.isover=0;this._deactivate.call(this,e)}}});return g},drag:function(d,e){d.options.refreshPositions&&b.ui.ddmanager.prepareOffsets(d,e);b.each(b.ui.ddmanager.droppables[d.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var g=b.ui.intersect(d,this,this.options.tolerance);if(g=!g&&this.isover==1?"isout":g&&this.isover==0?"isover":null){var f;if(this.options.greedy){var a=this.element.parents(":data(droppable):eq(0)");if(a.length){f=\r
-b.data(a[0],"droppable");f.greedyChild=g=="isover"?1:0}}if(f&&g=="isover"){f.isover=0;f.isout=1;f._out.call(f,e)}this[g]=1;this[g=="isout"?"isover":"isout"]=0;this[g=="isover"?"_over":"_out"].call(this,e);if(f&&g=="isout"){f.isout=0;f.isover=1;f._over.call(f,e)}}}})}}})(jQuery);\r
-(function(b){b.widget("ui.resizable",b.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var g=this,f=this.options;this.element.addClass("ui-resizable");b.extend(this,{_aspectRatio:!!f.aspectRatio,aspectRatio:f.aspectRatio,originalElement:this.element,\r
-_proportionallyResizeElements:[],_helper:f.helper||f.ghost||f.animate?f.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&b.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(b('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),\r
-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=\r
-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=f.handles||(!b(".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",\r
-nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var a=this.handles.split(",");this.handles={};for(var c=0;c<a.length;c++){var h=b.trim(a[c]),i=b('<div class="ui-resizable-handle '+("ui-resizable-"+h)+'"></div>');/sw|se|ne|nw/.test(h)&&i.css({zIndex:++f.zIndex});"se"==h&&i.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[h]=".ui-resizable-"+h;this.element.append(i)}}this._renderAxis=function(j){j=j||this.element;for(var n in this.handles){if(this.handles[n].constructor==\r
-String)this.handles[n]=b(this.handles[n],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var p=b(this.handles[n],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(n)?p.outerHeight():p.outerWidth();p=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");j.css(p,l);this._proportionallyResize()}b(this.handles[n])}};this._renderAxis(this.element);this._handles=b(".ui-resizable-handle",this.element).disableSelection();\r
-this._handles.mouseover(function(){if(!g.resizing){if(this.className)var j=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);g.axis=j&&j[1]?j[1]:"se"}});if(f.autoHide){this._handles.hide();b(this.element).addClass("ui-resizable-autohide").hover(function(){b(this).removeClass("ui-resizable-autohide");g._handles.show()},function(){if(!g.resizing){b(this).addClass("ui-resizable-autohide");g._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var g=function(a){b(a).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};\r
-if(this.elementIsWrapper){g(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);g(this.originalElement);return this},_mouseCapture:function(g){var f=false;for(var a in this.handles)if(b(this.handles[a])[0]==g.target)f=true;return!this.options.disabled&&f},_mouseStart:function(g){var f=this.options,a=this.element.position(),\r
-c=this.element;this.resizing=true;this.documentScroll={top:b(document).scrollTop(),left:b(document).scrollLeft()};if(c.is(".ui-draggable")||/absolute/.test(c.css("position")))c.css({position:"absolute",top:a.top,left:a.left});b.browser.opera&&/relative/.test(c.css("position"))&&c.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();a=d(this.helper.css("left"));var h=d(this.helper.css("top"));if(f.containment){a+=b(f.containment).scrollLeft()||0;h+=b(f.containment).scrollTop()||0}this.offset=\r
-this.helper.offset();this.position={left:a,top:h};this.size=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalSize=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalPosition={left:a,top:h};this.sizeDiff={width:c.outerWidth()-c.width(),height:c.outerHeight()-c.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=typeof f.aspectRatio=="number"?f.aspectRatio:\r
-this.originalSize.width/this.originalSize.height||1;f=b(".ui-resizable-"+this.axis).css("cursor");b("body").css("cursor",f=="auto"?this.axis+"-resize":f);c.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(g){var f=this.helper,a=this.originalMousePosition,c=this._change[this.axis];if(!c)return false;a=c.apply(this,[g,g.pageX-a.left||0,g.pageY-a.top||0]);if(this._aspectRatio||g.shiftKey)a=this._updateRatio(a,g);a=this._respectSize(a,g);this._propagate("resize",\r
-g);f.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(a);this._trigger("resize",g,this.ui());return false},_mouseStop:function(g){this.resizing=false;var f=this.options,a=this;if(this._helper){var c=this._proportionallyResizeElements,h=c.length&&/textarea/i.test(c[0].nodeName);c=h&&b.ui.hasScroll(c[0],"left")?0:a.sizeDiff.height;\r
-h=h?0:a.sizeDiff.width;h={width:a.helper.width()-h,height:a.helper.height()-c};c=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var i=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;f.animate||this.element.css(b.extend(h,{top:i,left:c}));a.helper.height(a.size.height);a.helper.width(a.size.width);this._helper&&!f.animate&&this._proportionallyResize()}b("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");\r
-this._propagate("stop",g);this._helper&&this.helper.remove();return false},_updateCache:function(g){this.offset=this.helper.offset();if(e(g.left))this.position.left=g.left;if(e(g.top))this.position.top=g.top;if(e(g.height))this.size.height=g.height;if(e(g.width))this.size.width=g.width},_updateRatio:function(g){var f=this.position,a=this.size,c=this.axis;if(g.height)g.width=a.height*this.aspectRatio;else if(g.width)g.height=a.width/this.aspectRatio;if(c=="sw"){g.left=f.left+(a.width-g.width);g.top=\r
-null}if(c=="nw"){g.top=f.top+(a.height-g.height);g.left=f.left+(a.width-g.width)}return g},_respectSize:function(g){var f=this.options,a=this.axis,c=e(g.width)&&f.maxWidth&&f.maxWidth<g.width,h=e(g.height)&&f.maxHeight&&f.maxHeight<g.height,i=e(g.width)&&f.minWidth&&f.minWidth>g.width,j=e(g.height)&&f.minHeight&&f.minHeight>g.height;if(i)g.width=f.minWidth;if(j)g.height=f.minHeight;if(c)g.width=f.maxWidth;if(h)g.height=f.maxHeight;var n=this.originalPosition.left+this.originalSize.width,p=this.position.top+\r
-this.size.height,l=/sw|nw|w/.test(a);a=/nw|ne|n/.test(a);if(i&&l)g.left=n-f.minWidth;if(c&&l)g.left=n-f.maxWidth;if(j&&a)g.top=p-f.minHeight;if(h&&a)g.top=p-f.maxHeight;if((f=!g.width&&!g.height)&&!g.left&&g.top)g.top=null;else if(f&&!g.top&&g.left)g.left=null;return g},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var g=this.helper||this.element,f=0;f<this._proportionallyResizeElements.length;f++){var a=this._proportionallyResizeElements[f];if(!this.borderDif){var c=\r
-[a.css("borderTopWidth"),a.css("borderRightWidth"),a.css("borderBottomWidth"),a.css("borderLeftWidth")],h=[a.css("paddingTop"),a.css("paddingRight"),a.css("paddingBottom"),a.css("paddingLeft")];this.borderDif=b.map(c,function(i,j){i=parseInt(i,10)||0;j=parseInt(h[j],10)||0;return i+j})}b.browser.msie&&(b(g).is(":hidden")||b(g).parents(":hidden").length)||a.css({height:g.height()-this.borderDif[0]-this.borderDif[2]||0,width:g.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var g=\r
-this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||b('<div style="overflow:hidden;"></div>');var f=b.browser.msie&&b.browser.version<7,a=f?1:0;f=f?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-a+"px",top:this.elementOffset.top-a+"px",zIndex:++g.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(g,\r
-f){return{width:this.originalSize.width+f}},w:function(g,f){return{left:this.originalPosition.left+f,width:this.originalSize.width-f}},n:function(g,f,a){return{top:this.originalPosition.top+a,height:this.originalSize.height-a}},s:function(g,f,a){return{height:this.originalSize.height+a}},se:function(g,f,a){return b.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,a]))},sw:function(g,f,a){return b.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,\r
-a]))},ne:function(g,f,a){return b.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,a]))},nw:function(g,f,a){return b.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,a]))}},_propagate:function(g,f){b.ui.plugin.call(this,g,[f,this.ui()]);g!="resize"&&this._trigger(g,f,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,\r
-originalPosition:this.originalPosition}}});b.extend(b.ui.resizable,{version:"1.8.11"});b.ui.plugin.add("resizable","alsoResize",{start:function(){var g=b(this).data("resizable").options,f=function(a){b(a).each(function(){var c=b(this);c.data("resizable-alsoresize",{width:parseInt(c.width(),10),height:parseInt(c.height(),10),left:parseInt(c.css("left"),10),top:parseInt(c.css("top"),10),position:c.css("position")})})};if(typeof g.alsoResize=="object"&&!g.alsoResize.parentNode)if(g.alsoResize.length){g.alsoResize=\r
-g.alsoResize[0];f(g.alsoResize)}else b.each(g.alsoResize,function(a){f(a)});else f(g.alsoResize)},resize:function(g,f){var a=b(this).data("resizable");g=a.options;var c=a.originalSize,h=a.originalPosition,i={height:a.size.height-c.height||0,width:a.size.width-c.width||0,top:a.position.top-h.top||0,left:a.position.left-h.left||0},j=function(n,p){b(n).each(function(){var l=b(this),k=b(this).data("resizable-alsoresize"),m={},o=p&&p.length?p:l.parents(f.originalElement[0]).length?["width","height"]:["width",\r
-"height","top","left"];b.each(o,function(q,s){if((q=(k[s]||0)+(i[s]||0))&&q>=0)m[s]=q||null});if(b.browser.opera&&/relative/.test(l.css("position"))){a._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(m)})};typeof g.alsoResize=="object"&&!g.alsoResize.nodeType?b.each(g.alsoResize,function(n,p){j(n,p)}):j(g.alsoResize)},stop:function(){var g=b(this).data("resizable"),f=g.options,a=function(c){b(c).each(function(){var h=b(this);h.css({position:h.data("resizable-alsoresize").position})})};\r
-if(g._revertToRelativePosition){g._revertToRelativePosition=false;typeof f.alsoResize=="object"&&!f.alsoResize.nodeType?b.each(f.alsoResize,function(c){a(c)}):a(f.alsoResize)}b(this).removeData("resizable-alsoresize")}});b.ui.plugin.add("resizable","animate",{stop:function(g){var f=b(this).data("resizable"),a=f.options,c=f._proportionallyResizeElements,h=c.length&&/textarea/i.test(c[0].nodeName),i=h&&b.ui.hasScroll(c[0],"left")?0:f.sizeDiff.height;h={width:f.size.width-(h?0:f.sizeDiff.width),height:f.size.height-\r
-i};i=parseInt(f.element.css("left"),10)+(f.position.left-f.originalPosition.left)||null;var j=parseInt(f.element.css("top"),10)+(f.position.top-f.originalPosition.top)||null;f.element.animate(b.extend(h,j&&i?{top:j,left:i}:{}),{duration:a.animateDuration,easing:a.animateEasing,step:function(){var n={width:parseInt(f.element.css("width"),10),height:parseInt(f.element.css("height"),10),top:parseInt(f.element.css("top"),10),left:parseInt(f.element.css("left"),10)};c&&c.length&&b(c[0]).css({width:n.width,\r
-height:n.height});f._updateCache(n);f._propagate("resize",g)}})}});b.ui.plugin.add("resizable","containment",{start:function(){var g=b(this).data("resizable"),f=g.element,a=g.options.containment;if(f=a instanceof b?a.get(0):/parent/.test(a)?f.parent().get(0):a){g.containerElement=b(f);if(/document/.test(a)||a==document){g.containerOffset={left:0,top:0};g.containerPosition={left:0,top:0};g.parentData={element:b(document),left:0,top:0,width:b(document).width(),height:b(document).height()||document.body.parentNode.scrollHeight}}else{var c=\r
-b(f),h=[];b(["Top","Right","Left","Bottom"]).each(function(n,p){h[n]=d(c.css("padding"+p))});g.containerOffset=c.offset();g.containerPosition=c.position();g.containerSize={height:c.innerHeight()-h[3],width:c.innerWidth()-h[1]};a=g.containerOffset;var i=g.containerSize.height,j=g.containerSize.width;j=b.ui.hasScroll(f,"left")?f.scrollWidth:j;i=b.ui.hasScroll(f)?f.scrollHeight:i;g.parentData={element:f,left:a.left,top:a.top,width:j,height:i}}}},resize:function(g){var f=b(this).data("resizable"),a=f.options,\r
-c=f.containerOffset,h=f.position;g=f._aspectRatio||g.shiftKey;var i={top:0,left:0},j=f.containerElement;if(j[0]!=document&&/static/.test(j.css("position")))i=c;if(h.left<(f._helper?c.left:0)){f.size.width+=f._helper?f.position.left-c.left:f.position.left-i.left;if(g)f.size.height=f.size.width/a.aspectRatio;f.position.left=a.helper?c.left:0}if(h.top<(f._helper?c.top:0)){f.size.height+=f._helper?f.position.top-c.top:f.position.top;if(g)f.size.width=f.size.height*a.aspectRatio;f.position.top=f._helper?\r
-c.top:0}f.offset.left=f.parentData.left+f.position.left;f.offset.top=f.parentData.top+f.position.top;a=Math.abs((f._helper?f.offset.left-i.left:f.offset.left-i.left)+f.sizeDiff.width);c=Math.abs((f._helper?f.offset.top-i.top:f.offset.top-c.top)+f.sizeDiff.height);h=f.containerElement.get(0)==f.element.parent().get(0);i=/relative|absolute/.test(f.containerElement.css("position"));if(h&&i)a-=f.parentData.left;if(a+f.size.width>=f.parentData.width){f.size.width=f.parentData.width-a;if(g)f.size.height=\r
-f.size.width/f.aspectRatio}if(c+f.size.height>=f.parentData.height){f.size.height=f.parentData.height-c;if(g)f.size.width=f.size.height*f.aspectRatio}},stop:function(){var g=b(this).data("resizable"),f=g.options,a=g.containerOffset,c=g.containerPosition,h=g.containerElement,i=b(g.helper),j=i.offset(),n=i.outerWidth()-g.sizeDiff.width;i=i.outerHeight()-g.sizeDiff.height;g._helper&&!f.animate&&/relative/.test(h.css("position"))&&b(this).css({left:j.left-c.left-a.left,width:n,height:i});g._helper&&!f.animate&&\r
-/static/.test(h.css("position"))&&b(this).css({left:j.left-c.left-a.left,width:n,height:i})}});b.ui.plugin.add("resizable","ghost",{start:function(){var g=b(this).data("resizable"),f=g.options,a=g.size;g.ghost=g.originalElement.clone();g.ghost.css({opacity:0.25,display:"block",position:"relative",height:a.height,width:a.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof f.ghost=="string"?f.ghost:"");g.ghost.appendTo(g.helper)},resize:function(){var g=b(this).data("resizable");\r
-g.ghost&&g.ghost.css({position:"relative",height:g.size.height,width:g.size.width})},stop:function(){var g=b(this).data("resizable");g.ghost&&g.helper&&g.helper.get(0).removeChild(g.ghost.get(0))}});b.ui.plugin.add("resizable","grid",{resize:function(){var g=b(this).data("resizable"),f=g.options,a=g.size,c=g.originalSize,h=g.originalPosition,i=g.axis;f.grid=typeof f.grid=="number"?[f.grid,f.grid]:f.grid;var j=Math.round((a.width-c.width)/(f.grid[0]||1))*(f.grid[0]||1);f=Math.round((a.height-c.height)/\r
-(f.grid[1]||1))*(f.grid[1]||1);if(/^(se|s|e)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f}else if(/^(ne)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f;g.position.top=h.top-f}else{if(/^(sw)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f}else{g.size.width=c.width+j;g.size.height=c.height+f;g.position.top=h.top-f}g.position.left=h.left-j}}});var d=function(g){return parseInt(g,10)||0},e=function(g){return!isNaN(parseInt(g,10))}})(jQuery);\r
-(function(b){b.widget("ui.selectable",b.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var d=this;this.element.addClass("ui-selectable");this.dragged=false;var e;this.refresh=function(){e=b(d.options.filter,d.element[0]);e.each(function(){var g=b(this),f=g.offset();b.data(this,"selectable-item",{element:this,$element:g,left:f.left,top:f.top,right:f.left+g.outerWidth(),bottom:f.top+g.outerHeight(),startselected:false,selected:g.hasClass("ui-selected"),\r
-selecting:g.hasClass("ui-selecting"),unselecting:g.hasClass("ui-unselecting")})})};this.refresh();this.selectees=e.addClass("ui-selectee");this._mouseInit();this.helper=b("<div class='ui-selectable-helper'></div>")},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 e=this;this.opos=[d.pageX,\r
-d.pageY];if(!this.options.disabled){var g=this.options;this.selectees=b(g.filter,this.element[0]);this._trigger("start",d);b(g.appendTo).append(this.helper);this.helper.css({left:d.clientX,top:d.clientY,width:0,height:0});g.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var f=b.data(this,"selectable-item");f.startselected=true;if(!d.metaKey){f.$element.removeClass("ui-selected");f.selected=false;f.$element.addClass("ui-unselecting");f.unselecting=true;e._trigger("unselecting",\r
-d,{unselecting:f.element})}});b(d.target).parents().andSelf().each(function(){var f=b.data(this,"selectable-item");if(f){var a=!d.metaKey||!f.$element.hasClass("ui-selected");f.$element.removeClass(a?"ui-unselecting":"ui-selected").addClass(a?"ui-selecting":"ui-unselecting");f.unselecting=!a;f.selecting=a;(f.selected=a)?e._trigger("selecting",d,{selecting:f.element}):e._trigger("unselecting",d,{unselecting:f.element});return false}})}},_mouseDrag:function(d){var e=this;this.dragged=true;if(!this.options.disabled){var g=\r
-this.options,f=this.opos[0],a=this.opos[1],c=d.pageX,h=d.pageY;if(f>c){var i=c;c=f;f=i}if(a>h){i=h;h=a;a=i}this.helper.css({left:f,top:a,width:c-f,height:h-a});this.selectees.each(function(){var j=b.data(this,"selectable-item");if(!(!j||j.element==e.element[0])){var n=false;if(g.tolerance=="touch")n=!(j.left>c||j.right<f||j.top>h||j.bottom<a);else if(g.tolerance=="fit")n=j.left>f&&j.right<c&&j.top>a&&j.bottom<h;if(n){if(j.selected){j.$element.removeClass("ui-selected");j.selected=false}if(j.unselecting){j.$element.removeClass("ui-unselecting");\r
-j.unselecting=false}if(!j.selecting){j.$element.addClass("ui-selecting");j.selecting=true;e._trigger("selecting",d,{selecting:j.element})}}else{if(j.selecting)if(d.metaKey&&j.startselected){j.$element.removeClass("ui-selecting");j.selecting=false;j.$element.addClass("ui-selected");j.selected=true}else{j.$element.removeClass("ui-selecting");j.selecting=false;if(j.startselected){j.$element.addClass("ui-unselecting");j.unselecting=true}e._trigger("unselecting",d,{unselecting:j.element})}if(j.selected)if(!d.metaKey&&\r
-!j.startselected){j.$element.removeClass("ui-selected");j.selected=false;j.$element.addClass("ui-unselecting");j.unselecting=true;e._trigger("unselecting",d,{unselecting:j.element})}}}});return false}},_mouseStop:function(d){var e=this;this.dragged=false;b(".ui-unselecting",this.element[0]).each(function(){var g=b.data(this,"selectable-item");g.$element.removeClass("ui-unselecting");g.unselecting=false;g.startselected=false;e._trigger("unselected",d,{unselected:g.element})});b(".ui-selecting",this.element[0]).each(function(){var g=\r
-b.data(this,"selectable-item");g.$element.removeClass("ui-selecting").addClass("ui-selected");g.selecting=false;g.selected=true;g.startselected=true;e._trigger("selected",d,{selected:g.element})});this._trigger("stop",d);this.helper.remove();return false}});b.extend(b.ui.selectable,{version:"1.8.11"})})(jQuery);\r
-(function(b){b.widget("ui.sortable",b.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",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");\r
-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 d=this.items.length-1;d>=0;d--)this.items[d].item.removeData("sortable-item");return this},_setOption:function(d,e){if(d==="disabled"){this.options[d]=\r
-e;this.widget()[e?"addClass":"removeClass"]("ui-sortable-disabled")}else b.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(d,e){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(d);var g=null,f=this;b(d.target).parents().each(function(){if(b.data(this,"sortable-item")==f){g=b(this);return false}});if(b.data(d.target,"sortable-item")==f)g=b(d.target);if(!g)return false;if(this.options.handle&&!e){var a=false;\r
-b(this.options.handle,g).find("*").andSelf().each(function(){if(this==d.target)a=true});if(!a)return false}this.currentItem=g;this._removeCurrentsFromItems();return true},_mouseStart:function(d,e,g){e=this.options;var f=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(d);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-\r
-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");b.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};\r
-this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();e.containment&&this._setContainment();if(e.cursor){if(b("body").css("cursor"))this._storedCursor=b("body").css("cursor");b("body").css("cursor",e.cursor)}if(e.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",e.opacity)}if(e.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",e.zIndex)}if(this.scrollParent[0]!=\r
-document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",d,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!g)for(g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",d,f._uiHash(this));if(b.ui.ddmanager)b.ui.ddmanager.current=this;b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,d);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(d);\r
-return true},_mouseDrag:function(d){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var e=this.options,g=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-d.pageY<e.scrollSensitivity)this.scrollParent[0].scrollTop=g=this.scrollParent[0].scrollTop+e.scrollSpeed;else if(d.pageY-this.overflowOffset.top<\r
-e.scrollSensitivity)this.scrollParent[0].scrollTop=g=this.scrollParent[0].scrollTop-e.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-d.pageX<e.scrollSensitivity)this.scrollParent[0].scrollLeft=g=this.scrollParent[0].scrollLeft+e.scrollSpeed;else if(d.pageX-this.overflowOffset.left<e.scrollSensitivity)this.scrollParent[0].scrollLeft=g=this.scrollParent[0].scrollLeft-e.scrollSpeed}else{if(d.pageY-b(document).scrollTop()<e.scrollSensitivity)g=b(document).scrollTop(b(document).scrollTop()-\r
-e.scrollSpeed);else if(b(window).height()-(d.pageY-b(document).scrollTop())<e.scrollSensitivity)g=b(document).scrollTop(b(document).scrollTop()+e.scrollSpeed);if(d.pageX-b(document).scrollLeft()<e.scrollSensitivity)g=b(document).scrollLeft(b(document).scrollLeft()-e.scrollSpeed);else if(b(window).width()-(d.pageX-b(document).scrollLeft())<e.scrollSensitivity)g=b(document).scrollLeft(b(document).scrollLeft()+e.scrollSpeed)}g!==false&&b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,\r
-d)}this.positionAbs=this._convertPositionTo("absolute");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";for(e=this.items.length-1;e>=0;e--){g=this.items[e];var f=g.item[0],a=this._intersectsWithPointer(g);if(a)if(f!=this.currentItem[0]&&this.placeholder[a==1?"next":"prev"]()[0]!=f&&!b.ui.contains(this.placeholder[0],f)&&(this.options.type=="semi-dynamic"?!b.ui.contains(this.element[0],\r
-f):true)){this.direction=a==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(g))this._rearrange(d,g);else break;this._trigger("change",d,this._uiHash());break}}this._contactContainers(d);b.ui.ddmanager&&b.ui.ddmanager.drag(this,d);this._trigger("sort",d,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(d,e){if(d){b.ui.ddmanager&&!this.options.dropBehaviour&&b.ui.ddmanager.drop(this,d);if(this.options.revert){var g=this;e=g.placeholder.offset();\r
-g.reverting=true;b(this.helper).animate({left:e.left-this.offset.parent.left-g.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-g.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){g._clear(d)})}else this._clear(d,e);return false}},cancel:function(){var d=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):\r
-this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--){this.containers[e]._trigger("deactivate",null,d._uiHash(this));if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",null,d._uiHash(this));this.containers[e].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();b.extend(this,{helper:null,\r
-dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?b(this.domPosition.prev).after(this.currentItem):b(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(d){var e=this._getItemsAsjQuery(d&&d.connected),g=[];d=d||{};b(e).each(function(){var f=(b(d.item||this).attr(d.attribute||"id")||"").match(d.expression||/(.+)[-=_](.+)/);if(f)g.push((d.key||f[1]+"[]")+"="+(d.key&&d.expression?f[1]:f[2]))});!g.length&&d.key&&g.push(d.key+"=");return g.join("&")},\r
-toArray:function(d){var e=this._getItemsAsjQuery(d&&d.connected),g=[];d=d||{};e.each(function(){g.push(b(d.item||this).attr(d.attribute||"id")||"")});return g},_intersectsWith:function(d){var e=this.positionAbs.left,g=e+this.helperProportions.width,f=this.positionAbs.top,a=f+this.helperProportions.height,c=d.left,h=c+d.width,i=d.top,j=i+d.height,n=this.offset.click.top,p=this.offset.click.left;n=f+n>i&&f+n<j&&e+p>c&&e+p<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||\r
-this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>d[this.floating?"width":"height"]?n:c<e+this.helperProportions.width/2&&g-this.helperProportions.width/2<h&&i<f+this.helperProportions.height/2&&a-this.helperProportions.height/2<j},_intersectsWithPointer:function(d){var e=b.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top,d.height);d=b.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left,d.width);e=e&&d;d=this._getDragVerticalDirection();\r
-var g=this._getDragHorizontalDirection();if(!e)return false;return this.floating?g&&g=="right"||d=="down"?2:1:d&&(d=="down"?2:1)},_intersectsWithSides:function(d){var e=b.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top+d.height/2,d.height);d=b.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left+d.width/2,d.width);var g=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();return this.floating&&f?f=="right"&&d||f=="left"&&!d:g&&(g=="down"&&e||g=="up"&&!e)},\r
-_getDragVerticalDirection:function(){var d=this.positionAbs.top-this.lastPositionAbs.top;return d!=0&&(d>0?"down":"up")},_getDragHorizontalDirection:function(){var d=this.positionAbs.left-this.lastPositionAbs.left;return d!=0&&(d>0?"right":"left")},refresh:function(d){this._refreshItems(d);this.refreshPositions();return this},_connectWith:function(){var d=this.options;return d.connectWith.constructor==String?[d.connectWith]:d.connectWith},_getItemsAsjQuery:function(d){var e=[],g=[],f=this._connectWith();\r
-if(f&&d)for(d=f.length-1;d>=0;d--)for(var a=b(f[d]),c=a.length-1;c>=0;c--){var h=b.data(a[c],"sortable");if(h&&h!=this&&!h.options.disabled)g.push([b.isFunction(h.options.items)?h.options.items.call(h.element):b(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}g.push([b.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):b(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),\r
-this]);for(d=g.length-1;d>=0;d--)g[d][0].each(function(){e.push(this)});return b(e)},_removeCurrentsFromItems:function(){for(var d=this.currentItem.find(":data(sortable-item)"),e=0;e<this.items.length;e++)for(var g=0;g<d.length;g++)d[g]==this.items[e].item[0]&&this.items.splice(e,1)},_refreshItems:function(d){this.items=[];this.containers=[this];var e=this.items,g=[[b.isFunction(this.options.items)?this.options.items.call(this.element[0],d,{item:this.currentItem}):b(this.options.items,this.element),\r
-this]],f=this._connectWith();if(f)for(var a=f.length-1;a>=0;a--)for(var c=b(f[a]),h=c.length-1;h>=0;h--){var i=b.data(c[h],"sortable");if(i&&i!=this&&!i.options.disabled){g.push([b.isFunction(i.options.items)?i.options.items.call(i.element[0],d,{item:this.currentItem}):b(i.options.items,i.element),i]);this.containers.push(i)}}for(a=g.length-1;a>=0;a--){d=g[a][1];f=g[a][0];h=0;for(c=f.length;h<c;h++){i=b(f[h]);i.data("sortable-item",d);e.push({item:i,instance:d,width:0,height:0,left:0,top:0})}}},refreshPositions:function(d){if(this.offsetParent&&\r
-this.helper)this.offset.parent=this._getParentOffset();for(var e=this.items.length-1;e>=0;e--){var g=this.items[e],f=this.options.toleranceElement?b(this.options.toleranceElement,g.item):g.item;if(!d){g.width=f.outerWidth();g.height=f.outerHeight()}f=f.offset();g.left=f.left;g.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(e=this.containers.length-1;e>=0;e--){f=this.containers[e].element.offset();this.containers[e].containerCache.left=\r
-f.left;this.containers[e].containerCache.top=f.top;this.containers[e].containerCache.width=this.containers[e].element.outerWidth();this.containers[e].containerCache.height=this.containers[e].element.outerHeight()}return this},_createPlaceholder:function(d){var e=d||this,g=e.options;if(!g.placeholder||g.placeholder.constructor==String){var f=g.placeholder;g.placeholder={element:function(){var a=b(document.createElement(e.currentItem[0].nodeName)).addClass(f||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];\r
-if(!f)a.style.visibility="hidden";return a},update:function(a,c){if(!(f&&!g.forcePlaceholderSize)){c.height()||c.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10));c.width()||c.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10))}}}}e.placeholder=b(g.placeholder.element.call(e.element,e.currentItem));e.currentItem.after(e.placeholder);\r
-g.placeholder.update(e,e.placeholder)},_contactContainers:function(d){for(var e=null,g=null,f=this.containers.length-1;f>=0;f--)if(!b.ui.contains(this.currentItem[0],this.containers[f].element[0]))if(this._intersectsWith(this.containers[f].containerCache)){if(!(e&&b.ui.contains(this.containers[f].element[0],e.element[0]))){e=this.containers[f];g=f}}else if(this.containers[f].containerCache.over){this.containers[f]._trigger("out",d,this._uiHash(this));this.containers[f].containerCache.over=0}if(e)if(this.containers.length===\r
-1){this.containers[g]._trigger("over",d,this._uiHash(this));this.containers[g].containerCache.over=1}else if(this.currentContainer!=this.containers[g]){e=1E4;f=null;for(var a=this.positionAbs[this.containers[g].floating?"left":"top"],c=this.items.length-1;c>=0;c--)if(b.ui.contains(this.containers[g].element[0],this.items[c].item[0])){var h=this.items[c][this.containers[g].floating?"left":"top"];if(Math.abs(h-a)<e){e=Math.abs(h-a);f=this.items[c]}}if(f||this.options.dropOnEmpty){this.currentContainer=\r
-this.containers[g];f?this._rearrange(d,f,null,true):this._rearrange(d,null,this.containers[g].element,true);this._trigger("change",d,this._uiHash());this.containers[g]._trigger("change",d,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[g]._trigger("over",d,this._uiHash(this));this.containers[g].containerCache.over=1}}},_createHelper:function(d){var e=this.options;d=b.isFunction(e.helper)?b(e.helper.apply(this.element[0],[d,this.currentItem])):\r
-e.helper=="clone"?this.currentItem.clone():this.currentItem;d.parents("body").length||b(e.appendTo!="parent"?e.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]);if(d[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(d[0].style.width==""||e.forceHelperSize)d.width(this.currentItem.width());if(d[0].style.height==\r
-""||e.forceHelperSize)d.height(this.currentItem.height());return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(b.isArray(d))d={left:+d[0],top:+d[1]||0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=\r
-this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)d={top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),\r
-10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.currentItem.position();return{top:d.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions=\r
-{width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,b(d.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b(d.containment=="document"?document:window).height()||\r
-document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)){var e=b(d.containment)[0];d=b(d.containment).offset();var g=b(e).css("overflow")!="hidden";this.containment=[d.left+(parseInt(b(e).css("borderLeftWidth"),10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0)-this.margins.top,d.left+(g?Math.max(e.scrollWidth,\r
-e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(g?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(d,e){if(!e)e=this.position;d=d=="absolute"?1:-1;var g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=\r
-document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);return{top:e.top+this.offset.relative.top*d+this.offset.parent.top*d-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop())*d),left:e.left+this.offset.relative.left*d+this.offset.parent.left*d-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():\r
-f?0:g.scrollLeft())*d)}},_generatePosition:function(d){var e=this.options,g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var a=d.pageX,c=d.pageY;if(this.originalPosition){if(this.containment){if(d.pageX-\r
-this.offset.click.left<this.containment[0])a=this.containment[0]+this.offset.click.left;if(d.pageY-this.offset.click.top<this.containment[1])c=this.containment[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>this.containment[2])a=this.containment[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>this.containment[3])c=this.containment[3]+this.offset.click.top}if(e.grid){c=this.originalPageY+Math.round((c-this.originalPageY)/e.grid[1])*e.grid[1];c=this.containment?!(c-this.offset.click.top<\r
-this.containment[1]||c-this.offset.click.top>this.containment[3])?c:!(c-this.offset.click.top<this.containment[1])?c-e.grid[1]:c+e.grid[1]:c;a=this.originalPageX+Math.round((a-this.originalPageX)/e.grid[0])*e.grid[0];a=this.containment?!(a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2])?a:!(a-this.offset.click.left<this.containment[0])?a-e.grid[0]:a+e.grid[0]:a}}return{top:c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(b.browser.safari&&\r
-this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(b.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:g.scrollLeft())}},_rearrange:function(d,e,g,f){g?g[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?e.item[0]:e.item[0].nextSibling);this.counter=\r
-this.counter?++this.counter:1;var a=this,c=this.counter;window.setTimeout(function(){c==a.counter&&a.refreshPositions(!f)},0)},_clear:function(d,e){this.reverting=false;var g=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var f in this._storedCSS)if(this._storedCSS[f]=="auto"||this._storedCSS[f]=="static")this._storedCSS[f]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();\r
-this.fromOutside&&!e&&g.push(function(a){this._trigger("receive",a,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!e)g.push(function(a){this._trigger("update",a,this._uiHash())});if(!b.ui.contains(this.element[0],this.currentItem[0])){e||g.push(function(a){this._trigger("remove",a,this._uiHash())});for(f=this.containers.length-1;f>=0;f--)if(b.ui.contains(this.containers[f].element[0],\r
-this.currentItem[0])&&!e){g.push(function(a){return function(c){a._trigger("receive",c,this._uiHash(this))}}.call(this,this.containers[f]));g.push(function(a){return function(c){a._trigger("update",c,this._uiHash(this))}}.call(this,this.containers[f]))}}for(f=this.containers.length-1;f>=0;f--){e||g.push(function(a){return function(c){a._trigger("deactivate",c,this._uiHash(this))}}.call(this,this.containers[f]));if(this.containers[f].containerCache.over){g.push(function(a){return function(c){a._trigger("out",\r
-c,this._uiHash(this))}}.call(this,this.containers[f]));this.containers[f].containerCache.over=0}}this._storedCursor&&b("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(!e){this._trigger("beforeStop",d,this._uiHash());for(f=0;f<g.length;f++)g[f].call(this,d);this._trigger("stop",d,this._uiHash())}return false}e||\r
-this._trigger("beforeStop",d,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!e){for(f=0;f<g.length;f++)g[f].call(this,d);this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){b.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(d){var e=d||this;return{helper:e.helper,placeholder:e.placeholder||b([]),position:e.position,\r
-originalPosition:e.originalPosition,offset:e.positionAbs,item:e.currentItem,sender:d?d.element:null}}});b.extend(b.ui.sortable,{version:"1.8.11"})})(jQuery);\r
-jQuery.effects||function(b,d){function e(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],\r
-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(/rgba\(0, 0, 0, 0\)/.exec(l))return j.transparent;return j[b.trim(l).toLowerCase()]}function g(l,k){var m;do{m=b.curCSS(l,k);if(m!=""&&m!="transparent"||b.nodeName(l,"body"))break;k="backgroundColor"}while(l=l.parentNode);return e(m)}function f(){var l=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,\r
-k={},m,o;if(l&&l.length&&l[0]&&l[l[0]])for(var q=l.length;q--;){m=l[q];if(typeof l[m]=="string"){o=m.replace(/\-(\w)/g,function(s,r){return r.toUpperCase()});k[o]=l[m]}}else for(m in l)if(typeof l[m]==="string")k[m]=l[m];return k}function a(l){var k,m;for(k in l){m=l[k];if(m==null||b.isFunction(m)||k in p||/scrollbar/.test(k)||!/color/i.test(k)&&isNaN(parseFloat(m)))delete l[k]}return l}function c(l,k){var m={_:0},o;for(o in k)if(l[o]!=k[o])m[o]=k[o];return m}function h(l,k,m,o){if(typeof l=="object"){o=\r
-k;m=null;k=l;l=k.effect}if(b.isFunction(k)){o=k;m=null;k={}}if(typeof k=="number"||b.fx.speeds[k]){o=m;m=k;k={}}if(b.isFunction(m)){o=m;m=null}k=k||{};m=m||k.duration;m=b.fx.off?0:typeof m=="number"?m:m in b.fx.speeds?b.fx.speeds[m]:b.fx.speeds._default;o=o||k.complete;return[l,k,m,o]}function i(l){if(!l||typeof l==="number"||b.fx.speeds[l])return true;if(typeof l==="string"&&!b.effects[l])return true;return false}b.effects={};b.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",\r
-"borderTopColor","borderColor","color","outlineColor"],function(l,k){b.fx.step[k]=function(m){if(!m.colorInit){m.start=g(m.elem,k);m.end=e(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)+")"}});var j={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,\r
-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,\r
-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]},n=["add","remove","toggle"],p={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};b.effects.animateClass=function(l,k,m,\r
-o){if(b.isFunction(m)){o=m;m=null}return this.queue("fx",function(){var q=b(this),s=q.attr("style")||" ",r=a(f.call(this)),u,v=q.attr("className");b.each(n,function(w,y){l[y]&&q[y+"Class"](l[y])});u=a(f.call(this));q.attr("className",v);q.animate(c(r,u),k,m,function(){b.each(n,function(w,y){l[y]&&q[y+"Class"](l[y])});if(typeof q.attr("style")=="object"){q.attr("style").cssText="";q.attr("style").cssText=s}else q.attr("style",s);o&&o.apply(this,arguments)});r=b.queue(this);u=r.splice(r.length-1,1)[0];\r
-r.splice(1,0,u);b.dequeue(this)})};b.fn.extend({_addClass:b.fn.addClass,addClass:function(l,k,m,o){return k?b.effects.animateClass.apply(this,[{add:l},k,m,o]):this._addClass(l)},_removeClass:b.fn.removeClass,removeClass:function(l,k,m,o){return k?b.effects.animateClass.apply(this,[{remove:l},k,m,o]):this._removeClass(l)},_toggleClass:b.fn.toggleClass,toggleClass:function(l,k,m,o,q){return typeof k=="boolean"||k===d?m?b.effects.animateClass.apply(this,[k?{add:l}:{remove:l},m,o,q]):this._toggleClass(l,\r
-k):b.effects.animateClass.apply(this,[{toggle:l},k,m,o])},switchClass:function(l,k,m,o,q){return b.effects.animateClass.apply(this,[{add:k,remove:l},m,o,q])}});b.extend(b.effects,{version:"1.8.11",save:function(l,k){for(var m=0;m<k.length;m++)k[m]!==null&&l.data("ec.storage."+k[m],l[0].style[k[m]])},restore:function(l,k){for(var m=0;m<k.length;m++)k[m]!==null&&l.css(k[m],l.data("ec.storage."+k[m]))},setMode:function(l,k){if(k=="toggle")k=l.is(":hidden")?"show":"hide";return k},getBaseline:function(l,\r
-k){var m;switch(l[0]){case "top":m=0;break;case "middle":m=0.5;break;case "bottom":m=1;break;default:m=l[0]/k.height}switch(l[1]){case "left":l=0;break;case "center":l=0.5;break;case "right":l=1;break;default:l=l[1]/k.width}return{x:l,y:m}},createWrapper:function(l){if(l.parent().is(".ui-effects-wrapper"))return l.parent();var k={width:l.outerWidth(true),height:l.outerHeight(true),"float":l.css("float")},m=b("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",\r
-border:"none",margin:0,padding:0});l.wrap(m);m=l.parent();if(l.css("position")=="static"){m.css({position:"relative"});l.css({position:"relative"})}else{b.extend(k,{position:l.css("position"),zIndex:l.css("z-index")});b.each(["top","left","bottom","right"],function(o,q){k[q]=l.css(q);if(isNaN(parseInt(k[q],10)))k[q]="auto"});l.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return m.css(k).show()},removeWrapper:function(l){if(l.parent().is(".ui-effects-wrapper"))return l.parent().replaceWith(l);\r
-return l},setTransition:function(l,k,m,o){o=o||{};b.each(k,function(q,s){unit=l.cssUnit(s);if(unit[0]>0)o[s]=unit[0]*m+unit[1]});return o}});b.fn.extend({effect:function(l){var k=h.apply(this,arguments),m={options:k[1],duration:k[2],callback:k[3]};k=m.options.mode;var o=b.effects[l];if(b.fx.off||!o)return k?this[k](m.duration,m.callback):this.each(function(){m.callback&&m.callback.call(this)});return o.call(this,m)},_show:b.fn.show,show:function(l){if(i(l))return this._show.apply(this,arguments);\r
-else{var k=h.apply(this,arguments);k[1].mode="show";return this.effect.apply(this,k)}},_hide:b.fn.hide,hide:function(l){if(i(l))return this._hide.apply(this,arguments);else{var k=h.apply(this,arguments);k[1].mode="hide";return this.effect.apply(this,k)}},__toggle:b.fn.toggle,toggle:function(l){if(i(l)||typeof l==="boolean"||b.isFunction(l))return this.__toggle.apply(this,arguments);else{var k=h.apply(this,arguments);k[1].mode="toggle";return this.effect.apply(this,k)}},cssUnit:function(l){var k=this.css(l),\r
-m=[];b.each(["em","px","%","pt"],function(o,q){if(k.indexOf(q)>0)m=[parseFloat(k),q]});return m}});b.easing.jswing=b.easing.swing;b.extend(b.easing,{def:"easeOutQuad",swing:function(l,k,m,o,q){return b.easing[b.easing.def](l,k,m,o,q)},easeInQuad:function(l,k,m,o,q){return o*(k/=q)*k+m},easeOutQuad:function(l,k,m,o,q){return-o*(k/=q)*(k-2)+m},easeInOutQuad:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k+m;return-o/2*(--k*(k-2)-1)+m},easeInCubic:function(l,k,m,o,q){return o*(k/=q)*k*k+m},easeOutCubic:function(l,\r
-k,m,o,q){return o*((k=k/q-1)*k*k+1)+m},easeInOutCubic:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k+m;return o/2*((k-=2)*k*k+2)+m},easeInQuart:function(l,k,m,o,q){return o*(k/=q)*k*k*k+m},easeOutQuart:function(l,k,m,o,q){return-o*((k=k/q-1)*k*k*k-1)+m},easeInOutQuart:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k*k+m;return-o/2*((k-=2)*k*k*k-2)+m},easeInQuint:function(l,k,m,o,q){return o*(k/=q)*k*k*k*k+m},easeOutQuint:function(l,k,m,o,q){return o*((k=k/q-1)*k*k*k*k+1)+m},easeInOutQuint:function(l,\r
-k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k*k*k+m;return o/2*((k-=2)*k*k*k*k+2)+m},easeInSine:function(l,k,m,o,q){return-o*Math.cos(k/q*(Math.PI/2))+o+m},easeOutSine:function(l,k,m,o,q){return o*Math.sin(k/q*(Math.PI/2))+m},easeInOutSine:function(l,k,m,o,q){return-o/2*(Math.cos(Math.PI*k/q)-1)+m},easeInExpo:function(l,k,m,o,q){return k==0?m:o*Math.pow(2,10*(k/q-1))+m},easeOutExpo:function(l,k,m,o,q){return k==q?m+o:o*(-Math.pow(2,-10*k/q)+1)+m},easeInOutExpo:function(l,k,m,o,q){if(k==0)return m;if(k==\r
-q)return m+o;if((k/=q/2)<1)return o/2*Math.pow(2,10*(k-1))+m;return o/2*(-Math.pow(2,-10*--k)+2)+m},easeInCirc:function(l,k,m,o,q){return-o*(Math.sqrt(1-(k/=q)*k)-1)+m},easeOutCirc:function(l,k,m,o,q){return o*Math.sqrt(1-(k=k/q-1)*k)+m},easeInOutCirc:function(l,k,m,o,q){if((k/=q/2)<1)return-o/2*(Math.sqrt(1-k*k)-1)+m;return o/2*(Math.sqrt(1-(k-=2)*k)+1)+m},easeInElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q)==1)return m+o;s||(s=q*0.3);if(r<Math.abs(o)){r=o;l=s/4}else l=\r
-s/(2*Math.PI)*Math.asin(o/r);return-(r*Math.pow(2,10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s))+m},easeOutElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q)==1)return m+o;s||(s=q*0.3);if(r<Math.abs(o)){r=o;l=s/4}else l=s/(2*Math.PI)*Math.asin(o/r);return r*Math.pow(2,-10*k)*Math.sin((k*q-l)*2*Math.PI/s)+o+m},easeInOutElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q/2)==2)return m+o;s||(s=q*0.3*1.5);if(r<Math.abs(o)){r=o;l=s/4}else l=s/(2*Math.PI)*Math.asin(o/\r
-r);if(k<1)return-0.5*r*Math.pow(2,10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s)+m;return r*Math.pow(2,-10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s)*0.5+o+m},easeInBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;return o*(k/=q)*k*((s+1)*k-s)+m},easeOutBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;return o*((k=k/q-1)*k*((s+1)*k+s)+1)+m},easeInOutBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;if((k/=q/2)<1)return o/2*k*k*(((s*=1.525)+1)*k-s)+m;return o/2*((k-=2)*k*(((s*=1.525)+1)*k+s)+2)+m},easeInBounce:function(l,\r
-k,m,o,q){return o-b.easing.easeOutBounce(l,q-k,0,o,q)+m},easeOutBounce:function(l,k,m,o,q){return(k/=q)<1/2.75?o*7.5625*k*k+m:k<2/2.75?o*(7.5625*(k-=1.5/2.75)*k+0.75)+m:k<2.5/2.75?o*(7.5625*(k-=2.25/2.75)*k+0.9375)+m:o*(7.5625*(k-=2.625/2.75)*k+0.984375)+m},easeInOutBounce:function(l,k,m,o,q){if(k<q/2)return b.easing.easeInBounce(l,k*2,0,o,q)*0.5+m;return b.easing.easeOutBounce(l,k*2-q,0,o,q)*0.5+o*0.5+m}})}(jQuery);\r
-(function(b){b.effects.blind=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"vertical";b.effects.save(e,g);e.show();var c=b.effects.createWrapper(e).css({overflow:"hidden"}),h=a=="vertical"?"height":"width";a=a=="vertical"?c.height():c.width();f=="show"&&c.css(h,0);var i={};i[h]=f=="show"?a:0;c.animate(i,d.duration,d.options.easing,function(){f=="hide"&&e.hide();b.effects.restore(e,\r
-g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()})})}})(jQuery);\r
-(function(b){b.effects.bounce=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"effect"),a=d.options.direction||"up",c=d.options.distance||20,h=d.options.times||5,i=d.duration||250;/show|hide/.test(f)&&g.push("opacity");b.effects.save(e,g);e.show();b.effects.createWrapper(e);var j=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";c=d.options.distance||(j=="top"?e.outerHeight({margin:true})/3:e.outerWidth({margin:true})/\r
-3);if(f=="show")e.css("opacity",0).css(j,a=="pos"?-c:c);if(f=="hide")c/=h*2;f!="hide"&&h--;if(f=="show"){var n={opacity:1};n[j]=(a=="pos"?"+=":"-=")+c;e.animate(n,i/2,d.options.easing);c/=2;h--}for(n=0;n<h;n++){var p={},l={};p[j]=(a=="pos"?"-=":"+=")+c;l[j]=(a=="pos"?"+=":"-=")+c;e.animate(p,i/2,d.options.easing).animate(l,i/2,d.options.easing);c=f=="hide"?c*2:c/2}if(f=="hide"){n={opacity:0};n[j]=(a=="pos"?"-=":"+=")+c;e.animate(n,i/2,d.options.easing,function(){e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);\r
-d.callback&&d.callback.apply(this,arguments)})}else{p={};l={};p[j]=(a=="pos"?"-=":"+=")+c;l[j]=(a=="pos"?"+=":"-=")+c;e.animate(p,i/2,d.options.easing).animate(l,i/2,d.options.easing,function(){b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments)})}e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);\r
-(function(b){b.effects.clip=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"vertical";b.effects.save(e,g);e.show();var c=b.effects.createWrapper(e).css({overflow:"hidden"});c=e[0].tagName=="IMG"?c:e;var h={size:a=="vertical"?"height":"width",position:a=="vertical"?"top":"left"};a=a=="vertical"?c.height():c.width();if(f=="show"){c.css(h.size,0);c.css(h.position,\r
-a/2)}var i={};i[h.size]=f=="show"?a:0;i[h.position]=f=="show"?0:a/2;c.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.drop=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","opacity"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"left";b.effects.save(e,g);e.show();b.effects.createWrapper(e);var c=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";var h=d.options.distance||(c=="top"?e.outerHeight({margin:true})/2:e.outerWidth({margin:true})/2);if(f=="show")e.css("opacity",0).css(c,a=="pos"?-h:h);var i={opacity:f==\r
-"show"?1:0};i[c]=(f=="show"?a=="pos"?"+=":"-=":a=="pos"?"-=":"+=")+h;e.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.explode=function(d){return this.queue(function(){var e=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3,g=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3;d.options.mode=d.options.mode=="toggle"?b(this).is(":visible")?"hide":"show":d.options.mode;var f=b(this).show().css("visibility","hidden"),a=f.offset();a.top-=parseInt(f.css("marginTop"),10)||0;a.left-=parseInt(f.css("marginLeft"),10)||0;for(var c=f.outerWidth(true),h=f.outerHeight(true),i=0;i<e;i++)for(var j=\r
-0;j<g;j++)f.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(c/g),top:-i*(h/e)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:c/g,height:h/e,left:a.left+j*(c/g)+(d.options.mode=="show"?(j-Math.floor(g/2))*(c/g):0),top:a.top+i*(h/e)+(d.options.mode=="show"?(i-Math.floor(e/2))*(h/e):0),opacity:d.options.mode=="show"?0:1}).animate({left:a.left+j*(c/g)+(d.options.mode=="show"?0:(j-Math.floor(g/2))*(c/g)),top:a.top+\r
-i*(h/e)+(d.options.mode=="show"?0:(i-Math.floor(e/2))*(h/e)),opacity:d.options.mode=="show"?1:0},d.duration||500);setTimeout(function(){d.options.mode=="show"?f.css({visibility:"visible"}):f.css({visibility:"visible"}).hide();d.callback&&d.callback.apply(f[0]);f.dequeue();b("div.ui-effects-explode").remove()},d.duration||500)})}})(jQuery);\r
-(function(b){b.effects.fade=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"hide");e.animate({opacity:g},{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.fold=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.size||15,c=!!d.options.horizFirst,h=d.duration?d.duration/2:b.fx.speeds._default/2;b.effects.save(e,g);e.show();var i=b.effects.createWrapper(e).css({overflow:"hidden"}),j=f=="show"!=c,n=j?["width","height"]:["height","width"];j=j?[i.width(),i.height()]:[i.height(),i.width()];var p=/([0-9]+)%/.exec(a);if(p)a=parseInt(p[1],\r
-10)/100*j[f=="hide"?0:1];if(f=="show")i.css(c?{height:0,width:a}:{height:a,width:0});c={};p={};c[n[0]]=f=="show"?j[0]:a;p[n[1]]=f=="show"?j[1]:0;i.animate(c,h,d.options.easing).animate(p,h,d.options.easing,function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()})})}})(jQuery);\r
-(function(b){b.effects.highlight=function(d){return this.queue(function(){var e=b(this),g=["backgroundImage","backgroundColor","opacity"],f=b.effects.setMode(e,d.options.mode||"show"),a={backgroundColor:e.css("backgroundColor")};if(f=="hide")a.opacity=0;b.effects.save(e,g);e.show().css({backgroundImage:"none",backgroundColor:d.options.color||"#ffff99"}).animate(a,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);f=="show"&&!b.support.opacity&&\r
-this.style.removeAttribute("filter");d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.pulsate=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"show");times=(d.options.times||5)*2-1;duration=d.duration?d.duration/2:b.fx.speeds._default/2;isVisible=e.is(":visible");animateTo=0;if(!isVisible){e.css("opacity",0).show();animateTo=1}if(g=="hide"&&isVisible||g=="show"&&!isVisible)times--;for(g=0;g<times;g++){e.animate({opacity:animateTo},duration,d.options.easing);animateTo=(animateTo+1)%2}e.animate({opacity:animateTo},duration,\r
-d.options.easing,function(){animateTo==0&&e.hide();d.callback&&d.callback.apply(this,arguments)});e.queue("fx",function(){e.dequeue()}).dequeue()})}})(jQuery);\r
-(function(b){b.effects.puff=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"hide"),f=parseInt(d.options.percent,10)||150,a=f/100,c={height:e.height(),width:e.width()};b.extend(d.options,{fade:true,mode:g,percent:g=="hide"?f:100,from:g=="hide"?c:{height:c.height*a,width:c.width*a}});e.effect("scale",d.options,d.duration,d.callback);e.dequeue()})};b.effects.scale=function(d){return this.queue(function(){var e=b(this),g=b.extend(true,{},d.options),f=b.effects.setMode(e,\r
-d.options.mode||"effect"),a=parseInt(d.options.percent,10)||(parseInt(d.options.percent,10)==0?0:f=="hide"?0:100),c=d.options.direction||"both",h=d.options.origin;if(f!="effect"){g.origin=h||["middle","center"];g.restore=true}h={height:e.height(),width:e.width()};e.from=d.options.from||(f=="show"?{height:0,width:0}:h);a={y:c!="horizontal"?a/100:1,x:c!="vertical"?a/100:1};e.to={height:h.height*a.y,width:h.width*a.x};if(d.options.fade){if(f=="show"){e.from.opacity=0;e.to.opacity=1}if(f=="hide"){e.from.opacity=\r
-1;e.to.opacity=0}}g.from=e.from;g.to=e.to;g.mode=f;e.effect("size",g,d.duration,d.callback);e.dequeue()})};b.effects.size=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","width","height","overflow","opacity"],f=["position","top","bottom","left","right","overflow","opacity"],a=["width","height","overflow"],c=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],i=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],\r
-j=b.effects.setMode(e,d.options.mode||"effect"),n=d.options.restore||false,p=d.options.scale||"both",l=d.options.origin,k={height:e.height(),width:e.width()};e.from=d.options.from||k;e.to=d.options.to||k;if(l){l=b.effects.getBaseline(l,k);e.from.top=(k.height-e.from.height)*l.y;e.from.left=(k.width-e.from.width)*l.x;e.to.top=(k.height-e.to.height)*l.y;e.to.left=(k.width-e.to.width)*l.x}var m={from:{y:e.from.height/k.height,x:e.from.width/k.width},to:{y:e.to.height/k.height,x:e.to.width/k.width}};\r
-if(p=="box"||p=="both"){if(m.from.y!=m.to.y){g=g.concat(h);e.from=b.effects.setTransition(e,h,m.from.y,e.from);e.to=b.effects.setTransition(e,h,m.to.y,e.to)}if(m.from.x!=m.to.x){g=g.concat(i);e.from=b.effects.setTransition(e,i,m.from.x,e.from);e.to=b.effects.setTransition(e,i,m.to.x,e.to)}}if(p=="content"||p=="both")if(m.from.y!=m.to.y){g=g.concat(c);e.from=b.effects.setTransition(e,c,m.from.y,e.from);e.to=b.effects.setTransition(e,c,m.to.y,e.to)}b.effects.save(e,n?g:f);e.show();b.effects.createWrapper(e);\r
-e.css("overflow","hidden").css(e.from);if(p=="content"||p=="both"){h=h.concat(["marginTop","marginBottom"]).concat(c);i=i.concat(["marginLeft","marginRight"]);a=g.concat(h).concat(i);e.find("*[width]").each(function(){child=b(this);n&&b.effects.save(child,a);var o={height:child.height(),width:child.width()};child.from={height:o.height*m.from.y,width:o.width*m.from.x};child.to={height:o.height*m.to.y,width:o.width*m.to.x};if(m.from.y!=m.to.y){child.from=b.effects.setTransition(child,h,m.from.y,child.from);\r
-child.to=b.effects.setTransition(child,h,m.to.y,child.to)}if(m.from.x!=m.to.x){child.from=b.effects.setTransition(child,i,m.from.x,child.from);child.to=b.effects.setTransition(child,i,m.to.x,child.to)}child.css(child.from);child.animate(child.to,d.duration,d.options.easing,function(){n&&b.effects.restore(child,a)})})}e.animate(e.to,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e.to.opacity===0&&e.css("opacity",e.from.opacity);j=="hide"&&e.hide();b.effects.restore(e,\r
-n?g:f);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.shake=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"];b.effects.setMode(e,d.options.mode||"effect");var f=d.options.direction||"left",a=d.options.distance||20,c=d.options.times||3,h=d.duration||d.options.duration||140;b.effects.save(e,g);e.show();b.effects.createWrapper(e);var i=f=="up"||f=="down"?"top":"left",j=f=="up"||f=="left"?"pos":"neg";f={};var n={},p={};f[i]=(j=="pos"?"-=":"+=")+a;n[i]=(j=="pos"?"+=":"-=")+a*2;p[i]=\r
-(j=="pos"?"-=":"+=")+a*2;e.animate(f,h,d.options.easing);for(a=1;a<c;a++)e.animate(n,h,d.options.easing).animate(p,h,d.options.easing);e.animate(n,h,d.options.easing).animate(f,h/2,d.options.easing,function(){b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments)});e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);\r
-(function(b){b.effects.slide=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"show"),a=d.options.direction||"left";b.effects.save(e,g);e.show();b.effects.createWrapper(e).css({overflow:"hidden"});var c=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";var h=d.options.distance||(c=="top"?e.outerHeight({margin:true}):e.outerWidth({margin:true}));if(f=="show")e.css(c,a=="pos"?isNaN(h)?"-"+h:-h:h);\r
-var i={};i[c]=(f=="show"?a=="pos"?"+=":"-=":a=="pos"?"-=":"+=")+h;e.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);\r
-(function(b){b.effects.transfer=function(d){return this.queue(function(){var e=b(this),g=b(d.options.to),f=g.offset();g={top:f.top,left:f.left,height:g.innerHeight(),width:g.innerWidth()};f=e.offset();var a=b('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(d.options.className).css({top:f.top,left:f.left,height:e.innerHeight(),width:e.innerWidth(),position:"absolute"}).animate(g,d.duration,d.options.easing,function(){a.remove();d.callback&&d.callback.apply(e[0],arguments);\r
-e.dequeue()})})}})(jQuery);\r
-(function(b){b.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> 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,e=d.options;d.running=0;d.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");d.headers=\r
-d.element.find(e.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){e.disabled||b(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){e.disabled||b(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){e.disabled||b(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){e.disabled||b(this).removeClass("ui-state-focus")});d.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");\r
-if(e.navigation){var g=d.element.find("a").filter(e.navigationFilter).eq(0);if(g.length){var f=g.closest(".ui-accordion-header");d.active=f.length?f:g.closest(".ui-accordion-content").prev()}}d.active=d._findActive(d.active||e.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");d.active.next().addClass("ui-accordion-content-active");d._createIcons();d.resize();d.element.attr("role","tablist");d.headers.attr("role","tab").bind("keydown.accordion",\r
-function(a){return d._keydown(a)}).next().attr("role","tabpanel");d.headers.not(d.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();d.active.length?d.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):d.headers.eq(0).attr("tabIndex",0);b.browser.safari||d.headers.find("a").attr("tabIndex",-1);e.event&&d.headers.bind(e.event.split(" ").join(".accordion ")+".accordion",function(a){d._clickHandler.call(d,a,this);a.preventDefault()})},_createIcons:function(){var d=\r
-this.options;if(d.icons){b("<span></span>").addClass("ui-icon "+d.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(d.icons.header).toggleClass(d.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 d=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");\r
-this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var e=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(d.autoHeight||d.fillHeight)e.css("height","");return b.Widget.prototype.destroy.call(this)},_setOption:function(d,e){b.Widget.prototype._setOption.apply(this,arguments);d=="active"&&this.activate(e);if(d=="icons"){this._destroyIcons();\r
-e&&this._createIcons()}if(d=="disabled")this.headers.add(this.headers.next())[e?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(d){if(!(this.options.disabled||d.altKey||d.ctrlKey)){var e=b.ui.keyCode,g=this.headers.length,f=this.headers.index(d.target),a=false;switch(d.keyCode){case e.RIGHT:case e.DOWN:a=this.headers[(f+1)%g];break;case e.LEFT:case e.UP:a=this.headers[(f-1+g)%g];break;case e.SPACE:case e.ENTER:this._clickHandler({target:d.target},d.target);\r
-d.preventDefault()}if(a){b(d.target).attr("tabIndex",-1);b(a).attr("tabIndex",0);a.focus();return false}return true}},resize:function(){var d=this.options,e;if(d.fillSpace){if(b.browser.msie){var g=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}e=this.element.parent().height();b.browser.msie&&this.element.parent().css("overflow",g);this.headers.each(function(){e-=b(this).outerHeight(true)});this.headers.next().each(function(){b(this).height(Math.max(0,e-b(this).innerHeight()+\r
-b(this).height()))}).css("overflow","auto")}else if(d.autoHeight){e=0;this.headers.next().each(function(){e=Math.max(e,b(this).height("").height())}).height(e)}return this},activate:function(d){this.options.active=d;d=this._findActive(d)[0];this._clickHandler({target:d},d);return this},_findActive:function(d){return d?typeof d==="number"?this.headers.filter(":eq("+d+")"):this.headers.not(this.headers.not(d)):d===false?b([]):this.headers.filter(":eq(0)")},_clickHandler:function(d,e){var g=this.options;\r
-if(!g.disabled)if(d.target){d=b(d.currentTarget||e);e=d[0]===this.active[0];g.active=g.collapsible&&e?false:this.headers.index(d);if(!(this.running||!g.collapsible&&e)){var f=this.active;i=d.next();c=this.active.next();h={options:g,newHeader:e&&g.collapsible?b([]):d,oldHeader:this.active,newContent:e&&g.collapsible?b([]):i,oldContent:c};var a=this.headers.index(this.active[0])>this.headers.index(d[0]);this.active=e?b([]):d;this._toggle(i,c,h,e,a);f.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(g.icons.headerSelected).addClass(g.icons.header);\r
-if(!e){d.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(g.icons.header).addClass(g.icons.headerSelected);d.next().addClass("ui-accordion-content-active")}}}else if(g.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(g.icons.headerSelected).addClass(g.icons.header);this.active.next().addClass("ui-accordion-content-active");var c=this.active.next(),\r
-h={options:g,newHeader:b([]),oldHeader:g.active,newContent:b([]),oldContent:c},i=this.active=b([]);this._toggle(i,c,h)}},_toggle:function(d,e,g,f,a){var c=this,h=c.options;c.toShow=d;c.toHide=e;c.data=g;var i=function(){if(c)return c._completed.apply(c,arguments)};c._trigger("changestart",null,c.data);c.running=e.size()===0?d.size():e.size();if(h.animated){g={};g=h.collapsible&&f?{toShow:b([]),toHide:e,complete:i,down:a,autoHeight:h.autoHeight||h.fillSpace}:{toShow:d,toHide:e,complete:i,down:a,autoHeight:h.autoHeight||\r
-h.fillSpace};if(!h.proxied)h.proxied=h.animated;if(!h.proxiedDuration)h.proxiedDuration=h.duration;h.animated=b.isFunction(h.proxied)?h.proxied(g):h.proxied;h.duration=b.isFunction(h.proxiedDuration)?h.proxiedDuration(g):h.proxiedDuration;f=b.ui.accordion.animations;var j=h.duration,n=h.animated;if(n&&!f[n]&&!b.easing[n])n="slide";f[n]||(f[n]=function(p){this.slide(p,{easing:n,duration:j||700})});f[n](g)}else{if(h.collapsible&&f)d.toggle();else{e.hide();d.show()}i(true)}e.prev().attr({"aria-expanded":"false",\r
-"aria-selected":"false",tabIndex:-1}).blur();d.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(d){this.running=d?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)}}});b.extend(b.ui.accordion,{version:"1.8.11",\r
-animations:{slide:function(d,e){d=b.extend({easing:"swing",duration:300},d,e);if(d.toHide.size())if(d.toShow.size()){var g=d.toShow.css("overflow"),f=0,a={},c={},h;e=d.toShow;h=e[0].style.width;e.width(parseInt(e.parent().width(),10)-parseInt(e.css("paddingLeft"),10)-parseInt(e.css("paddingRight"),10)-(parseInt(e.css("borderLeftWidth"),10)||0)-(parseInt(e.css("borderRightWidth"),10)||0));b.each(["height","paddingTop","paddingBottom"],function(i,j){c[j]="hide";i=(""+b.css(d.toShow[0],j)).match(/^([\d+-.]+)(.*)$/);\r
-a[j]={value:i[1],unit:i[2]||"px"}});d.toShow.css({height:0,overflow:"hidden"}).show();d.toHide.filter(":hidden").each(d.complete).end().filter(":visible").animate(c,{step:function(i,j){if(j.prop=="height")f=j.end-j.start===0?0:(j.now-j.start)/(j.end-j.start);d.toShow[0].style[j.prop]=f*a[j.prop].value+a[j.prop].unit},duration:d.duration,easing:d.easing,complete:function(){d.autoHeight||d.toShow.css("height","");d.toShow.css({width:h,overflow:g});d.complete()}})}else d.toHide.animate({height:"hide",\r
-paddingTop:"hide",paddingBottom:"hide"},d);else d.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},d)},bounceslide:function(d){this.slide(d,{easing:d.down?"easeOutBounce":"swing",duration:d.down?1E3:200})}}})})(jQuery);\r
-(function(b){var d=0;b.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 e=this,g=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(a){if(!(e.options.disabled||e.element.attr("readonly"))){f=\r
-false;var c=b.ui.keyCode;switch(a.keyCode){case c.PAGE_UP:e._move("previousPage",a);break;case c.PAGE_DOWN:e._move("nextPage",a);break;case c.UP:e._move("previous",a);a.preventDefault();break;case c.DOWN:e._move("next",a);a.preventDefault();break;case c.ENTER:case c.NUMPAD_ENTER:if(e.menu.active){f=true;a.preventDefault()}case c.TAB:if(!e.menu.active)return;e.menu.select(a);break;case c.ESCAPE:e.element.val(e.term);e.close(a);break;default:clearTimeout(e.searching);e.searching=setTimeout(function(){if(e.term!=\r
-e.element.val()){e.selectedItem=null;e.search(null,a)}},e.options.delay);break}}}).bind("keypress.autocomplete",function(a){if(f){f=false;a.preventDefault()}}).bind("focus.autocomplete",function(){if(!e.options.disabled){e.selectedItem=null;e.previous=e.element.val()}}).bind("blur.autocomplete",function(a){if(!e.options.disabled){clearTimeout(e.searching);e.closing=setTimeout(function(){e.close(a);e._change(a)},150)}});this._initSource();this.response=function(){return e._response.apply(e,arguments)};\r
-this.menu=b("<ul></ul>").addClass("ui-autocomplete").appendTo(b(this.options.appendTo||"body",g)[0]).mousedown(function(a){var c=e.menu.element[0];b(a.target).closest(".ui-menu-item").length||setTimeout(function(){b(document).one("mousedown",function(h){h.target!==e.element[0]&&h.target!==c&&!b.ui.contains(c,h.target)&&e.close()})},1);setTimeout(function(){clearTimeout(e.closing)},13)}).menu({focus:function(a,c){c=c.item.data("item.autocomplete");false!==e._trigger("focus",a,{item:c})&&/^key/.test(a.originalEvent.type)&&\r
-e.element.val(c.value)},selected:function(a,c){var h=c.item.data("item.autocomplete"),i=e.previous;if(e.element[0]!==g.activeElement){e.element.focus();e.previous=i;setTimeout(function(){e.previous=i;e.selectedItem=h},1)}false!==e._trigger("select",a,{item:h})&&e.element.val(h.value);e.term=e.element.val();e.close(a);e.selectedItem=h},blur:function(){e.menu.element.is(":visible")&&e.element.val()!==e.term&&e.element.val(e.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");\r
-b.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();b.Widget.prototype.destroy.call(this)},_setOption:function(e,g){b.Widget.prototype._setOption.apply(this,arguments);e==="source"&&this._initSource();if(e==="appendTo")this.menu.element.appendTo(b(g||"body",this.element[0].ownerDocument)[0]);e==="disabled"&&\r
-g&&this.xhr&&this.xhr.abort()},_initSource:function(){var e=this,g,f;if(b.isArray(this.options.source)){g=this.options.source;this.source=function(a,c){c(b.ui.autocomplete.filter(g,a.term))}}else if(typeof this.options.source==="string"){f=this.options.source;this.source=function(a,c){e.xhr&&e.xhr.abort();e.xhr=b.ajax({url:f,data:a,dataType:"json",autocompleteRequest:++d,success:function(h){this.autocompleteRequest===d&&c(h)},error:function(){this.autocompleteRequest===d&&c([])}})}}else this.source=\r
-this.options.source},search:function(e,g){e=e!=null?e:this.element.val();this.term=this.element.val();if(e.length<this.options.minLength)return this.close(g);clearTimeout(this.closing);if(this._trigger("search",g)!==false)return this._search(e)},_search:function(e){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:e},this.response)},_response:function(e){if(!this.options.disabled&&e&&e.length){e=this._normalize(e);this._suggest(e);this._trigger("open")}else this.close();\r
-this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(e){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",e)}},_change:function(e){this.previous!==this.element.val()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(e){if(e.length&&e[0].label&&e[0].value)return e;return b.map(e,function(g){if(typeof g==="string")return{label:g,value:g};return b.extend({label:g.label||\r
-g.value,value:g.value||g.label},g)})},_suggest:function(e){var g=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(g,e);this.menu.deactivate();this.menu.refresh();g.show();this._resizeMenu();g.position(b.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new b.Event("mouseover"))},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(e,g){var f=this;\r
-b.each(g,function(a,c){f._renderItem(e,c)})},_renderItem:function(e,g){return b("<li></li>").data("item.autocomplete",g).append(b("<a></a>").text(g.label)).appendTo(e)},_move:function(e,g){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(e)||this.menu.last()&&/^next/.test(e)){this.element.val(this.term);this.menu.deactivate()}else this.menu[e](g);else this.search(null,g)},widget:function(){return this.menu.element}});b.extend(b.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,\r
-"\\$&")},filter:function(e,g){var f=new RegExp(b.ui.autocomplete.escapeRegex(g),"i");return b.grep(e,function(a){return f.test(a.label||a.value||a)})}})})(jQuery);\r
-(function(b){b.widget("ui.menu",{_create:function(){var d=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(e){if(b(e.target).closest(".ui-menu-item a").length){e.preventDefault();d.select(e)}});this.refresh()},refresh:function(){var d=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",\r
--1).mouseenter(function(e){d.activate(e,b(this).parent())}).mouseleave(function(){d.deactivate()})},activate:function(d,e){this.deactivate();if(this.hasScroll()){var g=e.offset().top-this.element.offset().top,f=this.element.attr("scrollTop"),a=this.element.height();if(g<0)this.element.attr("scrollTop",f+g);else g>=a&&this.element.attr("scrollTop",f+g-a+e.height())}this.active=e.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",d,{item:e})},\r
-deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(d){this.move("next",".ui-menu-item:first",d)},previous:function(d){this.move("prev",".ui-menu-item:last",d)},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(d,e,g){if(this.active){d=this.active[d+"All"](".ui-menu-item").eq(0);\r
-d.length?this.activate(g,d):this.activate(g,this.element.children(e))}else this.activate(g,this.element.children(e))},nextPage:function(d){if(this.hasScroll())if(!this.active||this.last())this.activate(d,this.element.children(".ui-menu-item:first"));else{var e=this.active.offset().top,g=this.element.height(),f=this.element.children(".ui-menu-item").filter(function(){var a=b(this).offset().top-e-g+b(this).height();return a<10&&a>-10});f.length||(f=this.element.children(".ui-menu-item:last"));this.activate(d,\r
-f)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(d){if(this.hasScroll())if(!this.active||this.first())this.activate(d,this.element.children(".ui-menu-item:last"));else{var e=this.active.offset().top,g=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var f=b(this).offset().top-e+g-b(this).height();return f<10&&f>-10});result.length||(result=this.element.children(".ui-menu-item:first"));\r
-this.activate(d,result)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(d){this._trigger("selected",d,{item:this.active})}})})(jQuery);\r
-(function(b){var d,e=function(f){b(":ui-button",f.target.form).each(function(){var a=b(this).data("button");setTimeout(function(){a.refresh()},1)})},g=function(f){var a=f.name,c=f.form,h=b([]);if(a)h=c?b(c).find("[name='"+a+"']"):b("[name='"+a+"']",f.ownerDocument).filter(function(){return!this.form});return h};b.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",\r
-e);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var f=this,a=this.options,c=this.type==="checkbox"||this.type==="radio",h="ui-state-hover"+(!c?" ui-state-active":"");if(a.label===null)a.label=this.buttonElement.html();if(this.element.is(":disabled"))a.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",\r
-function(){if(!a.disabled){b(this).addClass("ui-state-hover");this===d&&b(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){a.disabled||b(this).removeClass(h)}).bind("focus.button",function(){b(this).addClass("ui-state-focus")}).bind("blur.button",function(){b(this).removeClass("ui-state-focus")});c&&this.element.bind("change.button",function(){f.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(a.disabled)return false;b(this).toggleClass("ui-state-active");\r
-f.buttonElement.attr("aria-pressed",f.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(a.disabled)return false;b(this).addClass("ui-state-active");f.buttonElement.attr("aria-pressed",true);var i=f.element[0];g(i).not(i).map(function(){return b(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(a.disabled)return false;b(this).addClass("ui-state-active");\r
-d=this;b(document).one("mouseup",function(){d=null})}).bind("mouseup.button",function(){if(a.disabled)return false;b(this).removeClass("ui-state-active")}).bind("keydown.button",function(i){if(a.disabled)return false;if(i.keyCode==b.ui.keyCode.SPACE||i.keyCode==b.ui.keyCode.ENTER)b(this).addClass("ui-state-active")}).bind("keyup.button",function(){b(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(i){i.keyCode===b.ui.keyCode.SPACE&&b(this).click()})}this._setOption("disabled",\r
-a.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){var f=this.element.parents().filter(":last"),a="label[for="+this.element.attr("id")+"]";this.buttonElement=f.find(a);if(!this.buttonElement.length){f=f.length?f.siblings():this.element.siblings();this.buttonElement=f.filter(a);if(!this.buttonElement.length)this.buttonElement=f.find(a)}this.element.addClass("ui-helper-hidden-accessible");\r
-(f=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",f)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());\r
-this.hasTitle||this.buttonElement.removeAttr("title");b.Widget.prototype.destroy.call(this)},_setOption:function(f,a){b.Widget.prototype._setOption.apply(this,arguments);if(f==="disabled")a?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var f=this.element.is(":disabled");f!==this.options.disabled&&this._setOption("disabled",f);if(this.type==="radio")g(this.element[0]).each(function(){b(this).is(":checked")?b(this).button("widget").addClass("ui-state-active").attr("aria-pressed",\r
-true):b(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var f=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),\r
-a=b("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(f.empty()).text(),c=this.options.icons,h=c.primary&&c.secondary,i=[];if(c.primary||c.secondary){if(this.options.text)i.push("ui-button-text-icon"+(h?"s":c.primary?"-primary":"-secondary"));c.primary&&f.prepend("<span class='ui-button-icon-primary ui-icon "+c.primary+"'></span>");c.secondary&&f.append("<span class='ui-button-icon-secondary ui-icon "+c.secondary+"'></span>");if(!this.options.text){i.push(h?"ui-button-icons-only":\r
-"ui-button-icon-only");this.hasTitle||f.attr("title",a)}}else i.push("ui-button-text-only");f.addClass(i.join(" "))}}});b.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(f,a){f==="disabled"&&this.buttons.button("option",f,a);b.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 b(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()},\r
-destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");b.Widget.prototype.destroy.call(this)}})})(jQuery);\r
-(function(b,d){function e(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=\r
-"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",\r
-"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",\r
-minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};b.extend(this._defaults,this.regional[""]);this.dpDiv=b('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function g(a,c){b.extend(a,c);for(var h in c)if(c[h]==\r
-null||c[h]==d)a[h]=c[h];return a}b.extend(b.ui,{datepicker:{version:"1.8.11"}});var f=(new Date).getTime();b.extend(e.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){g(this._defaults,a||{});return this},_attachDatepicker:function(a,c){var h=null;for(var i in this._defaults){var j=a.getAttribute("date:"+i);if(j){h=h||{};try{h[i]=eval(j)}catch(n){h[i]=j}}}i=a.nodeName.toLowerCase();\r
-j=i=="div"||i=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var p=this._newInst(b(a),j);p.settings=b.extend({},c||{},h||{});if(i=="input")this._connectDatepicker(a,p);else j&&this._inlineDatepicker(a,p)},_newInst:function(a,c){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:c,dpDiv:!c?this.dpDiv:b('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},\r
-_connectDatepicker:function(a,c){var h=b(a);c.append=b([]);c.trigger=b([]);if(!h.hasClass(this.markerClassName)){this._attachments(h,c);h.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(i,j,n){c.settings[j]=n}).bind("getData.datepicker",function(i,j){return this._get(c,j)});this._autoSize(c);b.data(a,"datepicker",c)}},_attachments:function(a,c){var h=this._get(c,"appendText"),i=this._get(c,"isRTL");c.append&&\r
-c.append.remove();if(h){c.append=b('<span class="'+this._appendClass+'">'+h+"</span>");a[i?"before":"after"](c.append)}a.unbind("focus",this._showDatepicker);c.trigger&&c.trigger.remove();h=this._get(c,"showOn");if(h=="focus"||h=="both")a.focus(this._showDatepicker);if(h=="button"||h=="both"){h=this._get(c,"buttonText");var j=this._get(c,"buttonImage");c.trigger=b(this._get(c,"buttonImageOnly")?b("<img/>").addClass(this._triggerClass).attr({src:j,alt:h,title:h}):b('<button type="button"></button>').addClass(this._triggerClass).html(j==\r
-""?h:b("<img/>").attr({src:j,alt:h,title:h})));a[i?"before":"after"](c.trigger);c.trigger.click(function(){b.datepicker._datepickerShowing&&b.datepicker._lastInput==a[0]?b.datepicker._hideDatepicker():b.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var c=new Date(2009,11,20),h=this._get(a,"dateFormat");if(h.match(/[DM]/)){var i=function(j){for(var n=0,p=0,l=0;l<j.length;l++)if(j[l].length>n){n=j[l].length;p=l}return p};c.setMonth(i(this._get(a,\r
-h.match(/MM/)?"monthNames":"monthNamesShort")));c.setDate(i(this._get(a,h.match(/DD/)?"dayNames":"dayNamesShort"))+20-c.getDay())}a.input.attr("size",this._formatDate(a,c).length)}},_inlineDatepicker:function(a,c){var h=b(a);if(!h.hasClass(this.markerClassName)){h.addClass(this.markerClassName).append(c.dpDiv).bind("setData.datepicker",function(i,j,n){c.settings[j]=n}).bind("getData.datepicker",function(i,j){return this._get(c,j)});b.data(a,"datepicker",c);this._setDate(c,this._getDefaultDate(c),\r
-true);this._updateDatepicker(c);this._updateAlternate(c);c.dpDiv.show()}},_dialogDatepicker:function(a,c,h,i,j){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=b('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);b("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};b.data(this._dialogInput[0],"datepicker",a)}g(a.settings,i||{});\r
-c=c&&c.constructor==Date?this._formatDate(a,c):c;this._dialogInput.val(c);this._pos=j?j.length?j:[j.pageX,j.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=h;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);\r
-this._showDatepicker(this._dialogInput[0]);b.blockUI&&b.blockUI(this.dpDiv);b.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();b.removeData(a,"datepicker");if(i=="input"){h.append.remove();h.trigger.remove();c.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",\r
-this._doKeyUp)}else if(i=="div"||i=="span")c.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();if(i=="input"){a.disabled=false;h.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(i=="div"||i=="span")c.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=b.map(this._disabledInputs,\r
-function(j){return j==a?null:j})}},_disableDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();if(i=="input"){a.disabled=true;h.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(i=="div"||i=="span")c.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=b.map(this._disabledInputs,function(j){return j==a?null:\r
-j});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var c=0;c<this._disabledInputs.length;c++)if(this._disabledInputs[c]==a)return true;return false},_getInst:function(a){try{return b.data(a,"datepicker")}catch(c){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,c,h){var i=this._getInst(a);if(arguments.length==2&&typeof c=="string")return c=="defaults"?b.extend({},b.datepicker._defaults):i?c=="all"?b.extend({},\r
-i.settings):this._get(i,c):null;var j=c||{};if(typeof c=="string"){j={};j[c]=h}if(i){this._curInst==i&&this._hideDatepicker();var n=this._getDateDatepicker(a,true),p=this._getMinMaxDate(i,"min"),l=this._getMinMaxDate(i,"max");g(i.settings,j);if(p!==null&&j.dateFormat!==d&&j.minDate===d)i.settings.minDate=this._formatDate(i,p);if(l!==null&&j.dateFormat!==d&&j.maxDate===d)i.settings.maxDate=this._formatDate(i,l);this._attachments(b(a),i);this._autoSize(i);this._setDateDatepicker(a,n);this._updateDatepicker(i)}},\r
-_changeDatepicker:function(a,c,h){this._optionDatepicker(a,c,h)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,c){if(a=this._getInst(a)){this._setDate(a,c);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,c){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,c);return a?this._getDate(a):null},_doKeyDown:function(a){var c=b.datepicker._getInst(a.target),h=true,i=c.dpDiv.is(".ui-datepicker-rtl");\r
-c._keyEvent=true;if(b.datepicker._datepickerShowing)switch(a.keyCode){case 9:b.datepicker._hideDatepicker();h=false;break;case 13:h=b("td."+b.datepicker._dayOverClass+":not(."+b.datepicker._currentClass+")",c.dpDiv);h[0]?b.datepicker._selectDay(a.target,c.selectedMonth,c.selectedYear,h[0]):b.datepicker._hideDatepicker();return false;case 27:b.datepicker._hideDatepicker();break;case 33:b.datepicker._adjustDate(a.target,a.ctrlKey?-b.datepicker._get(c,"stepBigMonths"):-b.datepicker._get(c,"stepMonths"),\r
-"M");break;case 34:b.datepicker._adjustDate(a.target,a.ctrlKey?+b.datepicker._get(c,"stepBigMonths"):+b.datepicker._get(c,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)b.datepicker._clearDate(a.target);h=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)b.datepicker._gotoToday(a.target);h=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,i?+1:-1,"D");h=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)b.datepicker._adjustDate(a.target,a.ctrlKey?\r
--b.datepicker._get(c,"stepBigMonths"):-b.datepicker._get(c,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,-7,"D");h=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,i?-1:+1,"D");h=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)b.datepicker._adjustDate(a.target,a.ctrlKey?+b.datepicker._get(c,"stepBigMonths"):+b.datepicker._get(c,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,\r
-+7,"D");h=a.ctrlKey||a.metaKey;break;default:h=false}else if(a.keyCode==36&&a.ctrlKey)b.datepicker._showDatepicker(this);else h=false;if(h){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var c=b.datepicker._getInst(a.target);if(b.datepicker._get(c,"constrainInput")){c=b.datepicker._possibleChars(b.datepicker._get(c,"dateFormat"));var h=String.fromCharCode(a.charCode==d?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||h<" "||!c||c.indexOf(h)>-1}},_doKeyUp:function(a){a=b.datepicker._getInst(a.target);\r
-if(a.input.val()!=a.lastVal)try{if(b.datepicker.parseDate(b.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,b.datepicker._getFormatConfig(a))){b.datepicker._setDateFromField(a);b.datepicker._updateAlternate(a);b.datepicker._updateDatepicker(a)}}catch(c){b.datepicker.log(c)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=b("input",a.parentNode)[0];if(!(b.datepicker._isDisabledDatepicker(a)||b.datepicker._lastInput==a)){var c=b.datepicker._getInst(a);\r
-b.datepicker._curInst&&b.datepicker._curInst!=c&&b.datepicker._curInst.dpDiv.stop(true,true);var h=b.datepicker._get(c,"beforeShow");g(c.settings,h?h.apply(a,[a,c]):{});c.lastVal=null;b.datepicker._lastInput=a;b.datepicker._setDateFromField(c);if(b.datepicker._inDialog)a.value="";if(!b.datepicker._pos){b.datepicker._pos=b.datepicker._findPos(a);b.datepicker._pos[1]+=a.offsetHeight}var i=false;b(a).parents().each(function(){i|=b(this).css("position")=="fixed";return!i});if(i&&b.browser.opera){b.datepicker._pos[0]-=\r
-document.documentElement.scrollLeft;b.datepicker._pos[1]-=document.documentElement.scrollTop}h={left:b.datepicker._pos[0],top:b.datepicker._pos[1]};b.datepicker._pos=null;c.dpDiv.empty();c.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});b.datepicker._updateDatepicker(c);h=b.datepicker._checkOffset(c,h,i);c.dpDiv.css({position:b.datepicker._inDialog&&b.blockUI?"static":i?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"});if(!c.inline){h=b.datepicker._get(c,"showAnim");\r
-var j=b.datepicker._get(c,"duration"),n=function(){b.datepicker._datepickerShowing=true;var p=c.dpDiv.find("iframe.ui-datepicker-cover");if(p.length){var l=b.datepicker._getBorders(c.dpDiv);p.css({left:-l[0],top:-l[1],width:c.dpDiv.outerWidth(),height:c.dpDiv.outerHeight()})}};c.dpDiv.zIndex(b(a).zIndex()+1);b.effects&&b.effects[h]?c.dpDiv.show(h,b.datepicker._get(c,"showOptions"),j,n):c.dpDiv[h||"show"](h?j:null,n);if(!h||!j)n();c.input.is(":visible")&&!c.input.is(":disabled")&&c.input.focus();b.datepicker._curInst=\r
-c}}},_updateDatepicker:function(a){var c=this,h=b.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var i=a.dpDiv.find("iframe.ui-datepicker-cover");i.length&&i.css({left:-h[0],top:-h[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(){b(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&b(this).removeClass("ui-datepicker-prev-hover");\r
-this.className.indexOf("ui-datepicker-next")!=-1&&b(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!c._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){b(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");b(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&b(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&b(this).addClass("ui-datepicker-next-hover")}}).end().find("."+\r
-this._dayOverClass+" a").trigger("mouseover").end();h=this._getNumberOfMonths(a);i=h[1];i>1?a.dpDiv.addClass("ui-datepicker-multi-"+i).css("width",17*i+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(h[0]!=1||h[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==b.datepicker._curInst&&b.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&\r
-a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var j=a.yearshtml;setTimeout(function(){j===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);j=a.yearshtml=null},0)}},_getBorders:function(a){var c=function(h){return{thin:1,medium:2,thick:3}[h]||h};return[parseFloat(c(a.css("border-left-width"))),parseFloat(c(a.css("border-top-width")))]},_checkOffset:function(a,c,h){var i=a.dpDiv.outerWidth(),j=a.dpDiv.outerHeight(),n=a.input?a.input.outerWidth():\r
-0,p=a.input?a.input.outerHeight():0,l=document.documentElement.clientWidth+b(document).scrollLeft(),k=document.documentElement.clientHeight+b(document).scrollTop();c.left-=this._get(a,"isRTL")?i-n:0;c.left-=h&&c.left==a.input.offset().left?b(document).scrollLeft():0;c.top-=h&&c.top==a.input.offset().top+p?b(document).scrollTop():0;c.left-=Math.min(c.left,c.left+i>l&&l>i?Math.abs(c.left+i-l):0);c.top-=Math.min(c.top,c.top+j>k&&k>j?Math.abs(j+p):0);return c},_findPos:function(a){for(var c=this._get(this._getInst(a),\r
-"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||b.expr.filters.hidden(a));)a=a[c?"previousSibling":"nextSibling"];a=b(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var c=this._curInst;if(!(!c||a&&c!=b.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(c,"showAnim");var h=this._get(c,"duration"),i=function(){b.datepicker._tidyDialog(c);this._curInst=null};b.effects&&b.effects[a]?c.dpDiv.hide(a,b.datepicker._get(c,"showOptions"),h,i):c.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?\r
-"fadeOut":"hide"](a?h:null,i);a||i();if(a=this._get(c,"onClose"))a.apply(c.input?c.input[0]:null,[c.input?c.input.val():"",c]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(b.blockUI){b.unblockUI();b("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(b.datepicker._curInst){a=\r
-b(a.target);a[0].id!=b.datepicker._mainDivId&&a.parents("#"+b.datepicker._mainDivId).length==0&&!a.hasClass(b.datepicker.markerClassName)&&!a.hasClass(b.datepicker._triggerClass)&&b.datepicker._datepickerShowing&&!(b.datepicker._inDialog&&b.blockUI)&&b.datepicker._hideDatepicker()}},_adjustDate:function(a,c,h){a=b(a);var i=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(i,c+(h=="M"?this._get(i,"showCurrentAtPos"):0),h);this._updateDatepicker(i)}},_gotoToday:function(a){a=\r
-b(a);var c=this._getInst(a[0]);if(this._get(c,"gotoCurrent")&&c.currentDay){c.selectedDay=c.currentDay;c.drawMonth=c.selectedMonth=c.currentMonth;c.drawYear=c.selectedYear=c.currentYear}else{var h=new Date;c.selectedDay=h.getDate();c.drawMonth=c.selectedMonth=h.getMonth();c.drawYear=c.selectedYear=h.getFullYear()}this._notifyChange(c);this._adjustDate(a)},_selectMonthYear:function(a,c,h){a=b(a);var i=this._getInst(a[0]);i._selectingMonthYear=false;i["selected"+(h=="M"?"Month":"Year")]=i["draw"+(h==\r
-"M"?"Month":"Year")]=parseInt(c.options[c.selectedIndex].value,10);this._notifyChange(i);this._adjustDate(a)},_clickMonthYear:function(a){var c=this._getInst(b(a)[0]);c.input&&c._selectingMonthYear&&setTimeout(function(){c.input.focus()},0);c._selectingMonthYear=!c._selectingMonthYear},_selectDay:function(a,c,h,i){var j=b(a);if(!(b(i).hasClass(this._unselectableClass)||this._isDisabledDatepicker(j[0]))){j=this._getInst(j[0]);j.selectedDay=j.currentDay=b("a",i).html();j.selectedMonth=j.currentMonth=\r
-c;j.selectedYear=j.currentYear=h;this._selectDate(a,this._formatDate(j,j.currentDay,j.currentMonth,j.currentYear))}},_clearDate:function(a){a=b(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,c){a=this._getInst(b(a)[0]);c=c!=null?c:this._formatDate(a);a.input&&a.input.val(c);this._updateAlternate(a);var h=this._get(a,"onSelect");if(h)h.apply(a.input?a.input[0]:null,[c,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();\r
-this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var c=this._get(a,"altField");if(c){var h=this._get(a,"altFormat")||this._get(a,"dateFormat"),i=this._getDate(a),j=this.formatDate(h,i,this._getFormatConfig(a));b(c).each(function(){b(this).val(j)})}},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 c=a.getTime();a.setMonth(0);\r
-a.setDate(1);return Math.floor(Math.round((c-a)/864E5)/7)+1},parseDate:function(a,c,h){if(a==null||c==null)throw"Invalid arguments";c=typeof c=="object"?c.toString():c+"";if(c=="")return null;var i=(h?h.shortYearCutoff:null)||this._defaults.shortYearCutoff;i=typeof i!="string"?i:(new Date).getFullYear()%100+parseInt(i,10);for(var j=(h?h.dayNamesShort:null)||this._defaults.dayNamesShort,n=(h?h.dayNames:null)||this._defaults.dayNames,p=(h?h.monthNamesShort:null)||this._defaults.monthNamesShort,l=(h?\r
-h.monthNames:null)||this._defaults.monthNames,k=h=-1,m=-1,o=-1,q=false,s=function(x){(x=y+1<a.length&&a.charAt(y+1)==x)&&y++;return x},r=function(x){var C=s(x);x=new RegExp("^\\d{1,"+(x=="@"?14:x=="!"?20:x=="y"&&C?4:x=="o"?3:2)+"}");x=c.substring(w).match(x);if(!x)throw"Missing number at position "+w;w+=x[0].length;return parseInt(x[0],10)},u=function(x,C,J){x=s(x)?J:C;for(C=0;C<x.length;C++)if(c.substr(w,x[C].length).toLowerCase()==x[C].toLowerCase()){w+=x[C].length;return C+1}throw"Unknown name at position "+\r
-w;},v=function(){if(c.charAt(w)!=a.charAt(y))throw"Unexpected literal at position "+w;w++},w=0,y=0;y<a.length;y++)if(q)if(a.charAt(y)=="'"&&!s("'"))q=false;else v();else switch(a.charAt(y)){case "d":m=r("d");break;case "D":u("D",j,n);break;case "o":o=r("o");break;case "m":k=r("m");break;case "M":k=u("M",p,l);break;case "y":h=r("y");break;case "@":var B=new Date(r("@"));h=B.getFullYear();k=B.getMonth()+1;m=B.getDate();break;case "!":B=new Date((r("!")-this._ticksTo1970)/1E4);h=B.getFullYear();k=B.getMonth()+\r
-1;m=B.getDate();break;case "'":if(s("'"))v();else q=true;break;default:v()}if(h==-1)h=(new Date).getFullYear();else if(h<100)h+=(new Date).getFullYear()-(new Date).getFullYear()%100+(h<=i?0:-100);if(o>-1){k=1;m=o;do{i=this._getDaysInMonth(h,k-1);if(m<=i)break;k++;m-=i}while(1)}B=this._daylightSavingAdjust(new Date(h,k-1,m));if(B.getFullYear()!=h||B.getMonth()+1!=k||B.getDate()!=m)throw"Invalid date";return B},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",\r
-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,c,h){if(!c)return"";var i=(h?h.dayNamesShort:null)||this._defaults.dayNamesShort,j=(h?h.dayNames:null)||this._defaults.dayNames,n=(h?h.monthNamesShort:null)||this._defaults.monthNamesShort;h=(h?h.monthNames:null)||this._defaults.monthNames;var p=function(s){(s=q+1<a.length&&\r
-a.charAt(q+1)==s)&&q++;return s},l=function(s,r,u){r=""+r;if(p(s))for(;r.length<u;)r="0"+r;return r},k=function(s,r,u,v){return p(s)?v[r]:u[r]},m="",o=false;if(c)for(var q=0;q<a.length;q++)if(o)if(a.charAt(q)=="'"&&!p("'"))o=false;else m+=a.charAt(q);else switch(a.charAt(q)){case "d":m+=l("d",c.getDate(),2);break;case "D":m+=k("D",c.getDay(),i,j);break;case "o":m+=l("o",(c.getTime()-(new Date(c.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":m+=l("m",c.getMonth()+1,2);break;case "M":m+=k("M",\r
-c.getMonth(),n,h);break;case "y":m+=p("y")?c.getFullYear():(c.getYear()%100<10?"0":"")+c.getYear()%100;break;case "@":m+=c.getTime();break;case "!":m+=c.getTime()*1E4+this._ticksTo1970;break;case "'":if(p("'"))m+="'";else o=true;break;default:m+=a.charAt(q)}return m},_possibleChars:function(a){for(var c="",h=false,i=function(n){(n=j+1<a.length&&a.charAt(j+1)==n)&&j++;return n},j=0;j<a.length;j++)if(h)if(a.charAt(j)=="'"&&!i("'"))h=false;else c+=a.charAt(j);else switch(a.charAt(j)){case "d":case "m":case "y":case "@":c+=\r
-"0123456789";break;case "D":case "M":return null;case "'":if(i("'"))c+="'";else h=true;break;default:c+=a.charAt(j)}return c},_get:function(a,c){return a.settings[c]!==d?a.settings[c]:this._defaults[c]},_setDateFromField:function(a,c){if(a.input.val()!=a.lastVal){var h=this._get(a,"dateFormat"),i=a.lastVal=a.input?a.input.val():null,j,n;j=n=this._getDefaultDate(a);var p=this._getFormatConfig(a);try{j=this.parseDate(h,i,p)||n}catch(l){this.log(l);i=c?"":i}a.selectedDay=j.getDate();a.drawMonth=a.selectedMonth=\r
-j.getMonth();a.drawYear=a.selectedYear=j.getFullYear();a.currentDay=i?j.getDate():0;a.currentMonth=i?j.getMonth():0;a.currentYear=i?j.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,c,h){var i=function(n){var p=new Date;p.setDate(p.getDate()+n);return p},j=function(n){try{return b.datepicker.parseDate(b.datepicker._get(a,"dateFormat"),n,b.datepicker._getFormatConfig(a))}catch(p){}var l=\r
-(n.toLowerCase().match(/^c/)?b.datepicker._getDate(a):null)||new Date,k=l.getFullYear(),m=l.getMonth();l=l.getDate();for(var o=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,q=o.exec(n);q;){switch(q[2]||"d"){case "d":case "D":l+=parseInt(q[1],10);break;case "w":case "W":l+=parseInt(q[1],10)*7;break;case "m":case "M":m+=parseInt(q[1],10);l=Math.min(l,b.datepicker._getDaysInMonth(k,m));break;case "y":case "Y":k+=parseInt(q[1],10);l=Math.min(l,b.datepicker._getDaysInMonth(k,m));break}q=o.exec(n)}return new Date(k,\r
-m,l)};if(c=(c=c==null||c===""?h:typeof c=="string"?j(c):typeof c=="number"?isNaN(c)?h:i(c):new Date(c.getTime()))&&c.toString()=="Invalid Date"?h:c){c.setHours(0);c.setMinutes(0);c.setSeconds(0);c.setMilliseconds(0)}return this._daylightSavingAdjust(c)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,c,h){var i=!c,j=a.selectedMonth,n=a.selectedYear;c=this._restrictMinMax(a,this._determineDate(a,c,new Date));a.selectedDay=\r
-a.currentDay=c.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=c.getMonth();a.drawYear=a.selectedYear=a.currentYear=c.getFullYear();if((j!=a.selectedMonth||n!=a.selectedYear)&&!h)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(i?"":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 c=new Date;c=this._daylightSavingAdjust(new Date(c.getFullYear(),\r
-c.getMonth(),c.getDate()));var h=this._get(a,"isRTL"),i=this._get(a,"showButtonPanel"),j=this._get(a,"hideIfNoPrevNext"),n=this._get(a,"navigationAsDateFormat"),p=this._getNumberOfMonths(a),l=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),m=p[0]!=1||p[1]!=1,o=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),q=this._getMinMaxDate(a,"min"),s=this._getMinMaxDate(a,"max");l=a.drawMonth-l;var r=a.drawYear;if(l<0){l+=12;r--}if(s){var u=\r
-this._daylightSavingAdjust(new Date(s.getFullYear(),s.getMonth()-p[0]*p[1]+1,s.getDate()));for(u=q&&u<q?q:u;this._daylightSavingAdjust(new Date(r,l,1))>u;){l--;if(l<0){l=11;r--}}}a.drawMonth=l;a.drawYear=r;u=this._get(a,"prevText");u=!n?u:this.formatDate(u,this._daylightSavingAdjust(new Date(r,l-k,1)),this._getFormatConfig(a));u=this._canAdjustMonth(a,-1,r,l)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+u+'"><span class="ui-icon ui-icon-circle-triangle-'+\r
-(h?"e":"w")+'">'+u+"</span></a>":j?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+u+'"><span class="ui-icon ui-icon-circle-triangle-'+(h?"e":"w")+'">'+u+"</span></a>";var v=this._get(a,"nextText");v=!n?v:this.formatDate(v,this._daylightSavingAdjust(new Date(r,l+k,1)),this._getFormatConfig(a));j=this._canAdjustMonth(a,+1,r,l)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+v+'"><span class="ui-icon ui-icon-circle-triangle-'+\r
-(h?"w":"e")+'">'+v+"</span></a>":j?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+v+'"><span class="ui-icon ui-icon-circle-triangle-'+(h?"w":"e")+'">'+v+"</span></a>";k=this._get(a,"currentText");v=this._get(a,"gotoCurrent")&&a.currentDay?o:c;k=!n?k:this.formatDate(k,v,this._getFormatConfig(a));n=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+f+'.datepicker._hideDatepicker();">'+this._get(a,\r
-"closeText")+"</button>":"";i=i?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(h?n:"")+(this._isInRange(a,v)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(h?"":n)+"</div>":"";n=parseInt(this._get(a,"firstDay"),10);n=isNaN(n)?0:n;k=this._get(a,"showWeek");v=this._get(a,"dayNames");this._get(a,"dayNamesShort");var w=this._get(a,"dayNamesMin"),y=\r
-this._get(a,"monthNames"),B=this._get(a,"monthNamesShort"),x=this._get(a,"beforeShowDay"),C=this._get(a,"showOtherMonths"),J=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),K="",G=0;G<p[0];G++){for(var N="",H=0;H<p[1];H++){var O=this._daylightSavingAdjust(new Date(r,l,a.selectedDay)),A=" ui-corner-all",D="";if(m){D+='<div class="ui-datepicker-group';if(p[1]>1)switch(H){case 0:D+=" ui-datepicker-group-first";A=" ui-corner-"+(h?"right":"left");break;case p[1]-\r
-1:D+=" ui-datepicker-group-last";A=" ui-corner-"+(h?"left":"right");break;default:D+=" ui-datepicker-group-middle";A="";break}D+='">'}D+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+A+'">'+(/all|left/.test(A)&&G==0?h?j:u:"")+(/all|right/.test(A)&&G==0?h?u:j:"")+this._generateMonthYearHeader(a,l,r,q,s,G>0||H>0,y,B)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var E=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(A=0;A<7;A++){var z=\r
-(A+n)%7;E+="<th"+((A+n+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+v[z]+'">'+w[z]+"</span></th>"}D+=E+"</tr></thead><tbody>";E=this._getDaysInMonth(r,l);if(r==a.selectedYear&&l==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,E);A=(this._getFirstDayOfMonth(r,l)-n+7)%7;E=m?6:Math.ceil((A+E)/7);z=this._daylightSavingAdjust(new Date(r,l,1-A));for(var P=0;P<E;P++){D+="<tr>";var Q=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(z)+"</td>";for(A=0;A<7;A++){var I=\r
-x?x.apply(a.input?a.input[0]:null,[z]):[true,""],F=z.getMonth()!=l,L=F&&!J||!I[0]||q&&z<q||s&&z>s;Q+='<td class="'+((A+n+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(z.getTime()==O.getTime()&&l==a.selectedMonth&&a._keyEvent||M.getTime()==z.getTime()&&M.getTime()==O.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!C?"":" "+I[1]+(z.getTime()==o.getTime()?" "+this._currentClass:"")+(z.getTime()==c.getTime()?" ui-datepicker-today":\r
-""))+'"'+((!F||C)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+f+".datepicker._selectDay('#"+a.id+"',"+z.getMonth()+","+z.getFullYear()+', this);return false;"')+">"+(F&&!C?" ":L?'<span class="ui-state-default">'+z.getDate()+"</span>":'<a class="ui-state-default'+(z.getTime()==c.getTime()?" ui-state-highlight":"")+(z.getTime()==o.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+z.getDate()+"</a>")+"</td>";z.setDate(z.getDate()+1);z=this._daylightSavingAdjust(z)}D+=\r
-Q+"</tr>"}l++;if(l>11){l=0;r++}D+="</tbody></table>"+(m?"</div>"+(p[0]>0&&H==p[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");N+=D}K+=N}K+=i+(b.browser.msie&&parseInt(b.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return K},_generateMonthYearHeader:function(a,c,h,i,j,n,p,l){var k=this._get(a,"changeMonth"),m=this._get(a,"changeYear"),o=this._get(a,"showMonthAfterYear"),q='<div class="ui-datepicker-title">',\r
-s="";if(n||!k)s+='<span class="ui-datepicker-month">'+p[c]+"</span>";else{p=i&&i.getFullYear()==h;var r=j&&j.getFullYear()==h;s+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+f+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+f+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var u=0;u<12;u++)if((!p||u>=i.getMonth())&&(!r||u<=j.getMonth()))s+='<option value="'+u+'"'+(u==c?' selected="selected"':"")+">"+l[u]+"</option>";s+="</select>"}o||(q+=s+(n||!(k&&\r
-m)?" ":""));a.yearshtml="";if(n||!m)q+='<span class="ui-datepicker-year">'+h+"</span>";else{l=this._get(a,"yearRange").split(":");var v=(new Date).getFullYear();p=function(w){w=w.match(/c[+-].*/)?h+parseInt(w.substring(1),10):w.match(/[+-].*/)?v+parseInt(w,10):parseInt(w,10);return isNaN(w)?v:w};c=p(l[0]);l=Math.max(c,p(l[1]||""));c=i?Math.max(c,i.getFullYear()):c;l=j?Math.min(l,j.getFullYear()):l;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+f+".datepicker._selectMonthYear('#"+\r
-a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+f+".datepicker._clickMonthYear('#"+a.id+"');\">";c<=l;c++)a.yearshtml+='<option value="'+c+'"'+(c==h?' selected="selected"':"")+">"+c+"</option>";a.yearshtml+="</select>";if(b.browser.mozilla)q+='<select class="ui-datepicker-year"><option value="'+h+'" selected="selected">'+h+"</option></select>";else{q+=a.yearshtml;a.yearshtml=null}}q+=this._get(a,"yearSuffix");if(o)q+=(n||!(k&&m)?" ":"")+s;q+="</div>";return q},_adjustInstDate:function(a,c,h){var i=\r
-a.drawYear+(h=="Y"?c:0),j=a.drawMonth+(h=="M"?c:0);c=Math.min(a.selectedDay,this._getDaysInMonth(i,j))+(h=="D"?c:0);i=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(i,j,c)));a.selectedDay=i.getDate();a.drawMonth=a.selectedMonth=i.getMonth();a.drawYear=a.selectedYear=i.getFullYear();if(h=="M"||h=="Y")this._notifyChange(a)},_restrictMinMax:function(a,c){var h=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");c=h&&c<h?h:c;return c=a&&c>a?a:c},_notifyChange:function(a){var c=this._get(a,\r
-"onChangeMonthYear");if(c)c.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,c){return this._determineDate(a,this._get(a,c+"Date"),null)},_getDaysInMonth:function(a,c){return 32-this._daylightSavingAdjust(new Date(a,c,32)).getDate()},_getFirstDayOfMonth:function(a,c){return(new Date(a,c,1)).getDay()},_canAdjustMonth:function(a,c,h,i){var j=this._getNumberOfMonths(a);\r
-h=this._daylightSavingAdjust(new Date(h,i+(c<0?c:j[0]*j[1]),1));c<0&&h.setDate(this._getDaysInMonth(h.getFullYear(),h.getMonth()));return this._isInRange(a,h)},_isInRange:function(a,c){var h=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!h||c.getTime()>=h.getTime())&&(!a||c.getTime()<=a.getTime())},_getFormatConfig:function(a){var c=this._get(a,"shortYearCutoff");c=typeof c!="string"?c:(new Date).getFullYear()%100+parseInt(c,10);return{shortYearCutoff:c,dayNamesShort:this._get(a,\r
-"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,c,h,i){if(!c){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}c=c?typeof c=="object"?c:this._daylightSavingAdjust(new Date(i,h,c)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),c,this._getFormatConfig(a))}});b.fn.datepicker=\r
-function(a){if(!this.length)return this;if(!b.datepicker.initialized){b(document).mousedown(b.datepicker._checkExternalClick).find("body").append(b.datepicker.dpDiv);b.datepicker.initialized=true}var c=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this[0]].concat(c));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,\r
-[this[0]].concat(c));return this.each(function(){typeof a=="string"?b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this].concat(c)):b.datepicker._attachDatepicker(this,a)})};b.datepicker=new e;b.datepicker.initialized=false;b.datepicker.uuid=(new Date).getTime();b.datepicker.version="1.8.11";window["DP_jQuery_"+f]=b})(jQuery);\r
-(function(b,d){var e={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},g={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};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:{my:"center",at:"center",collision:"fit",using:function(f){var a=b(this).css(f).offset().top;a<0&&\r
-b(this).css("top",f.top-a)}},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 f=this,a=f.options,c=a.title||" ",h=b.ui.dialog.getTitleId(f.element),i=(f.uiDialog=b("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+a.dialogClass).css({zIndex:a.zIndex}).attr("tabIndex",\r
--1).css("outline",0).keydown(function(p){if(a.closeOnEscape&&p.keyCode&&p.keyCode===b.ui.keyCode.ESCAPE){f.close(p);p.preventDefault()}}).attr({role:"dialog","aria-labelledby":h}).mousedown(function(p){f.moveToTop(false,p)});f.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(i);var j=(f.uiDialogTitlebar=b("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(i),n=b('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role",\r
-"button").hover(function(){n.addClass("ui-state-hover")},function(){n.removeClass("ui-state-hover")}).focus(function(){n.addClass("ui-state-focus")}).blur(function(){n.removeClass("ui-state-focus")}).click(function(p){f.close(p);return false}).appendTo(j);(f.uiDialogTitlebarCloseText=b("<span></span>")).addClass("ui-icon ui-icon-closethick").text(a.closeText).appendTo(n);b("<span></span>").addClass("ui-dialog-title").attr("id",h).html(c).prependTo(j);if(b.isFunction(a.beforeclose)&&!b.isFunction(a.beforeClose))a.beforeClose=\r
-a.beforeclose;j.find("*").add(j).disableSelection();a.draggable&&b.fn.draggable&&f._makeDraggable();a.resizable&&b.fn.resizable&&f._makeResizable();f._createButtons(a.buttons);f._isOpen=false;b.fn.bgiframe&&i.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var f=this;f.overlay&&f.overlay.destroy();f.uiDialog.hide();f.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");f.uiDialog.remove();f.originalTitle&&\r
-f.element.attr("title",f.originalTitle);return f},widget:function(){return this.uiDialog},close:function(f){var a=this,c,h;if(false!==a._trigger("beforeClose",f)){a.overlay&&a.overlay.destroy();a.uiDialog.unbind("keypress.ui-dialog");a._isOpen=false;if(a.options.hide)a.uiDialog.hide(a.options.hide,function(){a._trigger("close",f)});else{a.uiDialog.hide();a._trigger("close",f)}b.ui.dialog.overlay.resize();if(a.options.modal){c=0;b(".ui-dialog").each(function(){if(this!==a.uiDialog[0]){h=b(this).css("z-index");\r
-isNaN(h)||(c=Math.max(c,h))}});b.ui.dialog.maxZ=c}return a}},isOpen:function(){return this._isOpen},moveToTop:function(f,a){var c=this,h=c.options;if(h.modal&&!f||!h.stack&&!h.modal)return c._trigger("focus",a);if(h.zIndex>b.ui.dialog.maxZ)b.ui.dialog.maxZ=h.zIndex;if(c.overlay){b.ui.dialog.maxZ+=1;c.overlay.$el.css("z-index",b.ui.dialog.overlay.maxZ=b.ui.dialog.maxZ)}f={scrollTop:c.element.attr("scrollTop"),scrollLeft:c.element.attr("scrollLeft")};b.ui.dialog.maxZ+=1;c.uiDialog.css("z-index",b.ui.dialog.maxZ);\r
-c.element.attr(f);c._trigger("focus",a);return c},open:function(){if(!this._isOpen){var f=this,a=f.options,c=f.uiDialog;f.overlay=a.modal?new b.ui.dialog.overlay(f):null;f._size();f._position(a.position);c.show(a.show);f.moveToTop(true);a.modal&&c.bind("keypress.ui-dialog",function(h){if(h.keyCode===b.ui.keyCode.TAB){var i=b(":tabbable",this),j=i.filter(":first");i=i.filter(":last");if(h.target===i[0]&&!h.shiftKey){j.focus(1);return false}else if(h.target===j[0]&&h.shiftKey){i.focus(1);return false}}});\r
-b(f.element.find(":tabbable").get().concat(c.find(".ui-dialog-buttonpane :tabbable").get().concat(c.get()))).eq(0).focus();f._isOpen=true;f._trigger("open");return f}},_createButtons:function(f){var a=this,c=false,h=b("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),i=b("<div></div>").addClass("ui-dialog-buttonset").appendTo(h);a.uiDialog.find(".ui-dialog-buttonpane").remove();typeof f==="object"&&f!==null&&b.each(f,function(){return!(c=true)});if(c){b.each(f,function(j,\r
-n){n=b.isFunction(n)?{click:n,text:j}:n;j=b('<button type="button"></button>').attr(n,true).unbind("click").click(function(){n.click.apply(a.element[0],arguments)}).appendTo(i);b.fn.button&&j.button()});h.appendTo(a.uiDialog)}},_makeDraggable:function(){function f(j){return{position:j.position,offset:j.offset}}var a=this,c=a.options,h=b(document),i;a.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(j,n){i=\r
-c.height==="auto"?"auto":b(this).height();b(this).height(b(this).height()).addClass("ui-dialog-dragging");a._trigger("dragStart",j,f(n))},drag:function(j,n){a._trigger("drag",j,f(n))},stop:function(j,n){c.position=[n.position.left-h.scrollLeft(),n.position.top-h.scrollTop()];b(this).removeClass("ui-dialog-dragging").height(i);a._trigger("dragStop",j,f(n));b.ui.dialog.overlay.resize()}})},_makeResizable:function(f){function a(j){return{originalPosition:j.originalPosition,originalSize:j.originalSize,\r
-position:j.position,size:j.size}}f=f===d?this.options.resizable:f;var c=this,h=c.options,i=c.uiDialog.css("position");f=typeof f==="string"?f:"n,e,s,w,se,sw,ne,nw";c.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:c.element,maxWidth:h.maxWidth,maxHeight:h.maxHeight,minWidth:h.minWidth,minHeight:c._minHeight(),handles:f,start:function(j,n){b(this).addClass("ui-dialog-resizing");c._trigger("resizeStart",j,a(n))},resize:function(j,n){c._trigger("resize",j,a(n))},stop:function(j,\r
-n){b(this).removeClass("ui-dialog-resizing");h.height=b(this).height();h.width=b(this).width();c._trigger("resizeStop",j,a(n));b.ui.dialog.overlay.resize()}}).css("position",i).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var f=this.options;return f.height==="auto"?f.minHeight:Math.min(f.minHeight,f.height)},_position:function(f){var a=[],c=[0,0],h;if(f){if(typeof f==="string"||typeof f==="object"&&"0"in f){a=f.split?f.split(" "):[f[0],f[1]];if(a.length===\r
-1)a[1]=a[0];b.each(["left","top"],function(i,j){if(+a[i]===a[i]){c[i]=a[i];a[i]=j}});f={my:a.join(" "),at:a.join(" "),offset:c.join(" ")}}f=b.extend({},b.ui.dialog.prototype.options.position,f)}else f=b.ui.dialog.prototype.options.position;(h=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(b.extend({of:window},f));h||this.uiDialog.hide()},_setOptions:function(f){var a=this,c={},h=false;b.each(f,function(i,j){a._setOption(i,j);if(i in e)h=true;if(i in\r
-g)c[i]=j});h&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",c)},_setOption:function(f,a){var c=this,h=c.uiDialog;switch(f){case "beforeclose":f="beforeClose";break;case "buttons":c._createButtons(a);break;case "closeText":c.uiDialogTitlebarCloseText.text(""+a);break;case "dialogClass":h.removeClass(c.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+a);break;case "disabled":a?h.addClass("ui-dialog-disabled"):h.removeClass("ui-dialog-disabled");\r
-break;case "draggable":var i=h.is(":data(draggable)");i&&!a&&h.draggable("destroy");!i&&a&&c._makeDraggable();break;case "position":c._position(a);break;case "resizable":(i=h.is(":data(resizable)"))&&!a&&h.resizable("destroy");i&&typeof a==="string"&&h.resizable("option","handles",a);!i&&a!==false&&c._makeResizable(a);break;case "title":b(".ui-dialog-title",c.uiDialogTitlebar).html(""+(a||" "));break}b.Widget.prototype._setOption.apply(c,arguments)},_size:function(){var f=this.options,a,c,h=\r
-this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(f.minWidth>f.width)f.width=f.minWidth;a=this.uiDialog.css({height:"auto",width:f.width}).height();c=Math.max(0,f.minHeight-a);if(f.height==="auto")if(b.support.minHeight)this.element.css({minHeight:c,height:"auto"});else{this.uiDialog.show();f=this.element.css("height","auto").height();h||this.uiDialog.hide();this.element.height(Math.max(f,c))}else this.element.height(Math.max(f.height-a,0));this.uiDialog.is(":data(resizable)")&&\r
-this.uiDialog.resizable("option","minHeight",this._minHeight())}});b.extend(b.ui.dialog,{version:"1.8.11",uuid:0,maxZ:0,getTitleId:function(f){f=f.attr("id");if(!f){this.uuid+=1;f=this.uuid}return"ui-dialog-title-"+f},overlay:function(f){this.$el=b.ui.dialog.overlay.create(f)}});b.extend(b.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:b.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(f){return f+".dialog-overlay"}).join(" "),create:function(f){if(this.instances.length===\r
-0){setTimeout(function(){b.ui.dialog.overlay.instances.length&&b(document).bind(b.ui.dialog.overlay.events,function(c){if(b(c.target).zIndex()<b.ui.dialog.overlay.maxZ)return false})},1);b(document).bind("keydown.dialog-overlay",function(c){if(f.options.closeOnEscape&&c.keyCode&&c.keyCode===b.ui.keyCode.ESCAPE){f.close(c);c.preventDefault()}});b(window).bind("resize.dialog-overlay",b.ui.dialog.overlay.resize)}var a=(this.oldInstances.pop()||b("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),\r
-height:this.height()});b.fn.bgiframe&&a.bgiframe();this.instances.push(a);return a},destroy:function(f){var a=b.inArray(f,this.instances);a!=-1&&this.oldInstances.push(this.instances.splice(a,1)[0]);this.instances.length===0&&b([document,window]).unbind(".dialog-overlay");f.remove();var c=0;b.each(this.instances,function(){c=Math.max(c,this.css("z-index"))});this.maxZ=c},height:function(){var f,a;if(b.browser.msie&&b.browser.version<7){f=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);\r
-a=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return f<a?b(window).height()+"px":f+"px"}else return b(document).height()+"px"},width:function(){var f,a;if(b.browser.msie&&b.browser.version<7){f=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);a=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return f<a?b(window).width()+"px":f+"px"}else return b(document).width()+"px"},resize:function(){var f=b([]);b.each(b.ui.dialog.overlay.instances,\r
-function(){f=f.add(this)});f.css({width:0,height:0}).css({width:b.ui.dialog.overlay.width(),height:b.ui.dialog.overlay.height()})}});b.extend(b.ui.dialog.overlay.prototype,{destroy:function(){b.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);\r
-(function(b){b.ui=b.ui||{};var d=/left|center|right/,e=/top|center|bottom/,g=b.fn.position,f=b.fn.offset;b.fn.position=function(a){if(!a||!a.of)return g.apply(this,arguments);a=b.extend({},a);var c=b(a.of),h=c[0],i=(a.collision||"flip").split(" "),j=a.offset?a.offset.split(" "):[0,0],n,p,l;if(h.nodeType===9){n=c.width();p=c.height();l={top:0,left:0}}else if(h.setTimeout){n=c.width();p=c.height();l={top:c.scrollTop(),left:c.scrollLeft()}}else if(h.preventDefault){a.at="left top";n=p=0;l={top:a.of.pageY,\r
-left:a.of.pageX}}else{n=c.outerWidth();p=c.outerHeight();l=c.offset()}b.each(["my","at"],function(){var k=(a[this]||"").split(" ");if(k.length===1)k=d.test(k[0])?k.concat(["center"]):e.test(k[0])?["center"].concat(k):["center","center"];k[0]=d.test(k[0])?k[0]:"center";k[1]=e.test(k[1])?k[1]:"center";a[this]=k});if(i.length===1)i[1]=i[0];j[0]=parseInt(j[0],10)||0;if(j.length===1)j[1]=j[0];j[1]=parseInt(j[1],10)||0;if(a.at[0]==="right")l.left+=n;else if(a.at[0]==="center")l.left+=n/2;if(a.at[1]==="bottom")l.top+=\r
-p;else if(a.at[1]==="center")l.top+=p/2;l.left+=j[0];l.top+=j[1];return this.each(function(){var k=b(this),m=k.outerWidth(),o=k.outerHeight(),q=parseInt(b.curCSS(this,"marginLeft",true))||0,s=parseInt(b.curCSS(this,"marginTop",true))||0,r=m+q+(parseInt(b.curCSS(this,"marginRight",true))||0),u=o+s+(parseInt(b.curCSS(this,"marginBottom",true))||0),v=b.extend({},l),w;if(a.my[0]==="right")v.left-=m;else if(a.my[0]==="center")v.left-=m/2;if(a.my[1]==="bottom")v.top-=o;else if(a.my[1]==="center")v.top-=\r
-o/2;v.left=Math.round(v.left);v.top=Math.round(v.top);w={left:v.left-q,top:v.top-s};b.each(["left","top"],function(y,B){b.ui.position[i[y]]&&b.ui.position[i[y]][B](v,{targetWidth:n,targetHeight:p,elemWidth:m,elemHeight:o,collisionPosition:w,collisionWidth:r,collisionHeight:u,offset:j,my:a.my,at:a.at})});b.fn.bgiframe&&k.bgiframe();k.offset(b.extend(v,{using:a.using}))})};b.ui.position={fit:{left:function(a,c){var h=b(window);h=c.collisionPosition.left+c.collisionWidth-h.width()-h.scrollLeft();a.left=\r
-h>0?a.left-h:Math.max(a.left-c.collisionPosition.left,a.left)},top:function(a,c){var h=b(window);h=c.collisionPosition.top+c.collisionHeight-h.height()-h.scrollTop();a.top=h>0?a.top-h:Math.max(a.top-c.collisionPosition.top,a.top)}},flip:{left:function(a,c){if(c.at[0]!=="center"){var h=b(window);h=c.collisionPosition.left+c.collisionWidth-h.width()-h.scrollLeft();var i=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,j=c.at[0]==="left"?c.targetWidth:-c.targetWidth,n=-2*c.offset[0];a.left+=\r
-c.collisionPosition.left<0?i+j+n:h>0?i+j+n:0}},top:function(a,c){if(c.at[1]!=="center"){var h=b(window);h=c.collisionPosition.top+c.collisionHeight-h.height()-h.scrollTop();var i=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,j=c.at[1]==="top"?c.targetHeight:-c.targetHeight,n=-2*c.offset[1];a.top+=c.collisionPosition.top<0?i+j+n:h>0?i+j+n:0}}}};if(!b.offset.setOffset){b.offset.setOffset=function(a,c){if(/static/.test(b.curCSS(a,"position")))a.style.position="relative";var h=b(a),\r
-i=h.offset(),j=parseInt(b.curCSS(a,"top",true),10)||0,n=parseInt(b.curCSS(a,"left",true),10)||0;i={top:c.top-i.top+j,left:c.left-i.left+n};"using"in c?c.using.call(a,i):h.css(i)};b.fn.offset=function(a){var c=this[0];if(!c||!c.ownerDocument)return null;if(a)return this.each(function(){b.offset.setOffset(this,a)});return f.call(this)}}})(jQuery);\r
-(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("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").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");\r
-this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(e){if(e===d)return this._value();this._setOption("value",e);return this},_setOption:function(e,g){if(e==="value"){this.options.value=g;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var e=this.options.value;if(typeof e!=="number")e=0;return Math.min(this.options.max,Math.max(this.min,e))},_percentage:function(){return 100*\r
-this._value()/this.options.max},_refreshValue:function(){var e=this.value(),g=this._percentage();if(this.oldValue!==e){this.oldValue=e;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",e===this.options.max).width(g.toFixed(0)+"%");this.element.attr("aria-valuenow",e)}});b.extend(b.ui.progressbar,{version:"1.8.11"})})(jQuery);\r
-(function(b){b.widget("ui.slider",b.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var d=this,e=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");e.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");\r
-this.range=b([]);if(e.range){if(e.range===true){this.range=b("<div></div>");if(!e.values)e.values=[this._valueMin(),this._valueMin()];if(e.values.length&&e.values.length!==2)e.values=[e.values[0],e.values[0]]}else this.range=b("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(e.range==="min"||e.range==="max")this.range.addClass("ui-slider-range-"+e.range);this.range.addClass("ui-widget-header")}b(".ui-slider-handle",this.element).length===0&&b("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");\r
-if(e.values&&e.values.length)for(;b(".ui-slider-handle",this.element).length<e.values.length;)b("<a href='#'></a>").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(g){g.preventDefault()}).hover(function(){e.disabled||b(this).addClass("ui-state-hover")},function(){b(this).removeClass("ui-state-hover")}).focus(function(){if(e.disabled)b(this).blur();\r
-else{b(".ui-slider .ui-state-focus").removeClass("ui-state-focus");b(this).addClass("ui-state-focus")}}).blur(function(){b(this).removeClass("ui-state-focus")});this.handles.each(function(g){b(this).data("index.ui-slider-handle",g)});this.handles.keydown(function(g){var f=true,a=b(this).data("index.ui-slider-handle"),c,h,i;if(!d.options.disabled){switch(g.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:f=\r
-false;if(!d._keySliding){d._keySliding=true;b(this).addClass("ui-state-active");c=d._start(g,a);if(c===false)return}break}i=d.options.step;c=d.options.values&&d.options.values.length?(h=d.values(a)):(h=d.value());switch(g.keyCode){case b.ui.keyCode.HOME:h=d._valueMin();break;case b.ui.keyCode.END:h=d._valueMax();break;case b.ui.keyCode.PAGE_UP:h=d._trimAlignValue(c+(d._valueMax()-d._valueMin())/5);break;case b.ui.keyCode.PAGE_DOWN:h=d._trimAlignValue(c-(d._valueMax()-d._valueMin())/5);break;case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:if(c===\r
-d._valueMax())return;h=d._trimAlignValue(c+i);break;case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:if(c===d._valueMin())return;h=d._trimAlignValue(c-i);break}d._slide(g,a,h);return f}}).keyup(function(g){var f=b(this).data("index.ui-slider-handle");if(d._keySliding){d._keySliding=false;d._stop(g,f);d._change(g,f);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");\r
-this._mouseDestroy();return this},_mouseCapture:function(d){var e=this.options,g,f,a,c,h;if(e.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();g=this._normValueFromMouse({x:d.pageX,y:d.pageY});f=this._valueMax()-this._valueMin()+1;c=this;this.handles.each(function(i){var j=Math.abs(g-c.values(i));if(f>j){f=j;a=b(this);h=i}});if(e.range===true&&this.values(1)===e.min){h+=1;a=b(this.handles[h])}if(this._start(d,\r
-h)===false)return false;this._mouseSliding=true;c._handleIndex=h;a.addClass("ui-state-active").focus();e=a.offset();this._clickOffset=!b(d.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:d.pageX-e.left-a.width()/2,top:d.pageY-e.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(d,h,g);return this._animateOff=true},_mouseStart:function(){return true},\r
-_mouseDrag:function(d){var e=this._normValueFromMouse({x:d.pageX,y:d.pageY});this._slide(d,this._handleIndex,e);return false},_mouseStop:function(d){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(d,this._handleIndex);this._change(d,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(d){var e;\r
-if(this.orientation==="horizontal"){e=this.elementSize.width;d=d.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{e=this.elementSize.height;d=d.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}e=d/e;if(e>1)e=1;if(e<0)e=0;if(this.orientation==="vertical")e=1-e;d=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+e*d)},_start:function(d,e){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=\r
-this.values(e);g.values=this.values()}return this._trigger("start",d,g)},_slide:function(d,e,g){var f;if(this.options.values&&this.options.values.length){f=this.values(e?0:1);if(this.options.values.length===2&&this.options.range===true&&(e===0&&g>f||e===1&&g<f))g=f;if(g!==this.values(e)){f=this.values();f[e]=g;d=this._trigger("slide",d,{handle:this.handles[e],value:g,values:f});this.values(e?0:1);d!==false&&this.values(e,g,true)}}else if(g!==this.value()){d=this._trigger("slide",d,{handle:this.handles[e],\r
-value:g});d!==false&&this.value(g)}},_stop:function(d,e){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=this.values(e);g.values=this.values()}this._trigger("stop",d,g)},_change:function(d,e){if(!this._keySliding&&!this._mouseSliding){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=this.values(e);g.values=this.values()}this._trigger("change",d,g)}},value:function(d){if(arguments.length){this.options.value=\r
-this._trimAlignValue(d);this._refreshValue();this._change(null,0)}return this._value()},values:function(d,e){var g,f,a;if(arguments.length>1){this.options.values[d]=this._trimAlignValue(e);this._refreshValue();this._change(null,d)}if(arguments.length)if(b.isArray(arguments[0])){g=this.options.values;f=arguments[0];for(a=0;a<g.length;a+=1){g[a]=this._trimAlignValue(f[a]);this._change(null,a)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(d):this.value();\r
-else return this._values()},_setOption:function(d,e){var g,f=0;if(b.isArray(this.options.values))f=this.options.values.length;b.Widget.prototype._setOption.apply(this,arguments);switch(d){case "disabled":if(e){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();\r
-this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(g=0;g<f;g+=1)this._change(null,g);this._animateOff=false;break}},_value:function(){var d=this.options.value;return d=this._trimAlignValue(d)},_values:function(d){var e,g;if(arguments.length){e=this.options.values[d];\r
-return e=this._trimAlignValue(e)}else{e=this.options.values.slice();for(g=0;g<e.length;g+=1)e[g]=this._trimAlignValue(e[g]);return e}},_trimAlignValue:function(d){if(d<=this._valueMin())return this._valueMin();if(d>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,g=(d-this._valueMin())%e;alignValue=d-g;if(Math.abs(g)*2>=e)alignValue+=g>0?e:-e;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},\r
-_refreshValue:function(){var d=this.options.range,e=this.options,g=this,f=!this._animateOff?e.animate:false,a,c={},h,i,j,n;if(this.options.values&&this.options.values.length)this.handles.each(function(p){a=(g.values(p)-g._valueMin())/(g._valueMax()-g._valueMin())*100;c[g.orientation==="horizontal"?"left":"bottom"]=a+"%";b(this).stop(1,1)[f?"animate":"css"](c,e.animate);if(g.options.range===true)if(g.orientation==="horizontal"){if(p===0)g.range.stop(1,1)[f?"animate":"css"]({left:a+"%"},e.animate);\r
-if(p===1)g.range[f?"animate":"css"]({width:a-h+"%"},{queue:false,duration:e.animate})}else{if(p===0)g.range.stop(1,1)[f?"animate":"css"]({bottom:a+"%"},e.animate);if(p===1)g.range[f?"animate":"css"]({height:a-h+"%"},{queue:false,duration:e.animate})}h=a});else{i=this.value();j=this._valueMin();n=this._valueMax();a=n!==j?(i-j)/(n-j)*100:0;c[g.orientation==="horizontal"?"left":"bottom"]=a+"%";this.handle.stop(1,1)[f?"animate":"css"](c,e.animate);if(d==="min"&&this.orientation==="horizontal")this.range.stop(1,\r
-1)[f?"animate":"css"]({width:a+"%"},e.animate);if(d==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-a+"%"},{queue:false,duration:e.animate});if(d==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:a+"%"},e.animate);if(d==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-a+"%"},{queue:false,duration:e.animate})}}});b.extend(b.ui.slider,{version:"1.8.11"})})(jQuery);\r
-(function(b,d){function e(){return++f}function g(){return++a}var f=0,a=0;b.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:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading…</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(c,h){if(c=="selected")this.options.collapsible&&\r
-h==this.options.selected||this.select(h);else{this.options[c]=h;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+g());return b.cookie.apply(null,[c].concat(b.makeArray(arguments)))},_ui:function(c,h){return{tab:c,panel:h,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c=\r
-b(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function h(r,u){r.css("display","");!b.support.opacity&&u.opacity&&r[0].style.removeAttribute("filter")}var i=this,j=this.options,n=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=b(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return b("a",this)[0]});this.panels=b([]);this.anchors.each(function(r,u){var v=b(u).attr("href"),w=v.split("#")[0],y;if(w&&(w===location.toString().split("#")[0]||\r
-(y=b("base")[0])&&w===y.href)){v=u.hash;u.href=v}if(n.test(v))i.panels=i.panels.add(i.element.find(i._sanitizeSelector(v)));else if(v&&v!=="#"){b.data(u,"href.tabs",v);b.data(u,"load.tabs",v.replace(/#.*$/,""));v=i._tabId(u);u.href="#"+v;u=i.element.find("#"+v);if(!u.length){u=b(j.panelTemplate).attr("id",v).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(i.panels[r-1]||i.list);u.data("destroy.tabs",true)}i.panels=i.panels.add(u)}else j.disabled.push(r)});if(c){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");\r
-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(j.selected===d){location.hash&&this.anchors.each(function(r,u){if(u.hash==location.hash){j.selected=r;return false}});if(typeof j.selected!=="number"&&j.cookie)j.selected=parseInt(i._cookie(),10);if(typeof j.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)j.selected=\r
-this.lis.index(this.lis.filter(".ui-tabs-selected"));j.selected=j.selected||(this.lis.length?0:-1)}else if(j.selected===null)j.selected=-1;j.selected=j.selected>=0&&this.anchors[j.selected]||j.selected<0?j.selected:0;j.disabled=b.unique(j.disabled.concat(b.map(this.lis.filter(".ui-state-disabled"),function(r){return i.lis.index(r)}))).sort();b.inArray(j.selected,j.disabled)!=-1&&j.disabled.splice(b.inArray(j.selected,j.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");\r
-if(j.selected>=0&&this.anchors.length){i.element.find(i._sanitizeSelector(i.anchors[j.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(j.selected).addClass("ui-tabs-selected ui-state-active");i.element.queue("tabs",function(){i._trigger("show",null,i._ui(i.anchors[j.selected],i.element.find(i._sanitizeSelector(i.anchors[j.selected].hash))[0]))});this.load(j.selected)}b(window).bind("unload",function(){i.lis.add(i.anchors).unbind(".tabs");i.lis=i.anchors=i.panels=null})}else j.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));\r
-this.element[j.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");j.cookie&&this._cookie(j.selected,j.cookie);c=0;for(var p;p=this.lis[c];c++)b(p)[b.inArray(c,j.disabled)!=-1&&!b(p).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");j.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(j.event!=="mouseover"){var l=function(r,u){u.is(":not(.ui-state-disabled)")&&u.addClass("ui-state-"+r)},k=function(r,u){u.removeClass("ui-state-"+\r
-r)};this.lis.bind("mouseover.tabs",function(){l("hover",b(this))});this.lis.bind("mouseout.tabs",function(){k("hover",b(this))});this.anchors.bind("focus.tabs",function(){l("focus",b(this).closest("li"))});this.anchors.bind("blur.tabs",function(){k("focus",b(this).closest("li"))})}var m,o;if(j.fx)if(b.isArray(j.fx)){m=j.fx[0];o=j.fx[1]}else m=o=j.fx;var q=o?function(r,u){b(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",\r
-function(){h(u,o);i._trigger("show",null,i._ui(r,u[0]))})}:function(r,u){b(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.removeClass("ui-tabs-hide");i._trigger("show",null,i._ui(r,u[0]))},s=m?function(r,u){u.animate(m,m.duration||"normal",function(){i.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");h(u,m);i.element.dequeue("tabs")})}:function(r,u){i.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");i.element.dequeue("tabs")};\r
-this.anchors.bind(j.event+".tabs",function(){var r=this,u=b(r).closest("li"),v=i.panels.filter(":not(.ui-tabs-hide)"),w=i.element.find(i._sanitizeSelector(r.hash));if(u.hasClass("ui-tabs-selected")&&!j.collapsible||u.hasClass("ui-state-disabled")||u.hasClass("ui-state-processing")||i.panels.filter(":animated").length||i._trigger("select",null,i._ui(this,w[0]))===false){this.blur();return false}j.selected=i.anchors.index(this);i.abort();if(j.collapsible)if(u.hasClass("ui-tabs-selected")){j.selected=\r
--1;j.cookie&&i._cookie(j.selected,j.cookie);i.element.queue("tabs",function(){s(r,v)}).dequeue("tabs");this.blur();return false}else if(!v.length){j.cookie&&i._cookie(j.selected,j.cookie);i.element.queue("tabs",function(){q(r,w)});i.load(i.anchors.index(this));this.blur();return false}j.cookie&&i._cookie(j.selected,j.cookie);if(w.length){v.length&&i.element.queue("tabs",function(){s(r,v)});i.element.queue("tabs",function(){q(r,w)});i.load(i.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";\r
-b.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(c){if(typeof c=="string")c=this.anchors.index(this.anchors.filter("[href$="+c+"]"));return c},destroy:function(){var c=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 h=\r
-b.data(this,"href.tabs");if(h)this.href=h;var i=b(this).unbind(".tabs");b.each(["href","load","cache"],function(j,n){i.removeData(n+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){b.data(this,"destroy.tabs")?b(this).remove():b(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")});c.cookie&&this._cookie(null,c.cookie);return this},add:function(c,\r
-h,i){if(i===d)i=this.anchors.length;var j=this,n=this.options;h=b(n.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,h));c=!c.indexOf("#")?c.replace("#",""):this._tabId(b("a",h)[0]);h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var p=j.element.find("#"+c);p.length||(p=b(n.panelTemplate).attr("id",c).data("destroy.tabs",true));p.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(i>=this.lis.length){h.appendTo(this.list);p.appendTo(this.list[0].parentNode)}else{h.insertBefore(this.lis[i]);\r
-p.insertBefore(this.panels[i])}n.disabled=b.map(n.disabled,function(l){return l>=i?++l:l});this._tabify();if(this.anchors.length==1){n.selected=0;h.addClass("ui-tabs-selected ui-state-active");p.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){j._trigger("show",null,j._ui(j.anchors[0],j.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[i],this.panels[i]));return this},remove:function(c){c=this._getIndex(c);var h=this.options,i=this.lis.eq(c).remove(),j=this.panels.eq(c).remove();\r
-if(i.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(c+(c+1<this.anchors.length?1:-1));h.disabled=b.map(b.grep(h.disabled,function(n){return n!=c}),function(n){return n>=c?--n:n});this._tabify();this._trigger("remove",null,this._ui(i.find("a")[0],j[0]));return this},enable:function(c){c=this._getIndex(c);var h=this.options;if(b.inArray(c,h.disabled)!=-1){this.lis.eq(c).removeClass("ui-state-disabled");h.disabled=b.grep(h.disabled,function(i){return i!=c});this._trigger("enable",null,\r
-this._ui(this.anchors[c],this.panels[c]));return this}},disable:function(c){c=this._getIndex(c);var h=this.options;if(c!=h.selected){this.lis.eq(c).addClass("ui-state-disabled");h.disabled.push(c);h.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}return this},select:function(c){c=this._getIndex(c);if(c==-1)if(this.options.collapsible&&this.options.selected!=-1)c=this.options.selected;else return this;this.anchors.eq(c).trigger(this.options.event+".tabs");return this},\r
-load:function(c){c=this._getIndex(c);var h=this,i=this.options,j=this.anchors.eq(c)[0],n=b.data(j,"load.tabs");this.abort();if(!n||this.element.queue("tabs").length!==0&&b.data(j,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(c).addClass("ui-state-processing");if(i.spinner){var p=b("span",j);p.data("label.tabs",p.html()).html(i.spinner)}this.xhr=b.ajax(b.extend({},i.ajaxOptions,{url:n,success:function(l,k){h.element.find(h._sanitizeSelector(j.hash)).html(l);h._cleanup();i.cache&&b.data(j,\r
-"cache.tabs",true);h._trigger("load",null,h._ui(h.anchors[c],h.panels[c]));try{i.ajaxOptions.success(l,k)}catch(m){}},error:function(l,k){h._cleanup();h._trigger("load",null,h._ui(h.anchors[c],h.panels[c]));try{i.ajaxOptions.error(l,k,c,j)}catch(m){}}}));h.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},\r
-url:function(c,h){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",h);return this},length:function(){return this.anchors.length}});b.extend(b.ui.tabs,{version:"1.8.11"});b.extend(b.ui.tabs.prototype,{rotation:null,rotate:function(c,h){var i=this,j=this.options,n=i._rotate||(i._rotate=function(p){clearTimeout(i.rotation);i.rotation=setTimeout(function(){var l=j.selected;i.select(++l<i.anchors.length?l:0)},c);p&&p.stopPropagation()});h=i._unrotate||(i._unrotate=!h?function(p){p.clientX&&\r
+/*!
+ * jQuery UI 1.8.11
+ *
+ * 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
+ */
+(function(b,d){function e(g){return!b(g).parents().andSelf().filter(function(){return b.curCSS(this,"visibility")==="hidden"||b.expr.filters.hidden(this)}).length}b.ui=b.ui||{};if(!b.ui.version){b.extend(b.ui,{version:"1.8.11",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}});b.fn.extend({_focus:b.fn.focus,focus:function(g,f){return typeof g==="number"?this.each(function(){var a=this;setTimeout(function(){b(a).focus();f&&f.call(a)},g)}):this._focus.apply(this,arguments)},scrollParent:function(){var g;g=b.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(b.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this,"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this,"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!g.length?b(document):g},zIndex:function(g){if(g!==d)return this.css("zIndex",g);if(this.length){g=b(this[0]);for(var f;g.length&&g[0]!==document;){f=g.css("position");
+if(f==="absolute"||f==="relative"||f==="fixed"){f=parseInt(g.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}g=g.parent()}}return 0},disableSelection:function(){return this.bind((b.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(g){g.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});b.each(["Width","Height"],function(g,f){function a(j,n,p,l){b.each(c,function(){n-=parseFloat(b.curCSS(j,"padding"+this,true))||0;if(p)n-=parseFloat(b.curCSS(j,
+"border"+this+"Width",true))||0;if(l)n-=parseFloat(b.curCSS(j,"margin"+this,true))||0});return n}var c=f==="Width"?["Left","Right"]:["Top","Bottom"],h=f.toLowerCase(),i={innerWidth:b.fn.innerWidth,innerHeight:b.fn.innerHeight,outerWidth:b.fn.outerWidth,outerHeight:b.fn.outerHeight};b.fn["inner"+f]=function(j){if(j===d)return i["inner"+f].call(this);return this.each(function(){b(this).css(h,a(this,j)+"px")})};b.fn["outer"+f]=function(j,n){if(typeof j!=="number")return i["outer"+f].call(this,j);return this.each(function(){b(this).css(h,
+a(this,j,true,n)+"px")})}});b.extend(b.expr[":"],{data:function(g,f,a){return!!b.data(g,a[3])},focusable:function(g){var f=g.nodeName.toLowerCase(),a=b.attr(g,"tabindex");if("area"===f){f=g.parentNode;a=f.name;if(!g.href||!a||f.nodeName.toLowerCase()!=="map")return false;g=b("img[usemap=#"+a+"]")[0];return!!g&&e(g)}return(/input|select|textarea|button|object/.test(f)?!g.disabled:"a"==f?g.href||!isNaN(a):!isNaN(a))&&e(g)},tabbable:function(g){var f=b.attr(g,"tabindex");return(isNaN(f)||f>=0)&&b(g).is(":focusable")}});
+b(function(){var g=document.body,f=g.appendChild(f=document.createElement("div"));b.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});b.support.minHeight=f.offsetHeight===100;b.support.selectstart="onselectstart"in f;g.removeChild(f).style.display="none"});b.extend(b.ui,{plugin:{add:function(g,f,a){g=b.ui[g].prototype;for(var c in a){g.plugins[c]=g.plugins[c]||[];g.plugins[c].push([f,a[c]])}},call:function(g,f,a){if((f=g.plugins[f])&&g.element[0].parentNode)for(var c=0;c<f.length;c++)g.options[f[c][0]]&&
+f[c][1].apply(g.element,a)}},contains:function(g,f){return document.compareDocumentPosition?g.compareDocumentPosition(f)&16:g!==f&&g.contains(f)},hasScroll:function(g,f){if(b(g).css("overflow")==="hidden")return false;f=f&&f==="left"?"scrollLeft":"scrollTop";var a=false;if(g[f]>0)return true;g[f]=1;a=g[f]>0;g[f]=0;return a},isOverAxis:function(g,f,a){return g>f&&g<f+a},isOver:function(g,f,a,c,h,i){return b.ui.isOverAxis(g,a,h)&&b.ui.isOverAxis(f,c,i)}})}})(jQuery);
+(function(b,d){if(b.cleanData){var e=b.cleanData;b.cleanData=function(f){for(var a=0,c;(c=f[a])!=null;a++)b(c).triggerHandler("remove");e(f)}}else{var g=b.fn.remove;b.fn.remove=function(f,a){return this.each(function(){if(!a)if(!f||b.filter(f,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return g.call(b(this),f,a)})}}b.widget=function(f,a,c){var h=f.split(".")[0],i;f=f.split(".")[1];i=h+"-"+f;if(!c){c=a;a=b.Widget}b.expr[":"][i]=function(j){return!!b.data(j,
+f)};b[h]=b[h]||{};b[h][f]=function(j,n){arguments.length&&this._createWidget(j,n)};a=new a;a.options=b.extend(true,{},a.options);b[h][f].prototype=b.extend(true,a,{namespace:h,widgetName:f,widgetEventPrefix:b[h][f].prototype.widgetEventPrefix||f,widgetBaseClass:i},c);b.widget.bridge(f,b[h][f])};b.widget.bridge=function(f,a){b.fn[f]=function(c){var h=typeof c==="string",i=Array.prototype.slice.call(arguments,1),j=this;c=!h&&i.length?b.extend.apply(null,[true,c].concat(i)):c;if(h&&c.charAt(0)==="_")return j;
+h?this.each(function(){var n=b.data(this,f),p=n&&b.isFunction(n[c])?n[c].apply(n,i):n;if(p!==n&&p!==d){j=p;return false}}):this.each(function(){var n=b.data(this,f);n?n.option(c||{})._init():b.data(this,f,new a(c,this))});return j}};b.Widget=function(f,a){arguments.length&&this._createWidget(f,a)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,a){b.data(a,this.widgetName,this);this.element=b(a);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),f);var c=this;this.element.bind("remove."+this.widgetName,function(){c.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(f,a){var c=f;if(arguments.length===0)return b.extend({},this.options);if(typeof f==="string"){if(a===d)return this.options[f];c={};c[f]=a}this._setOptions(c);return this},_setOptions:function(f){var a=this;b.each(f,function(c,h){a._setOption(c,h)});return this},_setOption:function(f,a){this.options[f]=a;if(f==="disabled")this.widget()[a?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",a);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(f,a,c){var h=this.options[f];a=b.Event(a);a.type=(f===this.widgetEventPrefix?f:this.widgetEventPrefix+f).toLowerCase();c=c||{};if(a.originalEvent){f=b.event.props.length;for(var i;f;){i=b.event.props[--f];a[i]=a.originalEvent[i]}}this.element.trigger(a,c);return!(b.isFunction(h)&&h.call(this.element[0],a,c)===false||a.isDefaultPrevented())}}})(jQuery);
+(function(b){b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(d){d.originalEvent=
+d.originalEvent||{};if(!d.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(d);this._mouseDownEvent=d;var e=this,g=d.which==1,f=typeof this.options.cancel=="string"?b(d.target).parents().add(d.target).filter(this.options.cancel).length:false;if(!g||f||!this._mouseCapture(d))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=
+this._mouseStart(d)!==false;if(!this._mouseStarted){d.preventDefault();return true}}true===b.data(d.target,this.widgetName+".preventClickEvent")&&b.removeData(d.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(a){return e._mouseMove(a)};this._mouseUpDelegate=function(a){return e._mouseUp(a)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);d.preventDefault();return d.originalEvent.mouseHandled=
+true}},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button)return this._mouseUp(d);if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,d)!==false)?this._mouseDrag(d):this._mouseUp(d);return!this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);
+if(this._mouseStarted){this._mouseStarted=false;d.target==this._mouseDownEvent.target&&b.data(d.target,this.widgetName+".preventClickEvent",true);this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+(function(b){b.widget("ui.draggable",b.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(d){var e=
+this.options;if(this.helper||e.disabled||b(d.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(d);if(!this.handle)return false;return true},_mouseStart:function(d){var e=this.options;this.helper=this._createHelper(d);this._cacheHelperProportions();if(b.ui.ddmanager)b.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};b.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt);e.containment&&this._setContainment();if(this._trigger("start",d)===false){this._clear();return false}this._cacheHelperProportions();
+b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,d);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(d,true);return true},_mouseDrag:function(d,e){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!e){e=this._uiHash();if(this._trigger("drag",d,e)===false){this._mouseUp({});return false}this.position=e.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";b.ui.ddmanager&&b.ui.ddmanager.drag(this,d);return false},_mouseStop:function(d){var e=false;if(b.ui.ddmanager&&!this.options.dropBehaviour)e=b.ui.ddmanager.drop(this,d);if(this.dropped){e=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!e||this.options.revert=="valid"&&e||this.options.revert===true||b.isFunction(this.options.revert)&&
+this.options.revert.call(this.element,e)){var g=this;b(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){g._trigger("stop",d)!==false&&g._clear()})}else this._trigger("stop",d)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(d){var e=!this.options.handle||!b(this.options.handle,this.element).length?true:false;b(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
+d.target)e=true});return e},_createHelper:function(d){var e=this.options;d=b.isFunction(e.helper)?b(e.helper.apply(this.element[0],[d])):e.helper=="clone"?this.element.clone():this.element;d.parents("body").length||d.appendTo(e.appendTo=="parent"?this.element[0].parentNode:e.appendTo);d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(b.isArray(d))d={left:+d[0],top:+d[1]||
+0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],
+this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)d={top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.element.position();return{top:d.top-
+(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.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 d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[(d.containment=="document"?0:b(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(d.containment=="document"?0:b(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(d.containment=="document"?0:b(window).scrollLeft())+b(d.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(d.containment=="document"?0:b(window).scrollTop())+(b(d.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)&&d.containment.constructor!=Array){var e=b(d.containment)[0];if(e){d=b(d.containment).offset();var g=b(e).css("overflow")!="hidden";this.containment=[d.left+(parseInt(b(e).css("borderLeftWidth"),
+10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0),d.top+(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0),d.left+(g?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,d.top+(g?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),
+10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom]}}else if(d.containment.constructor==Array)this.containment=d.containment},_convertPositionTo:function(d,e){if(!e)e=this.position;d=d=="absolute"?1:-1;var g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);return{top:e.top+this.offset.relative.top*d+this.offset.parent.top*d-(b.browser.safari&&
+b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop())*d),left:e.left+this.offset.relative.left*d+this.offset.parent.left*d-(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:g.scrollLeft())*d)}},_generatePosition:function(d){var e=this.options,g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],
+this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName),a=d.pageX,c=d.pageY;if(this.originalPosition){if(this.containment){if(d.pageX-this.offset.click.left<this.containment[0])a=this.containment[0]+this.offset.click.left;if(d.pageY-this.offset.click.top<this.containment[1])c=this.containment[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>this.containment[2])a=this.containment[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>this.containment[3])c=
+this.containment[3]+this.offset.click.top}if(e.grid){c=this.originalPageY+Math.round((c-this.originalPageY)/e.grid[1])*e.grid[1];c=this.containment?!(c-this.offset.click.top<this.containment[1]||c-this.offset.click.top>this.containment[3])?c:!(c-this.offset.click.top<this.containment[1])?c-e.grid[1]:c+e.grid[1]:c;a=this.originalPageX+Math.round((a-this.originalPageX)/e.grid[0])*e.grid[0];a=this.containment?!(a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2])?
+a:!(a-this.offset.click.left<this.containment[0])?a-e.grid[0]:a+e.grid[0]:a}}return{top:c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
+f?0:g.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(d,e,g){g=g||this._uiHash();b.ui.plugin.call(this,d,[e,g]);if(d=="drag")this.positionAbs=this._convertPositionTo("absolute");return b.Widget.prototype._trigger.call(this,d,e,g)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,
+offset:this.positionAbs}}});b.extend(b.ui.draggable,{version:"1.8.11"});b.ui.plugin.add("draggable","connectToSortable",{start:function(d,e){var g=b(this).data("draggable"),f=g.options,a=b.extend({},e,{item:g.element});g.sortables=[];b(f.connectToSortable).each(function(){var c=b.data(this,"sortable");if(c&&!c.options.disabled){g.sortables.push({instance:c,shouldRevert:c.options.revert});c.refreshPositions();c._trigger("activate",d,a)}})},stop:function(d,e){var g=b(this).data("draggable"),f=b.extend({},
+e,{item:g.element});b.each(g.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;g.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(d);this.instance.options.helper=this.instance.options._helper;g.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",d,f)}})},drag:function(d,e){var g=
+b(this).data("draggable"),f=this;b.each(g.sortables,function(){this.instance.positionAbs=g.positionAbs;this.instance.helperProportions=g.helperProportions;this.instance.offset.click=g.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=b(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return e.helper[0]};
+d.target=this.instance.currentItem[0];this.instance._mouseCapture(d,true);this.instance._mouseStart(d,true,true);this.instance.offset.click.top=g.offset.click.top;this.instance.offset.click.left=g.offset.click.left;this.instance.offset.parent.left-=g.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=g.offset.parent.top-this.instance.offset.parent.top;g._trigger("toSortable",d);g.dropped=this.instance.element;g.currentItem=g.element;this.instance.fromOutside=g}this.instance.currentItem&&
+this.instance._mouseDrag(d)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",d,this.instance._uiHash(this.instance));this.instance._mouseStop(d,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();g._trigger("fromSortable",d);g.dropped=false}})}});b.ui.plugin.add("draggable","cursor",
+{start:function(){var d=b("body"),e=b(this).data("draggable").options;if(d.css("cursor"))e._cursor=d.css("cursor");d.css("cursor",e.cursor)},stop:function(){var d=b(this).data("draggable").options;d._cursor&&b("body").css("cursor",d._cursor)}});b.ui.plugin.add("draggable","iframeFix",{start:function(){var d=b(this).data("draggable").options;b(d.iframeFix===true?"iframe":d.iframeFix).each(function(){b('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+
+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(b(this).offset()).appendTo("body")})},stop:function(){b("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});b.ui.plugin.add("draggable","opacity",{start:function(d,e){d=b(e.helper);e=b(this).data("draggable").options;if(d.css("opacity"))e._opacity=d.css("opacity");d.css("opacity",e.opacity)},stop:function(d,e){d=b(this).data("draggable").options;d._opacity&&b(e.helper).css("opacity",
+d._opacity)}});b.ui.plugin.add("draggable","scroll",{start:function(){var d=b(this).data("draggable");if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML")d.overflowOffset=d.scrollParent.offset()},drag:function(d){var e=b(this).data("draggable"),g=e.options,f=false;if(e.scrollParent[0]!=document&&e.scrollParent[0].tagName!="HTML"){if(!g.axis||g.axis!="x")if(e.overflowOffset.top+e.scrollParent[0].offsetHeight-d.pageY<g.scrollSensitivity)e.scrollParent[0].scrollTop=f=e.scrollParent[0].scrollTop+
+g.scrollSpeed;else if(d.pageY-e.overflowOffset.top<g.scrollSensitivity)e.scrollParent[0].scrollTop=f=e.scrollParent[0].scrollTop-g.scrollSpeed;if(!g.axis||g.axis!="y")if(e.overflowOffset.left+e.scrollParent[0].offsetWidth-d.pageX<g.scrollSensitivity)e.scrollParent[0].scrollLeft=f=e.scrollParent[0].scrollLeft+g.scrollSpeed;else if(d.pageX-e.overflowOffset.left<g.scrollSensitivity)e.scrollParent[0].scrollLeft=f=e.scrollParent[0].scrollLeft-g.scrollSpeed}else{if(!g.axis||g.axis!="x")if(d.pageY-b(document).scrollTop()<
+g.scrollSensitivity)f=b(document).scrollTop(b(document).scrollTop()-g.scrollSpeed);else if(b(window).height()-(d.pageY-b(document).scrollTop())<g.scrollSensitivity)f=b(document).scrollTop(b(document).scrollTop()+g.scrollSpeed);if(!g.axis||g.axis!="y")if(d.pageX-b(document).scrollLeft()<g.scrollSensitivity)f=b(document).scrollLeft(b(document).scrollLeft()-g.scrollSpeed);else if(b(window).width()-(d.pageX-b(document).scrollLeft())<g.scrollSensitivity)f=b(document).scrollLeft(b(document).scrollLeft()+
+g.scrollSpeed)}f!==false&&b.ui.ddmanager&&!g.dropBehaviour&&b.ui.ddmanager.prepareOffsets(e,d)}});b.ui.plugin.add("draggable","snap",{start:function(){var d=b(this).data("draggable"),e=d.options;d.snapElements=[];b(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var g=b(this),f=g.offset();this!=d.element[0]&&d.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})})},drag:function(d,e){for(var g=b(this).data("draggable"),
+f=g.options,a=f.snapTolerance,c=e.offset.left,h=c+g.helperProportions.width,i=e.offset.top,j=i+g.helperProportions.height,n=g.snapElements.length-1;n>=0;n--){var p=g.snapElements[n].left,l=p+g.snapElements[n].width,k=g.snapElements[n].top,m=k+g.snapElements[n].height;if(p-a<c&&c<l+a&&k-a<i&&i<m+a||p-a<c&&c<l+a&&k-a<j&&j<m+a||p-a<h&&h<l+a&&k-a<i&&i<m+a||p-a<h&&h<l+a&&k-a<j&&j<m+a){if(f.snapMode!="inner"){var o=Math.abs(k-j)<=a,q=Math.abs(m-i)<=a,s=Math.abs(p-h)<=a,r=Math.abs(l-c)<=a;if(o)e.position.top=
+g._convertPositionTo("relative",{top:k-g.helperProportions.height,left:0}).top-g.margins.top;if(q)e.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top;if(s)e.position.left=g._convertPositionTo("relative",{top:0,left:p-g.helperProportions.width}).left-g.margins.left;if(r)e.position.left=g._convertPositionTo("relative",{top:0,left:l}).left-g.margins.left}var u=o||q||s||r;if(f.snapMode!="outer"){o=Math.abs(k-i)<=a;q=Math.abs(m-j)<=a;s=Math.abs(p-c)<=a;r=Math.abs(l-h)<=a;if(o)e.position.top=
+g._convertPositionTo("relative",{top:k,left:0}).top-g.margins.top;if(q)e.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top;if(s)e.position.left=g._convertPositionTo("relative",{top:0,left:p}).left-g.margins.left;if(r)e.position.left=g._convertPositionTo("relative",{top:0,left:l-g.helperProportions.width}).left-g.margins.left}if(!g.snapElements[n].snapping&&(o||q||s||r||u))g.options.snap.snap&&g.options.snap.snap.call(g.element,d,b.extend(g._uiHash(),
+{snapItem:g.snapElements[n].item}));g.snapElements[n].snapping=o||q||s||r||u}else{g.snapElements[n].snapping&&g.options.snap.release&&g.options.snap.release.call(g.element,d,b.extend(g._uiHash(),{snapItem:g.snapElements[n].item}));g.snapElements[n].snapping=false}}}});b.ui.plugin.add("draggable","stack",{start:function(){var d=b(this).data("draggable").options;d=b.makeArray(b(d.stack)).sort(function(g,f){return(parseInt(b(g).css("zIndex"),10)||0)-(parseInt(b(f).css("zIndex"),10)||0)});if(d.length){var e=
+parseInt(d[0].style.zIndex)||0;b(d).each(function(g){this.style.zIndex=e+g});this[0].style.zIndex=e+d.length}}});b.ui.plugin.add("draggable","zIndex",{start:function(d,e){d=b(e.helper);e=b(this).data("draggable").options;if(d.css("zIndex"))e._zIndex=d.css("zIndex");d.css("zIndex",e.zIndex)},stop:function(d,e){d=b(this).data("draggable").options;d._zIndex&&b(e.helper).css("zIndex",d._zIndex)}})})(jQuery);
+(function(b){b.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var d=this.options,e=d.accept;this.isover=0;this.isout=1;this.accept=b.isFunction(e)?e:function(g){return g.is(e)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};b.ui.ddmanager.droppables[d.scope]=b.ui.ddmanager.droppables[d.scope]||[];b.ui.ddmanager.droppables[d.scope].push(this);
+d.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var d=b.ui.ddmanager.droppables[this.options.scope],e=0;e<d.length;e++)d[e]==this&&d.splice(e,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(d,e){if(d=="accept")this.accept=b.isFunction(e)?e:function(g){return g.is(e)};b.Widget.prototype._setOption.apply(this,arguments)},_activate:function(d){var e=b.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);e&&this._trigger("activate",d,this.ui(e))},_deactivate:function(d){var e=b.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);e&&this._trigger("deactivate",d,this.ui(e))},_over:function(d){var e=b.ui.ddmanager.current;if(!(!e||(e.currentItem||e.element)[0]==this.element[0]))if(this.accept.call(this.element[0],e.currentItem||e.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",d,this.ui(e))}},_out:function(d){var e=b.ui.ddmanager.current;if(!(!e||(e.currentItem||e.element)[0]==this.element[0]))if(this.accept.call(this.element[0],e.currentItem||e.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",d,this.ui(e))}},_drop:function(d,e){var g=e||b.ui.ddmanager.current;if(!g||(g.currentItem||g.element)[0]==this.element[0])return false;var f=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var a=
+b.data(this,"droppable");if(a.options.greedy&&!a.options.disabled&&a.options.scope==g.options.scope&&a.accept.call(a.element[0],g.currentItem||g.element)&&b.ui.intersect(g,b.extend(a,{offset:a.element.offset()}),a.options.tolerance)){f=true;return false}});if(f)return false;if(this.accept.call(this.element[0],g.currentItem||g.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+d,this.ui(g));return this.element}return false},ui:function(d){return{draggable:d.currentItem||d.element,helper:d.helper,position:d.position,offset:d.positionAbs}}});b.extend(b.ui.droppable,{version:"1.8.11"});b.ui.intersect=function(d,e,g){if(!e.offset)return false;var f=(d.positionAbs||d.position.absolute).left,a=f+d.helperProportions.width,c=(d.positionAbs||d.position.absolute).top,h=c+d.helperProportions.height,i=e.offset.left,j=i+e.proportions.width,n=e.offset.top,p=n+e.proportions.height;
+switch(g){case "fit":return i<=f&&a<=j&&n<=c&&h<=p;case "intersect":return i<f+d.helperProportions.width/2&&a-d.helperProportions.width/2<j&&n<c+d.helperProportions.height/2&&h-d.helperProportions.height/2<p;case "pointer":return b.ui.isOver((d.positionAbs||d.position.absolute).top+(d.clickOffset||d.offset.click).top,(d.positionAbs||d.position.absolute).left+(d.clickOffset||d.offset.click).left,n,i,e.proportions.height,e.proportions.width);case "touch":return(c>=n&&c<=p||h>=n&&h<=p||c<n&&h>p)&&(f>=
+i&&f<=j||a>=i&&a<=j||f<i&&a>j);default:return false}};b.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(d,e){var g=b.ui.ddmanager.droppables[d.options.scope]||[],f=e?e.type:null,a=(d.currentItem||d.element).find(":data(droppable)").andSelf(),c=0;a:for(;c<g.length;c++)if(!(g[c].options.disabled||d&&!g[c].accept.call(g[c].element[0],d.currentItem||d.element))){for(var h=0;h<a.length;h++)if(a[h]==g[c].element[0]){g[c].proportions.height=0;continue a}g[c].visible=g[c].element.css("display")!=
+"none";if(g[c].visible){f=="mousedown"&&g[c]._activate.call(g[c],e);g[c].offset=g[c].element.offset();g[c].proportions={width:g[c].element[0].offsetWidth,height:g[c].element[0].offsetHeight}}}},drop:function(d,e){var g=false;b.each(b.ui.ddmanager.droppables[d.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&b.ui.intersect(d,this,this.options.tolerance))g=g||this._drop.call(this,e);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],d.currentItem||
+d.element)){this.isout=1;this.isover=0;this._deactivate.call(this,e)}}});return g},drag:function(d,e){d.options.refreshPositions&&b.ui.ddmanager.prepareOffsets(d,e);b.each(b.ui.ddmanager.droppables[d.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var g=b.ui.intersect(d,this,this.options.tolerance);if(g=!g&&this.isover==1?"isout":g&&this.isover==0?"isover":null){var f;if(this.options.greedy){var a=this.element.parents(":data(droppable):eq(0)");if(a.length){f=
+b.data(a[0],"droppable");f.greedyChild=g=="isover"?1:0}}if(f&&g=="isover"){f.isover=0;f.isout=1;f._out.call(f,e)}this[g]=1;this[g=="isout"?"isover":"isout"]=0;this[g=="isover"?"_over":"_out"].call(this,e);if(f&&g=="isout"){f.isout=0;f.isover=1;f._over.call(f,e)}}}})}}})(jQuery);
+(function(b){b.widget("ui.resizable",b.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var g=this,f=this.options;this.element.addClass("ui-resizable");b.extend(this,{_aspectRatio:!!f.aspectRatio,aspectRatio:f.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:f.helper||f.ghost||f.animate?f.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&b.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(b('<div class="ui-wrapper" style="overflow: hidden;"></div>').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=f.handles||(!b(".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 a=this.handles.split(",");this.handles={};for(var c=0;c<a.length;c++){var h=b.trim(a[c]),i=b('<div class="ui-resizable-handle '+("ui-resizable-"+h)+'"></div>');/sw|se|ne|nw/.test(h)&&i.css({zIndex:++f.zIndex});"se"==h&&i.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[h]=".ui-resizable-"+h;this.element.append(i)}}this._renderAxis=function(j){j=j||this.element;for(var n in this.handles){if(this.handles[n].constructor==
+String)this.handles[n]=b(this.handles[n],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var p=b(this.handles[n],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(n)?p.outerHeight():p.outerWidth();p=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");j.css(p,l);this._proportionallyResize()}b(this.handles[n])}};this._renderAxis(this.element);this._handles=b(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!g.resizing){if(this.className)var j=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);g.axis=j&&j[1]?j[1]:"se"}});if(f.autoHide){this._handles.hide();b(this.element).addClass("ui-resizable-autohide").hover(function(){b(this).removeClass("ui-resizable-autohide");g._handles.show()},function(){if(!g.resizing){b(this).addClass("ui-resizable-autohide");g._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var g=function(a){b(a).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){g(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);g(this.originalElement);return this},_mouseCapture:function(g){var f=false;for(var a in this.handles)if(b(this.handles[a])[0]==g.target)f=true;return!this.options.disabled&&f},_mouseStart:function(g){var f=this.options,a=this.element.position(),
+c=this.element;this.resizing=true;this.documentScroll={top:b(document).scrollTop(),left:b(document).scrollLeft()};if(c.is(".ui-draggable")||/absolute/.test(c.css("position")))c.css({position:"absolute",top:a.top,left:a.left});b.browser.opera&&/relative/.test(c.css("position"))&&c.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();a=d(this.helper.css("left"));var h=d(this.helper.css("top"));if(f.containment){a+=b(f.containment).scrollLeft()||0;h+=b(f.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:a,top:h};this.size=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalSize=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalPosition={left:a,top:h};this.sizeDiff={width:c.outerWidth()-c.width(),height:c.outerHeight()-c.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=typeof f.aspectRatio=="number"?f.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;f=b(".ui-resizable-"+this.axis).css("cursor");b("body").css("cursor",f=="auto"?this.axis+"-resize":f);c.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(g){var f=this.helper,a=this.originalMousePosition,c=this._change[this.axis];if(!c)return false;a=c.apply(this,[g,g.pageX-a.left||0,g.pageY-a.top||0]);if(this._aspectRatio||g.shiftKey)a=this._updateRatio(a,g);a=this._respectSize(a,g);this._propagate("resize",
+g);f.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(a);this._trigger("resize",g,this.ui());return false},_mouseStop:function(g){this.resizing=false;var f=this.options,a=this;if(this._helper){var c=this._proportionallyResizeElements,h=c.length&&/textarea/i.test(c[0].nodeName);c=h&&b.ui.hasScroll(c[0],"left")?0:a.sizeDiff.height;
+h=h?0:a.sizeDiff.width;h={width:a.helper.width()-h,height:a.helper.height()-c};c=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var i=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;f.animate||this.element.css(b.extend(h,{top:i,left:c}));a.helper.height(a.size.height);a.helper.width(a.size.width);this._helper&&!f.animate&&this._proportionallyResize()}b("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");
+this._propagate("stop",g);this._helper&&this.helper.remove();return false},_updateCache:function(g){this.offset=this.helper.offset();if(e(g.left))this.position.left=g.left;if(e(g.top))this.position.top=g.top;if(e(g.height))this.size.height=g.height;if(e(g.width))this.size.width=g.width},_updateRatio:function(g){var f=this.position,a=this.size,c=this.axis;if(g.height)g.width=a.height*this.aspectRatio;else if(g.width)g.height=a.width/this.aspectRatio;if(c=="sw"){g.left=f.left+(a.width-g.width);g.top=
+null}if(c=="nw"){g.top=f.top+(a.height-g.height);g.left=f.left+(a.width-g.width)}return g},_respectSize:function(g){var f=this.options,a=this.axis,c=e(g.width)&&f.maxWidth&&f.maxWidth<g.width,h=e(g.height)&&f.maxHeight&&f.maxHeight<g.height,i=e(g.width)&&f.minWidth&&f.minWidth>g.width,j=e(g.height)&&f.minHeight&&f.minHeight>g.height;if(i)g.width=f.minWidth;if(j)g.height=f.minHeight;if(c)g.width=f.maxWidth;if(h)g.height=f.maxHeight;var n=this.originalPosition.left+this.originalSize.width,p=this.position.top+
+this.size.height,l=/sw|nw|w/.test(a);a=/nw|ne|n/.test(a);if(i&&l)g.left=n-f.minWidth;if(c&&l)g.left=n-f.maxWidth;if(j&&a)g.top=p-f.minHeight;if(h&&a)g.top=p-f.maxHeight;if((f=!g.width&&!g.height)&&!g.left&&g.top)g.top=null;else if(f&&!g.top&&g.left)g.left=null;return g},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var g=this.helper||this.element,f=0;f<this._proportionallyResizeElements.length;f++){var a=this._proportionallyResizeElements[f];if(!this.borderDif){var c=
+[a.css("borderTopWidth"),a.css("borderRightWidth"),a.css("borderBottomWidth"),a.css("borderLeftWidth")],h=[a.css("paddingTop"),a.css("paddingRight"),a.css("paddingBottom"),a.css("paddingLeft")];this.borderDif=b.map(c,function(i,j){i=parseInt(i,10)||0;j=parseInt(h[j],10)||0;return i+j})}b.browser.msie&&(b(g).is(":hidden")||b(g).parents(":hidden").length)||a.css({height:g.height()-this.borderDif[0]-this.borderDif[2]||0,width:g.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var g=
+this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||b('<div style="overflow:hidden;"></div>');var f=b.browser.msie&&b.browser.version<7,a=f?1:0;f=f?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-a+"px",top:this.elementOffset.top-a+"px",zIndex:++g.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(g,
+f){return{width:this.originalSize.width+f}},w:function(g,f){return{left:this.originalPosition.left+f,width:this.originalSize.width-f}},n:function(g,f,a){return{top:this.originalPosition.top+a,height:this.originalSize.height-a}},s:function(g,f,a){return{height:this.originalSize.height+a}},se:function(g,f,a){return b.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,a]))},sw:function(g,f,a){return b.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,
+a]))},ne:function(g,f,a){return b.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,a]))},nw:function(g,f,a){return b.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,a]))}},_propagate:function(g,f){b.ui.plugin.call(this,g,[f,this.ui()]);g!="resize"&&this._trigger(g,f,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}}});b.extend(b.ui.resizable,{version:"1.8.11"});b.ui.plugin.add("resizable","alsoResize",{start:function(){var g=b(this).data("resizable").options,f=function(a){b(a).each(function(){var c=b(this);c.data("resizable-alsoresize",{width:parseInt(c.width(),10),height:parseInt(c.height(),10),left:parseInt(c.css("left"),10),top:parseInt(c.css("top"),10),position:c.css("position")})})};if(typeof g.alsoResize=="object"&&!g.alsoResize.parentNode)if(g.alsoResize.length){g.alsoResize=
+g.alsoResize[0];f(g.alsoResize)}else b.each(g.alsoResize,function(a){f(a)});else f(g.alsoResize)},resize:function(g,f){var a=b(this).data("resizable");g=a.options;var c=a.originalSize,h=a.originalPosition,i={height:a.size.height-c.height||0,width:a.size.width-c.width||0,top:a.position.top-h.top||0,left:a.position.left-h.left||0},j=function(n,p){b(n).each(function(){var l=b(this),k=b(this).data("resizable-alsoresize"),m={},o=p&&p.length?p:l.parents(f.originalElement[0]).length?["width","height"]:["width",
+"height","top","left"];b.each(o,function(q,s){if((q=(k[s]||0)+(i[s]||0))&&q>=0)m[s]=q||null});if(b.browser.opera&&/relative/.test(l.css("position"))){a._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(m)})};typeof g.alsoResize=="object"&&!g.alsoResize.nodeType?b.each(g.alsoResize,function(n,p){j(n,p)}):j(g.alsoResize)},stop:function(){var g=b(this).data("resizable"),f=g.options,a=function(c){b(c).each(function(){var h=b(this);h.css({position:h.data("resizable-alsoresize").position})})};
+if(g._revertToRelativePosition){g._revertToRelativePosition=false;typeof f.alsoResize=="object"&&!f.alsoResize.nodeType?b.each(f.alsoResize,function(c){a(c)}):a(f.alsoResize)}b(this).removeData("resizable-alsoresize")}});b.ui.plugin.add("resizable","animate",{stop:function(g){var f=b(this).data("resizable"),a=f.options,c=f._proportionallyResizeElements,h=c.length&&/textarea/i.test(c[0].nodeName),i=h&&b.ui.hasScroll(c[0],"left")?0:f.sizeDiff.height;h={width:f.size.width-(h?0:f.sizeDiff.width),height:f.size.height-
+i};i=parseInt(f.element.css("left"),10)+(f.position.left-f.originalPosition.left)||null;var j=parseInt(f.element.css("top"),10)+(f.position.top-f.originalPosition.top)||null;f.element.animate(b.extend(h,j&&i?{top:j,left:i}:{}),{duration:a.animateDuration,easing:a.animateEasing,step:function(){var n={width:parseInt(f.element.css("width"),10),height:parseInt(f.element.css("height"),10),top:parseInt(f.element.css("top"),10),left:parseInt(f.element.css("left"),10)};c&&c.length&&b(c[0]).css({width:n.width,
+height:n.height});f._updateCache(n);f._propagate("resize",g)}})}});b.ui.plugin.add("resizable","containment",{start:function(){var g=b(this).data("resizable"),f=g.element,a=g.options.containment;if(f=a instanceof b?a.get(0):/parent/.test(a)?f.parent().get(0):a){g.containerElement=b(f);if(/document/.test(a)||a==document){g.containerOffset={left:0,top:0};g.containerPosition={left:0,top:0};g.parentData={element:b(document),left:0,top:0,width:b(document).width(),height:b(document).height()||document.body.parentNode.scrollHeight}}else{var c=
+b(f),h=[];b(["Top","Right","Left","Bottom"]).each(function(n,p){h[n]=d(c.css("padding"+p))});g.containerOffset=c.offset();g.containerPosition=c.position();g.containerSize={height:c.innerHeight()-h[3],width:c.innerWidth()-h[1]};a=g.containerOffset;var i=g.containerSize.height,j=g.containerSize.width;j=b.ui.hasScroll(f,"left")?f.scrollWidth:j;i=b.ui.hasScroll(f)?f.scrollHeight:i;g.parentData={element:f,left:a.left,top:a.top,width:j,height:i}}}},resize:function(g){var f=b(this).data("resizable"),a=f.options,
+c=f.containerOffset,h=f.position;g=f._aspectRatio||g.shiftKey;var i={top:0,left:0},j=f.containerElement;if(j[0]!=document&&/static/.test(j.css("position")))i=c;if(h.left<(f._helper?c.left:0)){f.size.width+=f._helper?f.position.left-c.left:f.position.left-i.left;if(g)f.size.height=f.size.width/a.aspectRatio;f.position.left=a.helper?c.left:0}if(h.top<(f._helper?c.top:0)){f.size.height+=f._helper?f.position.top-c.top:f.position.top;if(g)f.size.width=f.size.height*a.aspectRatio;f.position.top=f._helper?
+c.top:0}f.offset.left=f.parentData.left+f.position.left;f.offset.top=f.parentData.top+f.position.top;a=Math.abs((f._helper?f.offset.left-i.left:f.offset.left-i.left)+f.sizeDiff.width);c=Math.abs((f._helper?f.offset.top-i.top:f.offset.top-c.top)+f.sizeDiff.height);h=f.containerElement.get(0)==f.element.parent().get(0);i=/relative|absolute/.test(f.containerElement.css("position"));if(h&&i)a-=f.parentData.left;if(a+f.size.width>=f.parentData.width){f.size.width=f.parentData.width-a;if(g)f.size.height=
+f.size.width/f.aspectRatio}if(c+f.size.height>=f.parentData.height){f.size.height=f.parentData.height-c;if(g)f.size.width=f.size.height*f.aspectRatio}},stop:function(){var g=b(this).data("resizable"),f=g.options,a=g.containerOffset,c=g.containerPosition,h=g.containerElement,i=b(g.helper),j=i.offset(),n=i.outerWidth()-g.sizeDiff.width;i=i.outerHeight()-g.sizeDiff.height;g._helper&&!f.animate&&/relative/.test(h.css("position"))&&b(this).css({left:j.left-c.left-a.left,width:n,height:i});g._helper&&!f.animate&&
+/static/.test(h.css("position"))&&b(this).css({left:j.left-c.left-a.left,width:n,height:i})}});b.ui.plugin.add("resizable","ghost",{start:function(){var g=b(this).data("resizable"),f=g.options,a=g.size;g.ghost=g.originalElement.clone();g.ghost.css({opacity:0.25,display:"block",position:"relative",height:a.height,width:a.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof f.ghost=="string"?f.ghost:"");g.ghost.appendTo(g.helper)},resize:function(){var g=b(this).data("resizable");
+g.ghost&&g.ghost.css({position:"relative",height:g.size.height,width:g.size.width})},stop:function(){var g=b(this).data("resizable");g.ghost&&g.helper&&g.helper.get(0).removeChild(g.ghost.get(0))}});b.ui.plugin.add("resizable","grid",{resize:function(){var g=b(this).data("resizable"),f=g.options,a=g.size,c=g.originalSize,h=g.originalPosition,i=g.axis;f.grid=typeof f.grid=="number"?[f.grid,f.grid]:f.grid;var j=Math.round((a.width-c.width)/(f.grid[0]||1))*(f.grid[0]||1);f=Math.round((a.height-c.height)/
+(f.grid[1]||1))*(f.grid[1]||1);if(/^(se|s|e)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f}else if(/^(ne)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f;g.position.top=h.top-f}else{if(/^(sw)$/.test(i)){g.size.width=c.width+j;g.size.height=c.height+f}else{g.size.width=c.width+j;g.size.height=c.height+f;g.position.top=h.top-f}g.position.left=h.left-j}}});var d=function(g){return parseInt(g,10)||0},e=function(g){return!isNaN(parseInt(g,10))}})(jQuery);
+(function(b){b.widget("ui.selectable",b.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var d=this;this.element.addClass("ui-selectable");this.dragged=false;var e;this.refresh=function(){e=b(d.options.filter,d.element[0]);e.each(function(){var g=b(this),f=g.offset();b.data(this,"selectable-item",{element:this,$element:g,left:f.left,top:f.top,right:f.left+g.outerWidth(),bottom:f.top+g.outerHeight(),startselected:false,selected:g.hasClass("ui-selected"),
+selecting:g.hasClass("ui-selecting"),unselecting:g.hasClass("ui-unselecting")})})};this.refresh();this.selectees=e.addClass("ui-selectee");this._mouseInit();this.helper=b("<div class='ui-selectable-helper'></div>")},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 e=this;this.opos=[d.pageX,
+d.pageY];if(!this.options.disabled){var g=this.options;this.selectees=b(g.filter,this.element[0]);this._trigger("start",d);b(g.appendTo).append(this.helper);this.helper.css({left:d.clientX,top:d.clientY,width:0,height:0});g.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var f=b.data(this,"selectable-item");f.startselected=true;if(!d.metaKey){f.$element.removeClass("ui-selected");f.selected=false;f.$element.addClass("ui-unselecting");f.unselecting=true;e._trigger("unselecting",
+d,{unselecting:f.element})}});b(d.target).parents().andSelf().each(function(){var f=b.data(this,"selectable-item");if(f){var a=!d.metaKey||!f.$element.hasClass("ui-selected");f.$element.removeClass(a?"ui-unselecting":"ui-selected").addClass(a?"ui-selecting":"ui-unselecting");f.unselecting=!a;f.selecting=a;(f.selected=a)?e._trigger("selecting",d,{selecting:f.element}):e._trigger("unselecting",d,{unselecting:f.element});return false}})}},_mouseDrag:function(d){var e=this;this.dragged=true;if(!this.options.disabled){var g=
+this.options,f=this.opos[0],a=this.opos[1],c=d.pageX,h=d.pageY;if(f>c){var i=c;c=f;f=i}if(a>h){i=h;h=a;a=i}this.helper.css({left:f,top:a,width:c-f,height:h-a});this.selectees.each(function(){var j=b.data(this,"selectable-item");if(!(!j||j.element==e.element[0])){var n=false;if(g.tolerance=="touch")n=!(j.left>c||j.right<f||j.top>h||j.bottom<a);else if(g.tolerance=="fit")n=j.left>f&&j.right<c&&j.top>a&&j.bottom<h;if(n){if(j.selected){j.$element.removeClass("ui-selected");j.selected=false}if(j.unselecting){j.$element.removeClass("ui-unselecting");
+j.unselecting=false}if(!j.selecting){j.$element.addClass("ui-selecting");j.selecting=true;e._trigger("selecting",d,{selecting:j.element})}}else{if(j.selecting)if(d.metaKey&&j.startselected){j.$element.removeClass("ui-selecting");j.selecting=false;j.$element.addClass("ui-selected");j.selected=true}else{j.$element.removeClass("ui-selecting");j.selecting=false;if(j.startselected){j.$element.addClass("ui-unselecting");j.unselecting=true}e._trigger("unselecting",d,{unselecting:j.element})}if(j.selected)if(!d.metaKey&&
+!j.startselected){j.$element.removeClass("ui-selected");j.selected=false;j.$element.addClass("ui-unselecting");j.unselecting=true;e._trigger("unselecting",d,{unselecting:j.element})}}}});return false}},_mouseStop:function(d){var e=this;this.dragged=false;b(".ui-unselecting",this.element[0]).each(function(){var g=b.data(this,"selectable-item");g.$element.removeClass("ui-unselecting");g.unselecting=false;g.startselected=false;e._trigger("unselected",d,{unselected:g.element})});b(".ui-selecting",this.element[0]).each(function(){var g=
+b.data(this,"selectable-item");g.$element.removeClass("ui-selecting").addClass("ui-selected");g.selecting=false;g.selected=true;g.startselected=true;e._trigger("selected",d,{selected:g.element})});this._trigger("stop",d);this.helper.remove();return false}});b.extend(b.ui.selectable,{version:"1.8.11"})})(jQuery);
+(function(b){b.widget("ui.sortable",b.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",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 d=this.items.length-1;d>=0;d--)this.items[d].item.removeData("sortable-item");return this},_setOption:function(d,e){if(d==="disabled"){this.options[d]=
+e;this.widget()[e?"addClass":"removeClass"]("ui-sortable-disabled")}else b.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(d,e){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(d);var g=null,f=this;b(d.target).parents().each(function(){if(b.data(this,"sortable-item")==f){g=b(this);return false}});if(b.data(d.target,"sortable-item")==f)g=b(d.target);if(!g)return false;if(this.options.handle&&!e){var a=false;
+b(this.options.handle,g).find("*").andSelf().each(function(){if(this==d.target)a=true});if(!a)return false}this.currentItem=g;this._removeCurrentsFromItems();return true},_mouseStart:function(d,e,g){e=this.options;var f=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(d);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");b.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
+this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();e.containment&&this._setContainment();if(e.cursor){if(b("body").css("cursor"))this._storedCursor=b("body").css("cursor");b("body").css("cursor",e.cursor)}if(e.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",e.opacity)}if(e.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",e.zIndex)}if(this.scrollParent[0]!=
+document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",d,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!g)for(g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",d,f._uiHash(this));if(b.ui.ddmanager)b.ui.ddmanager.current=this;b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,d);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(d);
+return true},_mouseDrag:function(d){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var e=this.options,g=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-d.pageY<e.scrollSensitivity)this.scrollParent[0].scrollTop=g=this.scrollParent[0].scrollTop+e.scrollSpeed;else if(d.pageY-this.overflowOffset.top<
+e.scrollSensitivity)this.scrollParent[0].scrollTop=g=this.scrollParent[0].scrollTop-e.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-d.pageX<e.scrollSensitivity)this.scrollParent[0].scrollLeft=g=this.scrollParent[0].scrollLeft+e.scrollSpeed;else if(d.pageX-this.overflowOffset.left<e.scrollSensitivity)this.scrollParent[0].scrollLeft=g=this.scrollParent[0].scrollLeft-e.scrollSpeed}else{if(d.pageY-b(document).scrollTop()<e.scrollSensitivity)g=b(document).scrollTop(b(document).scrollTop()-
+e.scrollSpeed);else if(b(window).height()-(d.pageY-b(document).scrollTop())<e.scrollSensitivity)g=b(document).scrollTop(b(document).scrollTop()+e.scrollSpeed);if(d.pageX-b(document).scrollLeft()<e.scrollSensitivity)g=b(document).scrollLeft(b(document).scrollLeft()-e.scrollSpeed);else if(b(window).width()-(d.pageX-b(document).scrollLeft())<e.scrollSensitivity)g=b(document).scrollLeft(b(document).scrollLeft()+e.scrollSpeed)}g!==false&&b.ui.ddmanager&&!e.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,
+d)}this.positionAbs=this._convertPositionTo("absolute");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";for(e=this.items.length-1;e>=0;e--){g=this.items[e];var f=g.item[0],a=this._intersectsWithPointer(g);if(a)if(f!=this.currentItem[0]&&this.placeholder[a==1?"next":"prev"]()[0]!=f&&!b.ui.contains(this.placeholder[0],f)&&(this.options.type=="semi-dynamic"?!b.ui.contains(this.element[0],
+f):true)){this.direction=a==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(g))this._rearrange(d,g);else break;this._trigger("change",d,this._uiHash());break}}this._contactContainers(d);b.ui.ddmanager&&b.ui.ddmanager.drag(this,d);this._trigger("sort",d,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(d,e){if(d){b.ui.ddmanager&&!this.options.dropBehaviour&&b.ui.ddmanager.drop(this,d);if(this.options.revert){var g=this;e=g.placeholder.offset();
+g.reverting=true;b(this.helper).animate({left:e.left-this.offset.parent.left-g.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-g.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){g._clear(d)})}else this._clear(d,e);return false}},cancel:function(){var d=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 e=this.containers.length-1;e>=0;e--){this.containers[e]._trigger("deactivate",null,d._uiHash(this));if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",null,d._uiHash(this));this.containers[e].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();b.extend(this,{helper:null,
+dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?b(this.domPosition.prev).after(this.currentItem):b(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(d){var e=this._getItemsAsjQuery(d&&d.connected),g=[];d=d||{};b(e).each(function(){var f=(b(d.item||this).attr(d.attribute||"id")||"").match(d.expression||/(.+)[-=_](.+)/);if(f)g.push((d.key||f[1]+"[]")+"="+(d.key&&d.expression?f[1]:f[2]))});!g.length&&d.key&&g.push(d.key+"=");return g.join("&")},
+toArray:function(d){var e=this._getItemsAsjQuery(d&&d.connected),g=[];d=d||{};e.each(function(){g.push(b(d.item||this).attr(d.attribute||"id")||"")});return g},_intersectsWith:function(d){var e=this.positionAbs.left,g=e+this.helperProportions.width,f=this.positionAbs.top,a=f+this.helperProportions.height,c=d.left,h=c+d.width,i=d.top,j=i+d.height,n=this.offset.click.top,p=this.offset.click.left;n=f+n>i&&f+n<j&&e+p>c&&e+p<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||
+this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>d[this.floating?"width":"height"]?n:c<e+this.helperProportions.width/2&&g-this.helperProportions.width/2<h&&i<f+this.helperProportions.height/2&&a-this.helperProportions.height/2<j},_intersectsWithPointer:function(d){var e=b.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top,d.height);d=b.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left,d.width);e=e&&d;d=this._getDragVerticalDirection();
+var g=this._getDragHorizontalDirection();if(!e)return false;return this.floating?g&&g=="right"||d=="down"?2:1:d&&(d=="down"?2:1)},_intersectsWithSides:function(d){var e=b.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top+d.height/2,d.height);d=b.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left+d.width/2,d.width);var g=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();return this.floating&&f?f=="right"&&d||f=="left"&&!d:g&&(g=="down"&&e||g=="up"&&!e)},
+_getDragVerticalDirection:function(){var d=this.positionAbs.top-this.lastPositionAbs.top;return d!=0&&(d>0?"down":"up")},_getDragHorizontalDirection:function(){var d=this.positionAbs.left-this.lastPositionAbs.left;return d!=0&&(d>0?"right":"left")},refresh:function(d){this._refreshItems(d);this.refreshPositions();return this},_connectWith:function(){var d=this.options;return d.connectWith.constructor==String?[d.connectWith]:d.connectWith},_getItemsAsjQuery:function(d){var e=[],g=[],f=this._connectWith();
+if(f&&d)for(d=f.length-1;d>=0;d--)for(var a=b(f[d]),c=a.length-1;c>=0;c--){var h=b.data(a[c],"sortable");if(h&&h!=this&&!h.options.disabled)g.push([b.isFunction(h.options.items)?h.options.items.call(h.element):b(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}g.push([b.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):b(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
+this]);for(d=g.length-1;d>=0;d--)g[d][0].each(function(){e.push(this)});return b(e)},_removeCurrentsFromItems:function(){for(var d=this.currentItem.find(":data(sortable-item)"),e=0;e<this.items.length;e++)for(var g=0;g<d.length;g++)d[g]==this.items[e].item[0]&&this.items.splice(e,1)},_refreshItems:function(d){this.items=[];this.containers=[this];var e=this.items,g=[[b.isFunction(this.options.items)?this.options.items.call(this.element[0],d,{item:this.currentItem}):b(this.options.items,this.element),
+this]],f=this._connectWith();if(f)for(var a=f.length-1;a>=0;a--)for(var c=b(f[a]),h=c.length-1;h>=0;h--){var i=b.data(c[h],"sortable");if(i&&i!=this&&!i.options.disabled){g.push([b.isFunction(i.options.items)?i.options.items.call(i.element[0],d,{item:this.currentItem}):b(i.options.items,i.element),i]);this.containers.push(i)}}for(a=g.length-1;a>=0;a--){d=g[a][1];f=g[a][0];h=0;for(c=f.length;h<c;h++){i=b(f[h]);i.data("sortable-item",d);e.push({item:i,instance:d,width:0,height:0,left:0,top:0})}}},refreshPositions:function(d){if(this.offsetParent&&
+this.helper)this.offset.parent=this._getParentOffset();for(var e=this.items.length-1;e>=0;e--){var g=this.items[e],f=this.options.toleranceElement?b(this.options.toleranceElement,g.item):g.item;if(!d){g.width=f.outerWidth();g.height=f.outerHeight()}f=f.offset();g.left=f.left;g.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(e=this.containers.length-1;e>=0;e--){f=this.containers[e].element.offset();this.containers[e].containerCache.left=
+f.left;this.containers[e].containerCache.top=f.top;this.containers[e].containerCache.width=this.containers[e].element.outerWidth();this.containers[e].containerCache.height=this.containers[e].element.outerHeight()}return this},_createPlaceholder:function(d){var e=d||this,g=e.options;if(!g.placeholder||g.placeholder.constructor==String){var f=g.placeholder;g.placeholder={element:function(){var a=b(document.createElement(e.currentItem[0].nodeName)).addClass(f||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];
+if(!f)a.style.visibility="hidden";return a},update:function(a,c){if(!(f&&!g.forcePlaceholderSize)){c.height()||c.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10));c.width()||c.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10))}}}}e.placeholder=b(g.placeholder.element.call(e.element,e.currentItem));e.currentItem.after(e.placeholder);
+g.placeholder.update(e,e.placeholder)},_contactContainers:function(d){for(var e=null,g=null,f=this.containers.length-1;f>=0;f--)if(!b.ui.contains(this.currentItem[0],this.containers[f].element[0]))if(this._intersectsWith(this.containers[f].containerCache)){if(!(e&&b.ui.contains(this.containers[f].element[0],e.element[0]))){e=this.containers[f];g=f}}else if(this.containers[f].containerCache.over){this.containers[f]._trigger("out",d,this._uiHash(this));this.containers[f].containerCache.over=0}if(e)if(this.containers.length===
+1){this.containers[g]._trigger("over",d,this._uiHash(this));this.containers[g].containerCache.over=1}else if(this.currentContainer!=this.containers[g]){e=1E4;f=null;for(var a=this.positionAbs[this.containers[g].floating?"left":"top"],c=this.items.length-1;c>=0;c--)if(b.ui.contains(this.containers[g].element[0],this.items[c].item[0])){var h=this.items[c][this.containers[g].floating?"left":"top"];if(Math.abs(h-a)<e){e=Math.abs(h-a);f=this.items[c]}}if(f||this.options.dropOnEmpty){this.currentContainer=
+this.containers[g];f?this._rearrange(d,f,null,true):this._rearrange(d,null,this.containers[g].element,true);this._trigger("change",d,this._uiHash());this.containers[g]._trigger("change",d,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[g]._trigger("over",d,this._uiHash(this));this.containers[g].containerCache.over=1}}},_createHelper:function(d){var e=this.options;d=b.isFunction(e.helper)?b(e.helper.apply(this.element[0],[d,this.currentItem])):
+e.helper=="clone"?this.currentItem.clone():this.currentItem;d.parents("body").length||b(e.appendTo!="parent"?e.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]);if(d[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(d[0].style.width==""||e.forceHelperSize)d.width(this.currentItem.width());if(d[0].style.height==
+""||e.forceHelperSize)d.height(this.currentItem.height());return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(b.isArray(d))d={left:+d[0],top:+d[1]||0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=
+this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)d={top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),
+10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.currentItem.position();return{top:d.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions=
+{width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,b(d.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b(d.containment=="document"?document:window).height()||
+document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)){var e=b(d.containment)[0];d=b(d.containment).offset();var g=b(e).css("overflow")!="hidden";this.containment=[d.left+(parseInt(b(e).css("borderLeftWidth"),10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0)-this.margins.top,d.left+(g?Math.max(e.scrollWidth,
+e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(g?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(d,e){if(!e)e=this.position;d=d=="absolute"?1:-1;var g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=
+document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);return{top:e.top+this.offset.relative.top*d+this.offset.parent.top*d-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop())*d),left:e.left+this.offset.relative.left*d+this.offset.parent.left*d-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
+f?0:g.scrollLeft())*d)}},_generatePosition:function(d){var e=this.options,g=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(g[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var a=d.pageX,c=d.pageY;if(this.originalPosition){if(this.containment){if(d.pageX-
+this.offset.click.left<this.containment[0])a=this.containment[0]+this.offset.click.left;if(d.pageY-this.offset.click.top<this.containment[1])c=this.containment[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>this.containment[2])a=this.containment[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>this.containment[3])c=this.containment[3]+this.offset.click.top}if(e.grid){c=this.originalPageY+Math.round((c-this.originalPageY)/e.grid[1])*e.grid[1];c=this.containment?!(c-this.offset.click.top<
+this.containment[1]||c-this.offset.click.top>this.containment[3])?c:!(c-this.offset.click.top<this.containment[1])?c-e.grid[1]:c+e.grid[1]:c;a=this.originalPageX+Math.round((a-this.originalPageX)/e.grid[0])*e.grid[0];a=this.containment?!(a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2])?a:!(a-this.offset.click.left<this.containment[0])?a-e.grid[0]:a+e.grid[0]:a}}return{top:c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(b.browser.safari&&
+this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:g.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(b.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:g.scrollLeft())}},_rearrange:function(d,e,g,f){g?g[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?e.item[0]:e.item[0].nextSibling);this.counter=
+this.counter?++this.counter:1;var a=this,c=this.counter;window.setTimeout(function(){c==a.counter&&a.refreshPositions(!f)},0)},_clear:function(d,e){this.reverting=false;var g=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var f in this._storedCSS)if(this._storedCSS[f]=="auto"||this._storedCSS[f]=="static")this._storedCSS[f]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();
+this.fromOutside&&!e&&g.push(function(a){this._trigger("receive",a,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!e)g.push(function(a){this._trigger("update",a,this._uiHash())});if(!b.ui.contains(this.element[0],this.currentItem[0])){e||g.push(function(a){this._trigger("remove",a,this._uiHash())});for(f=this.containers.length-1;f>=0;f--)if(b.ui.contains(this.containers[f].element[0],
+this.currentItem[0])&&!e){g.push(function(a){return function(c){a._trigger("receive",c,this._uiHash(this))}}.call(this,this.containers[f]));g.push(function(a){return function(c){a._trigger("update",c,this._uiHash(this))}}.call(this,this.containers[f]))}}for(f=this.containers.length-1;f>=0;f--){e||g.push(function(a){return function(c){a._trigger("deactivate",c,this._uiHash(this))}}.call(this,this.containers[f]));if(this.containers[f].containerCache.over){g.push(function(a){return function(c){a._trigger("out",
+c,this._uiHash(this))}}.call(this,this.containers[f]));this.containers[f].containerCache.over=0}}this._storedCursor&&b("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(!e){this._trigger("beforeStop",d,this._uiHash());for(f=0;f<g.length;f++)g[f].call(this,d);this._trigger("stop",d,this._uiHash())}return false}e||
+this._trigger("beforeStop",d,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!e){for(f=0;f<g.length;f++)g[f].call(this,d);this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){b.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(d){var e=d||this;return{helper:e.helper,placeholder:e.placeholder||b([]),position:e.position,
+originalPosition:e.originalPosition,offset:e.positionAbs,item:e.currentItem,sender:d?d.element:null}}});b.extend(b.ui.sortable,{version:"1.8.11"})})(jQuery);
+jQuery.effects||function(b,d){function e(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(/rgba\(0, 0, 0, 0\)/.exec(l))return j.transparent;return j[b.trim(l).toLowerCase()]}function g(l,k){var m;do{m=b.curCSS(l,k);if(m!=""&&m!="transparent"||b.nodeName(l,"body"))break;k="backgroundColor"}while(l=l.parentNode);return e(m)}function f(){var l=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+k={},m,o;if(l&&l.length&&l[0]&&l[l[0]])for(var q=l.length;q--;){m=l[q];if(typeof l[m]=="string"){o=m.replace(/\-(\w)/g,function(s,r){return r.toUpperCase()});k[o]=l[m]}}else for(m in l)if(typeof l[m]==="string")k[m]=l[m];return k}function a(l){var k,m;for(k in l){m=l[k];if(m==null||b.isFunction(m)||k in p||/scrollbar/.test(k)||!/color/i.test(k)&&isNaN(parseFloat(m)))delete l[k]}return l}function c(l,k){var m={_:0},o;for(o in k)if(l[o]!=k[o])m[o]=k[o];return m}function h(l,k,m,o){if(typeof l=="object"){o=
+k;m=null;k=l;l=k.effect}if(b.isFunction(k)){o=k;m=null;k={}}if(typeof k=="number"||b.fx.speeds[k]){o=m;m=k;k={}}if(b.isFunction(m)){o=m;m=null}k=k||{};m=m||k.duration;m=b.fx.off?0:typeof m=="number"?m:m in b.fx.speeds?b.fx.speeds[m]:b.fx.speeds._default;o=o||k.complete;return[l,k,m,o]}function i(l){if(!l||typeof l==="number"||b.fx.speeds[l])return true;if(typeof l==="string"&&!b.effects[l])return true;return false}b.effects={};b.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(l,k){b.fx.step[k]=function(m){if(!m.colorInit){m.start=g(m.elem,k);m.end=e(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)+")"}});var j={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]},n=["add","remove","toggle"],p={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};b.effects.animateClass=function(l,k,m,
+o){if(b.isFunction(m)){o=m;m=null}return this.queue("fx",function(){var q=b(this),s=q.attr("style")||" ",r=a(f.call(this)),u,v=q.attr("className");b.each(n,function(w,y){l[y]&&q[y+"Class"](l[y])});u=a(f.call(this));q.attr("className",v);q.animate(c(r,u),k,m,function(){b.each(n,function(w,y){l[y]&&q[y+"Class"](l[y])});if(typeof q.attr("style")=="object"){q.attr("style").cssText="";q.attr("style").cssText=s}else q.attr("style",s);o&&o.apply(this,arguments)});r=b.queue(this);u=r.splice(r.length-1,1)[0];
+r.splice(1,0,u);b.dequeue(this)})};b.fn.extend({_addClass:b.fn.addClass,addClass:function(l,k,m,o){return k?b.effects.animateClass.apply(this,[{add:l},k,m,o]):this._addClass(l)},_removeClass:b.fn.removeClass,removeClass:function(l,k,m,o){return k?b.effects.animateClass.apply(this,[{remove:l},k,m,o]):this._removeClass(l)},_toggleClass:b.fn.toggleClass,toggleClass:function(l,k,m,o,q){return typeof k=="boolean"||k===d?m?b.effects.animateClass.apply(this,[k?{add:l}:{remove:l},m,o,q]):this._toggleClass(l,
+k):b.effects.animateClass.apply(this,[{toggle:l},k,m,o])},switchClass:function(l,k,m,o,q){return b.effects.animateClass.apply(this,[{add:k,remove:l},m,o,q])}});b.extend(b.effects,{version:"1.8.11",save:function(l,k){for(var m=0;m<k.length;m++)k[m]!==null&&l.data("ec.storage."+k[m],l[0].style[k[m]])},restore:function(l,k){for(var m=0;m<k.length;m++)k[m]!==null&&l.css(k[m],l.data("ec.storage."+k[m]))},setMode:function(l,k){if(k=="toggle")k=l.is(":hidden")?"show":"hide";return k},getBaseline:function(l,
+k){var m;switch(l[0]){case "top":m=0;break;case "middle":m=0.5;break;case "bottom":m=1;break;default:m=l[0]/k.height}switch(l[1]){case "left":l=0;break;case "center":l=0.5;break;case "right":l=1;break;default:l=l[1]/k.width}return{x:l,y:m}},createWrapper:function(l){if(l.parent().is(".ui-effects-wrapper"))return l.parent();var k={width:l.outerWidth(true),height:l.outerHeight(true),"float":l.css("float")},m=b("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",
+border:"none",margin:0,padding:0});l.wrap(m);m=l.parent();if(l.css("position")=="static"){m.css({position:"relative"});l.css({position:"relative"})}else{b.extend(k,{position:l.css("position"),zIndex:l.css("z-index")});b.each(["top","left","bottom","right"],function(o,q){k[q]=l.css(q);if(isNaN(parseInt(k[q],10)))k[q]="auto"});l.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return m.css(k).show()},removeWrapper:function(l){if(l.parent().is(".ui-effects-wrapper"))return l.parent().replaceWith(l);
+return l},setTransition:function(l,k,m,o){o=o||{};b.each(k,function(q,s){unit=l.cssUnit(s);if(unit[0]>0)o[s]=unit[0]*m+unit[1]});return o}});b.fn.extend({effect:function(l){var k=h.apply(this,arguments),m={options:k[1],duration:k[2],callback:k[3]};k=m.options.mode;var o=b.effects[l];if(b.fx.off||!o)return k?this[k](m.duration,m.callback):this.each(function(){m.callback&&m.callback.call(this)});return o.call(this,m)},_show:b.fn.show,show:function(l){if(i(l))return this._show.apply(this,arguments);
+else{var k=h.apply(this,arguments);k[1].mode="show";return this.effect.apply(this,k)}},_hide:b.fn.hide,hide:function(l){if(i(l))return this._hide.apply(this,arguments);else{var k=h.apply(this,arguments);k[1].mode="hide";return this.effect.apply(this,k)}},__toggle:b.fn.toggle,toggle:function(l){if(i(l)||typeof l==="boolean"||b.isFunction(l))return this.__toggle.apply(this,arguments);else{var k=h.apply(this,arguments);k[1].mode="toggle";return this.effect.apply(this,k)}},cssUnit:function(l){var k=this.css(l),
+m=[];b.each(["em","px","%","pt"],function(o,q){if(k.indexOf(q)>0)m=[parseFloat(k),q]});return m}});b.easing.jswing=b.easing.swing;b.extend(b.easing,{def:"easeOutQuad",swing:function(l,k,m,o,q){return b.easing[b.easing.def](l,k,m,o,q)},easeInQuad:function(l,k,m,o,q){return o*(k/=q)*k+m},easeOutQuad:function(l,k,m,o,q){return-o*(k/=q)*(k-2)+m},easeInOutQuad:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k+m;return-o/2*(--k*(k-2)-1)+m},easeInCubic:function(l,k,m,o,q){return o*(k/=q)*k*k+m},easeOutCubic:function(l,
+k,m,o,q){return o*((k=k/q-1)*k*k+1)+m},easeInOutCubic:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k+m;return o/2*((k-=2)*k*k+2)+m},easeInQuart:function(l,k,m,o,q){return o*(k/=q)*k*k*k+m},easeOutQuart:function(l,k,m,o,q){return-o*((k=k/q-1)*k*k*k-1)+m},easeInOutQuart:function(l,k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k*k+m;return-o/2*((k-=2)*k*k*k-2)+m},easeInQuint:function(l,k,m,o,q){return o*(k/=q)*k*k*k*k+m},easeOutQuint:function(l,k,m,o,q){return o*((k=k/q-1)*k*k*k*k+1)+m},easeInOutQuint:function(l,
+k,m,o,q){if((k/=q/2)<1)return o/2*k*k*k*k*k+m;return o/2*((k-=2)*k*k*k*k+2)+m},easeInSine:function(l,k,m,o,q){return-o*Math.cos(k/q*(Math.PI/2))+o+m},easeOutSine:function(l,k,m,o,q){return o*Math.sin(k/q*(Math.PI/2))+m},easeInOutSine:function(l,k,m,o,q){return-o/2*(Math.cos(Math.PI*k/q)-1)+m},easeInExpo:function(l,k,m,o,q){return k==0?m:o*Math.pow(2,10*(k/q-1))+m},easeOutExpo:function(l,k,m,o,q){return k==q?m+o:o*(-Math.pow(2,-10*k/q)+1)+m},easeInOutExpo:function(l,k,m,o,q){if(k==0)return m;if(k==
+q)return m+o;if((k/=q/2)<1)return o/2*Math.pow(2,10*(k-1))+m;return o/2*(-Math.pow(2,-10*--k)+2)+m},easeInCirc:function(l,k,m,o,q){return-o*(Math.sqrt(1-(k/=q)*k)-1)+m},easeOutCirc:function(l,k,m,o,q){return o*Math.sqrt(1-(k=k/q-1)*k)+m},easeInOutCirc:function(l,k,m,o,q){if((k/=q/2)<1)return-o/2*(Math.sqrt(1-k*k)-1)+m;return o/2*(Math.sqrt(1-(k-=2)*k)+1)+m},easeInElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q)==1)return m+o;s||(s=q*0.3);if(r<Math.abs(o)){r=o;l=s/4}else l=
+s/(2*Math.PI)*Math.asin(o/r);return-(r*Math.pow(2,10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s))+m},easeOutElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q)==1)return m+o;s||(s=q*0.3);if(r<Math.abs(o)){r=o;l=s/4}else l=s/(2*Math.PI)*Math.asin(o/r);return r*Math.pow(2,-10*k)*Math.sin((k*q-l)*2*Math.PI/s)+o+m},easeInOutElastic:function(l,k,m,o,q){l=1.70158;var s=0,r=o;if(k==0)return m;if((k/=q/2)==2)return m+o;s||(s=q*0.3*1.5);if(r<Math.abs(o)){r=o;l=s/4}else l=s/(2*Math.PI)*Math.asin(o/
+r);if(k<1)return-0.5*r*Math.pow(2,10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s)+m;return r*Math.pow(2,-10*(k-=1))*Math.sin((k*q-l)*2*Math.PI/s)*0.5+o+m},easeInBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;return o*(k/=q)*k*((s+1)*k-s)+m},easeOutBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;return o*((k=k/q-1)*k*((s+1)*k+s)+1)+m},easeInOutBack:function(l,k,m,o,q,s){if(s==d)s=1.70158;if((k/=q/2)<1)return o/2*k*k*(((s*=1.525)+1)*k-s)+m;return o/2*((k-=2)*k*(((s*=1.525)+1)*k+s)+2)+m},easeInBounce:function(l,
+k,m,o,q){return o-b.easing.easeOutBounce(l,q-k,0,o,q)+m},easeOutBounce:function(l,k,m,o,q){return(k/=q)<1/2.75?o*7.5625*k*k+m:k<2/2.75?o*(7.5625*(k-=1.5/2.75)*k+0.75)+m:k<2.5/2.75?o*(7.5625*(k-=2.25/2.75)*k+0.9375)+m:o*(7.5625*(k-=2.625/2.75)*k+0.984375)+m},easeInOutBounce:function(l,k,m,o,q){if(k<q/2)return b.easing.easeInBounce(l,k*2,0,o,q)*0.5+m;return b.easing.easeOutBounce(l,k*2-q,0,o,q)*0.5+o*0.5+m}})}(jQuery);
+(function(b){b.effects.blind=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"vertical";b.effects.save(e,g);e.show();var c=b.effects.createWrapper(e).css({overflow:"hidden"}),h=a=="vertical"?"height":"width";a=a=="vertical"?c.height():c.width();f=="show"&&c.css(h,0);var i={};i[h]=f=="show"?a:0;c.animate(i,d.duration,d.options.easing,function(){f=="hide"&&e.hide();b.effects.restore(e,
+g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()})})}})(jQuery);
+(function(b){b.effects.bounce=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"effect"),a=d.options.direction||"up",c=d.options.distance||20,h=d.options.times||5,i=d.duration||250;/show|hide/.test(f)&&g.push("opacity");b.effects.save(e,g);e.show();b.effects.createWrapper(e);var j=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";c=d.options.distance||(j=="top"?e.outerHeight({margin:true})/3:e.outerWidth({margin:true})/
+3);if(f=="show")e.css("opacity",0).css(j,a=="pos"?-c:c);if(f=="hide")c/=h*2;f!="hide"&&h--;if(f=="show"){var n={opacity:1};n[j]=(a=="pos"?"+=":"-=")+c;e.animate(n,i/2,d.options.easing);c/=2;h--}for(n=0;n<h;n++){var p={},l={};p[j]=(a=="pos"?"-=":"+=")+c;l[j]=(a=="pos"?"+=":"-=")+c;e.animate(p,i/2,d.options.easing).animate(l,i/2,d.options.easing);c=f=="hide"?c*2:c/2}if(f=="hide"){n={opacity:0};n[j]=(a=="pos"?"-=":"+=")+c;e.animate(n,i/2,d.options.easing,function(){e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);
+d.callback&&d.callback.apply(this,arguments)})}else{p={};l={};p[j]=(a=="pos"?"-=":"+=")+c;l[j]=(a=="pos"?"+=":"-=")+c;e.animate(p,i/2,d.options.easing).animate(l,i/2,d.options.easing,function(){b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments)})}e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);
+(function(b){b.effects.clip=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"vertical";b.effects.save(e,g);e.show();var c=b.effects.createWrapper(e).css({overflow:"hidden"});c=e[0].tagName=="IMG"?c:e;var h={size:a=="vertical"?"height":"width",position:a=="vertical"?"top":"left"};a=a=="vertical"?c.height():c.width();if(f=="show"){c.css(h.size,0);c.css(h.position,
+a/2)}var i={};i[h.size]=f=="show"?a:0;i[h.position]=f=="show"?0:a/2;c.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.drop=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","opacity"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.direction||"left";b.effects.save(e,g);e.show();b.effects.createWrapper(e);var c=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";var h=d.options.distance||(c=="top"?e.outerHeight({margin:true})/2:e.outerWidth({margin:true})/2);if(f=="show")e.css("opacity",0).css(c,a=="pos"?-h:h);var i={opacity:f==
+"show"?1:0};i[c]=(f=="show"?a=="pos"?"+=":"-=":a=="pos"?"-=":"+=")+h;e.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.explode=function(d){return this.queue(function(){var e=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3,g=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3;d.options.mode=d.options.mode=="toggle"?b(this).is(":visible")?"hide":"show":d.options.mode;var f=b(this).show().css("visibility","hidden"),a=f.offset();a.top-=parseInt(f.css("marginTop"),10)||0;a.left-=parseInt(f.css("marginLeft"),10)||0;for(var c=f.outerWidth(true),h=f.outerHeight(true),i=0;i<e;i++)for(var j=
+0;j<g;j++)f.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(c/g),top:-i*(h/e)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:c/g,height:h/e,left:a.left+j*(c/g)+(d.options.mode=="show"?(j-Math.floor(g/2))*(c/g):0),top:a.top+i*(h/e)+(d.options.mode=="show"?(i-Math.floor(e/2))*(h/e):0),opacity:d.options.mode=="show"?0:1}).animate({left:a.left+j*(c/g)+(d.options.mode=="show"?0:(j-Math.floor(g/2))*(c/g)),top:a.top+
+i*(h/e)+(d.options.mode=="show"?0:(i-Math.floor(e/2))*(h/e)),opacity:d.options.mode=="show"?1:0},d.duration||500);setTimeout(function(){d.options.mode=="show"?f.css({visibility:"visible"}):f.css({visibility:"visible"}).hide();d.callback&&d.callback.apply(f[0]);f.dequeue();b("div.ui-effects-explode").remove()},d.duration||500)})}})(jQuery);
+(function(b){b.effects.fade=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"hide");e.animate({opacity:g},{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.fold=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"hide"),a=d.options.size||15,c=!!d.options.horizFirst,h=d.duration?d.duration/2:b.fx.speeds._default/2;b.effects.save(e,g);e.show();var i=b.effects.createWrapper(e).css({overflow:"hidden"}),j=f=="show"!=c,n=j?["width","height"]:["height","width"];j=j?[i.width(),i.height()]:[i.height(),i.width()];var p=/([0-9]+)%/.exec(a);if(p)a=parseInt(p[1],
+10)/100*j[f=="hide"?0:1];if(f=="show")i.css(c?{height:0,width:a}:{height:a,width:0});c={};p={};c[n[0]]=f=="show"?j[0]:a;p[n[1]]=f=="show"?j[1]:0;i.animate(c,h,d.options.easing).animate(p,h,d.options.easing,function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(e[0],arguments);e.dequeue()})})}})(jQuery);
+(function(b){b.effects.highlight=function(d){return this.queue(function(){var e=b(this),g=["backgroundImage","backgroundColor","opacity"],f=b.effects.setMode(e,d.options.mode||"show"),a={backgroundColor:e.css("backgroundColor")};if(f=="hide")a.opacity=0;b.effects.save(e,g);e.show().css({backgroundImage:"none",backgroundColor:d.options.color||"#ffff99"}).animate(a,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);f=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.pulsate=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"show");times=(d.options.times||5)*2-1;duration=d.duration?d.duration/2:b.fx.speeds._default/2;isVisible=e.is(":visible");animateTo=0;if(!isVisible){e.css("opacity",0).show();animateTo=1}if(g=="hide"&&isVisible||g=="show"&&!isVisible)times--;for(g=0;g<times;g++){e.animate({opacity:animateTo},duration,d.options.easing);animateTo=(animateTo+1)%2}e.animate({opacity:animateTo},duration,
+d.options.easing,function(){animateTo==0&&e.hide();d.callback&&d.callback.apply(this,arguments)});e.queue("fx",function(){e.dequeue()}).dequeue()})}})(jQuery);
+(function(b){b.effects.puff=function(d){return this.queue(function(){var e=b(this),g=b.effects.setMode(e,d.options.mode||"hide"),f=parseInt(d.options.percent,10)||150,a=f/100,c={height:e.height(),width:e.width()};b.extend(d.options,{fade:true,mode:g,percent:g=="hide"?f:100,from:g=="hide"?c:{height:c.height*a,width:c.width*a}});e.effect("scale",d.options,d.duration,d.callback);e.dequeue()})};b.effects.scale=function(d){return this.queue(function(){var e=b(this),g=b.extend(true,{},d.options),f=b.effects.setMode(e,
+d.options.mode||"effect"),a=parseInt(d.options.percent,10)||(parseInt(d.options.percent,10)==0?0:f=="hide"?0:100),c=d.options.direction||"both",h=d.options.origin;if(f!="effect"){g.origin=h||["middle","center"];g.restore=true}h={height:e.height(),width:e.width()};e.from=d.options.from||(f=="show"?{height:0,width:0}:h);a={y:c!="horizontal"?a/100:1,x:c!="vertical"?a/100:1};e.to={height:h.height*a.y,width:h.width*a.x};if(d.options.fade){if(f=="show"){e.from.opacity=0;e.to.opacity=1}if(f=="hide"){e.from.opacity=
+1;e.to.opacity=0}}g.from=e.from;g.to=e.to;g.mode=f;e.effect("size",g,d.duration,d.callback);e.dequeue()})};b.effects.size=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right","width","height","overflow","opacity"],f=["position","top","bottom","left","right","overflow","opacity"],a=["width","height","overflow"],c=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],i=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+j=b.effects.setMode(e,d.options.mode||"effect"),n=d.options.restore||false,p=d.options.scale||"both",l=d.options.origin,k={height:e.height(),width:e.width()};e.from=d.options.from||k;e.to=d.options.to||k;if(l){l=b.effects.getBaseline(l,k);e.from.top=(k.height-e.from.height)*l.y;e.from.left=(k.width-e.from.width)*l.x;e.to.top=(k.height-e.to.height)*l.y;e.to.left=(k.width-e.to.width)*l.x}var m={from:{y:e.from.height/k.height,x:e.from.width/k.width},to:{y:e.to.height/k.height,x:e.to.width/k.width}};
+if(p=="box"||p=="both"){if(m.from.y!=m.to.y){g=g.concat(h);e.from=b.effects.setTransition(e,h,m.from.y,e.from);e.to=b.effects.setTransition(e,h,m.to.y,e.to)}if(m.from.x!=m.to.x){g=g.concat(i);e.from=b.effects.setTransition(e,i,m.from.x,e.from);e.to=b.effects.setTransition(e,i,m.to.x,e.to)}}if(p=="content"||p=="both")if(m.from.y!=m.to.y){g=g.concat(c);e.from=b.effects.setTransition(e,c,m.from.y,e.from);e.to=b.effects.setTransition(e,c,m.to.y,e.to)}b.effects.save(e,n?g:f);e.show();b.effects.createWrapper(e);
+e.css("overflow","hidden").css(e.from);if(p=="content"||p=="both"){h=h.concat(["marginTop","marginBottom"]).concat(c);i=i.concat(["marginLeft","marginRight"]);a=g.concat(h).concat(i);e.find("*[width]").each(function(){child=b(this);n&&b.effects.save(child,a);var o={height:child.height(),width:child.width()};child.from={height:o.height*m.from.y,width:o.width*m.from.x};child.to={height:o.height*m.to.y,width:o.width*m.to.x};if(m.from.y!=m.to.y){child.from=b.effects.setTransition(child,h,m.from.y,child.from);
+child.to=b.effects.setTransition(child,h,m.to.y,child.to)}if(m.from.x!=m.to.x){child.from=b.effects.setTransition(child,i,m.from.x,child.from);child.to=b.effects.setTransition(child,i,m.to.x,child.to)}child.css(child.from);child.animate(child.to,d.duration,d.options.easing,function(){n&&b.effects.restore(child,a)})})}e.animate(e.to,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e.to.opacity===0&&e.css("opacity",e.from.opacity);j=="hide"&&e.hide();b.effects.restore(e,
+n?g:f);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.shake=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"];b.effects.setMode(e,d.options.mode||"effect");var f=d.options.direction||"left",a=d.options.distance||20,c=d.options.times||3,h=d.duration||d.options.duration||140;b.effects.save(e,g);e.show();b.effects.createWrapper(e);var i=f=="up"||f=="down"?"top":"left",j=f=="up"||f=="left"?"pos":"neg";f={};var n={},p={};f[i]=(j=="pos"?"-=":"+=")+a;n[i]=(j=="pos"?"+=":"-=")+a*2;p[i]=
+(j=="pos"?"-=":"+=")+a*2;e.animate(f,h,d.options.easing);for(a=1;a<c;a++)e.animate(n,h,d.options.easing).animate(p,h,d.options.easing);e.animate(n,h,d.options.easing).animate(f,h/2,d.options.easing,function(){b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments)});e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);
+(function(b){b.effects.slide=function(d){return this.queue(function(){var e=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(e,d.options.mode||"show"),a=d.options.direction||"left";b.effects.save(e,g);e.show();b.effects.createWrapper(e).css({overflow:"hidden"});var c=a=="up"||a=="down"?"top":"left";a=a=="up"||a=="left"?"pos":"neg";var h=d.options.distance||(c=="top"?e.outerHeight({margin:true}):e.outerWidth({margin:true}));if(f=="show")e.css(c,a=="pos"?isNaN(h)?"-"+h:-h:h);
+var i={};i[c]=(f=="show"?a=="pos"?"+=":"-=":a=="pos"?"-=":"+=")+h;e.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&e.hide();b.effects.restore(e,g);b.effects.removeWrapper(e);d.callback&&d.callback.apply(this,arguments);e.dequeue()}})})}})(jQuery);
+(function(b){b.effects.transfer=function(d){return this.queue(function(){var e=b(this),g=b(d.options.to),f=g.offset();g={top:f.top,left:f.left,height:g.innerHeight(),width:g.innerWidth()};f=e.offset();var a=b('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(d.options.className).css({top:f.top,left:f.left,height:e.innerHeight(),width:e.innerWidth(),position:"absolute"}).animate(g,d.duration,d.options.easing,function(){a.remove();d.callback&&d.callback.apply(e[0],arguments);
+e.dequeue()})})}})(jQuery);
+(function(b){b.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> 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,e=d.options;d.running=0;d.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");d.headers=
+d.element.find(e.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){e.disabled||b(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){e.disabled||b(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){e.disabled||b(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){e.disabled||b(this).removeClass("ui-state-focus")});d.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(e.navigation){var g=d.element.find("a").filter(e.navigationFilter).eq(0);if(g.length){var f=g.closest(".ui-accordion-header");d.active=f.length?f:g.closest(".ui-accordion-content").prev()}}d.active=d._findActive(d.active||e.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");d.active.next().addClass("ui-accordion-content-active");d._createIcons();d.resize();d.element.attr("role","tablist");d.headers.attr("role","tab").bind("keydown.accordion",
+function(a){return d._keydown(a)}).next().attr("role","tabpanel");d.headers.not(d.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();d.active.length?d.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):d.headers.eq(0).attr("tabIndex",0);b.browser.safari||d.headers.find("a").attr("tabIndex",-1);e.event&&d.headers.bind(e.event.split(" ").join(".accordion ")+".accordion",function(a){d._clickHandler.call(d,a,this);a.preventDefault()})},_createIcons:function(){var d=
+this.options;if(d.icons){b("<span></span>").addClass("ui-icon "+d.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(d.icons.header).toggleClass(d.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 d=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 e=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(d.autoHeight||d.fillHeight)e.css("height","");return b.Widget.prototype.destroy.call(this)},_setOption:function(d,e){b.Widget.prototype._setOption.apply(this,arguments);d=="active"&&this.activate(e);if(d=="icons"){this._destroyIcons();
+e&&this._createIcons()}if(d=="disabled")this.headers.add(this.headers.next())[e?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(d){if(!(this.options.disabled||d.altKey||d.ctrlKey)){var e=b.ui.keyCode,g=this.headers.length,f=this.headers.index(d.target),a=false;switch(d.keyCode){case e.RIGHT:case e.DOWN:a=this.headers[(f+1)%g];break;case e.LEFT:case e.UP:a=this.headers[(f-1+g)%g];break;case e.SPACE:case e.ENTER:this._clickHandler({target:d.target},d.target);
+d.preventDefault()}if(a){b(d.target).attr("tabIndex",-1);b(a).attr("tabIndex",0);a.focus();return false}return true}},resize:function(){var d=this.options,e;if(d.fillSpace){if(b.browser.msie){var g=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}e=this.element.parent().height();b.browser.msie&&this.element.parent().css("overflow",g);this.headers.each(function(){e-=b(this).outerHeight(true)});this.headers.next().each(function(){b(this).height(Math.max(0,e-b(this).innerHeight()+
+b(this).height()))}).css("overflow","auto")}else if(d.autoHeight){e=0;this.headers.next().each(function(){e=Math.max(e,b(this).height("").height())}).height(e)}return this},activate:function(d){this.options.active=d;d=this._findActive(d)[0];this._clickHandler({target:d},d);return this},_findActive:function(d){return d?typeof d==="number"?this.headers.filter(":eq("+d+")"):this.headers.not(this.headers.not(d)):d===false?b([]):this.headers.filter(":eq(0)")},_clickHandler:function(d,e){var g=this.options;
+if(!g.disabled)if(d.target){d=b(d.currentTarget||e);e=d[0]===this.active[0];g.active=g.collapsible&&e?false:this.headers.index(d);if(!(this.running||!g.collapsible&&e)){var f=this.active;i=d.next();c=this.active.next();h={options:g,newHeader:e&&g.collapsible?b([]):d,oldHeader:this.active,newContent:e&&g.collapsible?b([]):i,oldContent:c};var a=this.headers.index(this.active[0])>this.headers.index(d[0]);this.active=e?b([]):d;this._toggle(i,c,h,e,a);f.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(g.icons.headerSelected).addClass(g.icons.header);
+if(!e){d.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(g.icons.header).addClass(g.icons.headerSelected);d.next().addClass("ui-accordion-content-active")}}}else if(g.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(g.icons.headerSelected).addClass(g.icons.header);this.active.next().addClass("ui-accordion-content-active");var c=this.active.next(),
+h={options:g,newHeader:b([]),oldHeader:g.active,newContent:b([]),oldContent:c},i=this.active=b([]);this._toggle(i,c,h)}},_toggle:function(d,e,g,f,a){var c=this,h=c.options;c.toShow=d;c.toHide=e;c.data=g;var i=function(){if(c)return c._completed.apply(c,arguments)};c._trigger("changestart",null,c.data);c.running=e.size()===0?d.size():e.size();if(h.animated){g={};g=h.collapsible&&f?{toShow:b([]),toHide:e,complete:i,down:a,autoHeight:h.autoHeight||h.fillSpace}:{toShow:d,toHide:e,complete:i,down:a,autoHeight:h.autoHeight||
+h.fillSpace};if(!h.proxied)h.proxied=h.animated;if(!h.proxiedDuration)h.proxiedDuration=h.duration;h.animated=b.isFunction(h.proxied)?h.proxied(g):h.proxied;h.duration=b.isFunction(h.proxiedDuration)?h.proxiedDuration(g):h.proxiedDuration;f=b.ui.accordion.animations;var j=h.duration,n=h.animated;if(n&&!f[n]&&!b.easing[n])n="slide";f[n]||(f[n]=function(p){this.slide(p,{easing:n,duration:j||700})});f[n](g)}else{if(h.collapsible&&f)d.toggle();else{e.hide();d.show()}i(true)}e.prev().attr({"aria-expanded":"false",
+"aria-selected":"false",tabIndex:-1}).blur();d.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(d){this.running=d?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)}}});b.extend(b.ui.accordion,{version:"1.8.11",
+animations:{slide:function(d,e){d=b.extend({easing:"swing",duration:300},d,e);if(d.toHide.size())if(d.toShow.size()){var g=d.toShow.css("overflow"),f=0,a={},c={},h;e=d.toShow;h=e[0].style.width;e.width(parseInt(e.parent().width(),10)-parseInt(e.css("paddingLeft"),10)-parseInt(e.css("paddingRight"),10)-(parseInt(e.css("borderLeftWidth"),10)||0)-(parseInt(e.css("borderRightWidth"),10)||0));b.each(["height","paddingTop","paddingBottom"],function(i,j){c[j]="hide";i=(""+b.css(d.toShow[0],j)).match(/^([\d+-.]+)(.*)$/);
+a[j]={value:i[1],unit:i[2]||"px"}});d.toShow.css({height:0,overflow:"hidden"}).show();d.toHide.filter(":hidden").each(d.complete).end().filter(":visible").animate(c,{step:function(i,j){if(j.prop=="height")f=j.end-j.start===0?0:(j.now-j.start)/(j.end-j.start);d.toShow[0].style[j.prop]=f*a[j.prop].value+a[j.prop].unit},duration:d.duration,easing:d.easing,complete:function(){d.autoHeight||d.toShow.css("height","");d.toShow.css({width:h,overflow:g});d.complete()}})}else d.toHide.animate({height:"hide",
+paddingTop:"hide",paddingBottom:"hide"},d);else d.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},d)},bounceslide:function(d){this.slide(d,{easing:d.down?"easeOutBounce":"swing",duration:d.down?1E3:200})}}})})(jQuery);
+(function(b){var d=0;b.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 e=this,g=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(a){if(!(e.options.disabled||e.element.attr("readonly"))){f=
+false;var c=b.ui.keyCode;switch(a.keyCode){case c.PAGE_UP:e._move("previousPage",a);break;case c.PAGE_DOWN:e._move("nextPage",a);break;case c.UP:e._move("previous",a);a.preventDefault();break;case c.DOWN:e._move("next",a);a.preventDefault();break;case c.ENTER:case c.NUMPAD_ENTER:if(e.menu.active){f=true;a.preventDefault()}case c.TAB:if(!e.menu.active)return;e.menu.select(a);break;case c.ESCAPE:e.element.val(e.term);e.close(a);break;default:clearTimeout(e.searching);e.searching=setTimeout(function(){if(e.term!=
+e.element.val()){e.selectedItem=null;e.search(null,a)}},e.options.delay);break}}}).bind("keypress.autocomplete",function(a){if(f){f=false;a.preventDefault()}}).bind("focus.autocomplete",function(){if(!e.options.disabled){e.selectedItem=null;e.previous=e.element.val()}}).bind("blur.autocomplete",function(a){if(!e.options.disabled){clearTimeout(e.searching);e.closing=setTimeout(function(){e.close(a);e._change(a)},150)}});this._initSource();this.response=function(){return e._response.apply(e,arguments)};
+this.menu=b("<ul></ul>").addClass("ui-autocomplete").appendTo(b(this.options.appendTo||"body",g)[0]).mousedown(function(a){var c=e.menu.element[0];b(a.target).closest(".ui-menu-item").length||setTimeout(function(){b(document).one("mousedown",function(h){h.target!==e.element[0]&&h.target!==c&&!b.ui.contains(c,h.target)&&e.close()})},1);setTimeout(function(){clearTimeout(e.closing)},13)}).menu({focus:function(a,c){c=c.item.data("item.autocomplete");false!==e._trigger("focus",a,{item:c})&&/^key/.test(a.originalEvent.type)&&
+e.element.val(c.value)},selected:function(a,c){var h=c.item.data("item.autocomplete"),i=e.previous;if(e.element[0]!==g.activeElement){e.element.focus();e.previous=i;setTimeout(function(){e.previous=i;e.selectedItem=h},1)}false!==e._trigger("select",a,{item:h})&&e.element.val(h.value);e.term=e.element.val();e.close(a);e.selectedItem=h},blur:function(){e.menu.element.is(":visible")&&e.element.val()!==e.term&&e.element.val(e.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");
+b.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();b.Widget.prototype.destroy.call(this)},_setOption:function(e,g){b.Widget.prototype._setOption.apply(this,arguments);e==="source"&&this._initSource();if(e==="appendTo")this.menu.element.appendTo(b(g||"body",this.element[0].ownerDocument)[0]);e==="disabled"&&
+g&&this.xhr&&this.xhr.abort()},_initSource:function(){var e=this,g,f;if(b.isArray(this.options.source)){g=this.options.source;this.source=function(a,c){c(b.ui.autocomplete.filter(g,a.term))}}else if(typeof this.options.source==="string"){f=this.options.source;this.source=function(a,c){e.xhr&&e.xhr.abort();e.xhr=b.ajax({url:f,data:a,dataType:"json",autocompleteRequest:++d,success:function(h){this.autocompleteRequest===d&&c(h)},error:function(){this.autocompleteRequest===d&&c([])}})}}else this.source=
+this.options.source},search:function(e,g){e=e!=null?e:this.element.val();this.term=this.element.val();if(e.length<this.options.minLength)return this.close(g);clearTimeout(this.closing);if(this._trigger("search",g)!==false)return this._search(e)},_search:function(e){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:e},this.response)},_response:function(e){if(!this.options.disabled&&e&&e.length){e=this._normalize(e);this._suggest(e);this._trigger("open")}else this.close();
+this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(e){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",e)}},_change:function(e){this.previous!==this.element.val()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(e){if(e.length&&e[0].label&&e[0].value)return e;return b.map(e,function(g){if(typeof g==="string")return{label:g,value:g};return b.extend({label:g.label||
+g.value,value:g.value||g.label},g)})},_suggest:function(e){var g=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(g,e);this.menu.deactivate();this.menu.refresh();g.show();this._resizeMenu();g.position(b.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new b.Event("mouseover"))},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(e,g){var f=this;
+b.each(g,function(a,c){f._renderItem(e,c)})},_renderItem:function(e,g){return b("<li></li>").data("item.autocomplete",g).append(b("<a></a>").text(g.label)).appendTo(e)},_move:function(e,g){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(e)||this.menu.last()&&/^next/.test(e)){this.element.val(this.term);this.menu.deactivate()}else this.menu[e](g);else this.search(null,g)},widget:function(){return this.menu.element}});b.extend(b.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
+"\\$&")},filter:function(e,g){var f=new RegExp(b.ui.autocomplete.escapeRegex(g),"i");return b.grep(e,function(a){return f.test(a.label||a.value||a)})}})})(jQuery);
+(function(b){b.widget("ui.menu",{_create:function(){var d=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(e){if(b(e.target).closest(".ui-menu-item a").length){e.preventDefault();d.select(e)}});this.refresh()},refresh:function(){var d=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(e){d.activate(e,b(this).parent())}).mouseleave(function(){d.deactivate()})},activate:function(d,e){this.deactivate();if(this.hasScroll()){var g=e.offset().top-this.element.offset().top,f=this.element.attr("scrollTop"),a=this.element.height();if(g<0)this.element.attr("scrollTop",f+g);else g>=a&&this.element.attr("scrollTop",f+g-a+e.height())}this.active=e.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",d,{item:e})},
+deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(d){this.move("next",".ui-menu-item:first",d)},previous:function(d){this.move("prev",".ui-menu-item:last",d)},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(d,e,g){if(this.active){d=this.active[d+"All"](".ui-menu-item").eq(0);
+d.length?this.activate(g,d):this.activate(g,this.element.children(e))}else this.activate(g,this.element.children(e))},nextPage:function(d){if(this.hasScroll())if(!this.active||this.last())this.activate(d,this.element.children(".ui-menu-item:first"));else{var e=this.active.offset().top,g=this.element.height(),f=this.element.children(".ui-menu-item").filter(function(){var a=b(this).offset().top-e-g+b(this).height();return a<10&&a>-10});f.length||(f=this.element.children(".ui-menu-item:last"));this.activate(d,
+f)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(d){if(this.hasScroll())if(!this.active||this.first())this.activate(d,this.element.children(".ui-menu-item:last"));else{var e=this.active.offset().top,g=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var f=b(this).offset().top-e+g-b(this).height();return f<10&&f>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
+this.activate(d,result)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(d){this._trigger("selected",d,{item:this.active})}})})(jQuery);
+(function(b){var d,e=function(f){b(":ui-button",f.target.form).each(function(){var a=b(this).data("button");setTimeout(function(){a.refresh()},1)})},g=function(f){var a=f.name,c=f.form,h=b([]);if(a)h=c?b(c).find("[name='"+a+"']"):b("[name='"+a+"']",f.ownerDocument).filter(function(){return!this.form});return h};b.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
+e);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var f=this,a=this.options,c=this.type==="checkbox"||this.type==="radio",h="ui-state-hover"+(!c?" ui-state-active":"");if(a.label===null)a.label=this.buttonElement.html();if(this.element.is(":disabled"))a.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
+function(){if(!a.disabled){b(this).addClass("ui-state-hover");this===d&&b(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){a.disabled||b(this).removeClass(h)}).bind("focus.button",function(){b(this).addClass("ui-state-focus")}).bind("blur.button",function(){b(this).removeClass("ui-state-focus")});c&&this.element.bind("change.button",function(){f.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(a.disabled)return false;b(this).toggleClass("ui-state-active");
+f.buttonElement.attr("aria-pressed",f.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(a.disabled)return false;b(this).addClass("ui-state-active");f.buttonElement.attr("aria-pressed",true);var i=f.element[0];g(i).not(i).map(function(){return b(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(a.disabled)return false;b(this).addClass("ui-state-active");
+d=this;b(document).one("mouseup",function(){d=null})}).bind("mouseup.button",function(){if(a.disabled)return false;b(this).removeClass("ui-state-active")}).bind("keydown.button",function(i){if(a.disabled)return false;if(i.keyCode==b.ui.keyCode.SPACE||i.keyCode==b.ui.keyCode.ENTER)b(this).addClass("ui-state-active")}).bind("keyup.button",function(){b(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(i){i.keyCode===b.ui.keyCode.SPACE&&b(this).click()})}this._setOption("disabled",
+a.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){var f=this.element.parents().filter(":last"),a="label[for="+this.element.attr("id")+"]";this.buttonElement=f.find(a);if(!this.buttonElement.length){f=f.length?f.siblings():this.element.siblings();this.buttonElement=f.filter(a);if(!this.buttonElement.length)this.buttonElement=f.find(a)}this.element.addClass("ui-helper-hidden-accessible");
+(f=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",f)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());
+this.hasTitle||this.buttonElement.removeAttr("title");b.Widget.prototype.destroy.call(this)},_setOption:function(f,a){b.Widget.prototype._setOption.apply(this,arguments);if(f==="disabled")a?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var f=this.element.is(":disabled");f!==this.options.disabled&&this._setOption("disabled",f);if(this.type==="radio")g(this.element[0]).each(function(){b(this).is(":checked")?b(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):b(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var f=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+a=b("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(f.empty()).text(),c=this.options.icons,h=c.primary&&c.secondary,i=[];if(c.primary||c.secondary){if(this.options.text)i.push("ui-button-text-icon"+(h?"s":c.primary?"-primary":"-secondary"));c.primary&&f.prepend("<span class='ui-button-icon-primary ui-icon "+c.primary+"'></span>");c.secondary&&f.append("<span class='ui-button-icon-secondary ui-icon "+c.secondary+"'></span>");if(!this.options.text){i.push(h?"ui-button-icons-only":
+"ui-button-icon-only");this.hasTitle||f.attr("title",a)}}else i.push("ui-button-text-only");f.addClass(i.join(" "))}}});b.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(f,a){f==="disabled"&&this.buttons.button("option",f,a);b.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 b(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 b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");b.Widget.prototype.destroy.call(this)}})})(jQuery);
+(function(b,d){function e(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};b.extend(this._defaults,this.regional[""]);this.dpDiv=b('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function g(a,c){b.extend(a,c);for(var h in c)if(c[h]==
+null||c[h]==d)a[h]=c[h];return a}b.extend(b.ui,{datepicker:{version:"1.8.11"}});var f=(new Date).getTime();b.extend(e.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){g(this._defaults,a||{});return this},_attachDatepicker:function(a,c){var h=null;for(var i in this._defaults){var j=a.getAttribute("date:"+i);if(j){h=h||{};try{h[i]=eval(j)}catch(n){h[i]=j}}}i=a.nodeName.toLowerCase();
+j=i=="div"||i=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var p=this._newInst(b(a),j);p.settings=b.extend({},c||{},h||{});if(i=="input")this._connectDatepicker(a,p);else j&&this._inlineDatepicker(a,p)},_newInst:function(a,c){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:c,dpDiv:!c?this.dpDiv:b('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
+_connectDatepicker:function(a,c){var h=b(a);c.append=b([]);c.trigger=b([]);if(!h.hasClass(this.markerClassName)){this._attachments(h,c);h.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(i,j,n){c.settings[j]=n}).bind("getData.datepicker",function(i,j){return this._get(c,j)});this._autoSize(c);b.data(a,"datepicker",c)}},_attachments:function(a,c){var h=this._get(c,"appendText"),i=this._get(c,"isRTL");c.append&&
+c.append.remove();if(h){c.append=b('<span class="'+this._appendClass+'">'+h+"</span>");a[i?"before":"after"](c.append)}a.unbind("focus",this._showDatepicker);c.trigger&&c.trigger.remove();h=this._get(c,"showOn");if(h=="focus"||h=="both")a.focus(this._showDatepicker);if(h=="button"||h=="both"){h=this._get(c,"buttonText");var j=this._get(c,"buttonImage");c.trigger=b(this._get(c,"buttonImageOnly")?b("<img/>").addClass(this._triggerClass).attr({src:j,alt:h,title:h}):b('<button type="button"></button>').addClass(this._triggerClass).html(j==
+""?h:b("<img/>").attr({src:j,alt:h,title:h})));a[i?"before":"after"](c.trigger);c.trigger.click(function(){b.datepicker._datepickerShowing&&b.datepicker._lastInput==a[0]?b.datepicker._hideDatepicker():b.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var c=new Date(2009,11,20),h=this._get(a,"dateFormat");if(h.match(/[DM]/)){var i=function(j){for(var n=0,p=0,l=0;l<j.length;l++)if(j[l].length>n){n=j[l].length;p=l}return p};c.setMonth(i(this._get(a,
+h.match(/MM/)?"monthNames":"monthNamesShort")));c.setDate(i(this._get(a,h.match(/DD/)?"dayNames":"dayNamesShort"))+20-c.getDay())}a.input.attr("size",this._formatDate(a,c).length)}},_inlineDatepicker:function(a,c){var h=b(a);if(!h.hasClass(this.markerClassName)){h.addClass(this.markerClassName).append(c.dpDiv).bind("setData.datepicker",function(i,j,n){c.settings[j]=n}).bind("getData.datepicker",function(i,j){return this._get(c,j)});b.data(a,"datepicker",c);this._setDate(c,this._getDefaultDate(c),
+true);this._updateDatepicker(c);this._updateAlternate(c);c.dpDiv.show()}},_dialogDatepicker:function(a,c,h,i,j){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=b('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);b("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};b.data(this._dialogInput[0],"datepicker",a)}g(a.settings,i||{});
+c=c&&c.constructor==Date?this._formatDate(a,c):c;this._dialogInput.val(c);this._pos=j?j.length?j:[j.pageX,j.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=h;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);
+this._showDatepicker(this._dialogInput[0]);b.blockUI&&b.blockUI(this.dpDiv);b.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();b.removeData(a,"datepicker");if(i=="input"){h.append.remove();h.trigger.remove();c.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",
+this._doKeyUp)}else if(i=="div"||i=="span")c.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();if(i=="input"){a.disabled=false;h.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(i=="div"||i=="span")c.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=b.map(this._disabledInputs,
+function(j){return j==a?null:j})}},_disableDatepicker:function(a){var c=b(a),h=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var i=a.nodeName.toLowerCase();if(i=="input"){a.disabled=true;h.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(i=="div"||i=="span")c.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=b.map(this._disabledInputs,function(j){return j==a?null:
+j});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var c=0;c<this._disabledInputs.length;c++)if(this._disabledInputs[c]==a)return true;return false},_getInst:function(a){try{return b.data(a,"datepicker")}catch(c){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,c,h){var i=this._getInst(a);if(arguments.length==2&&typeof c=="string")return c=="defaults"?b.extend({},b.datepicker._defaults):i?c=="all"?b.extend({},
+i.settings):this._get(i,c):null;var j=c||{};if(typeof c=="string"){j={};j[c]=h}if(i){this._curInst==i&&this._hideDatepicker();var n=this._getDateDatepicker(a,true),p=this._getMinMaxDate(i,"min"),l=this._getMinMaxDate(i,"max");g(i.settings,j);if(p!==null&&j.dateFormat!==d&&j.minDate===d)i.settings.minDate=this._formatDate(i,p);if(l!==null&&j.dateFormat!==d&&j.maxDate===d)i.settings.maxDate=this._formatDate(i,l);this._attachments(b(a),i);this._autoSize(i);this._setDateDatepicker(a,n);this._updateDatepicker(i)}},
+_changeDatepicker:function(a,c,h){this._optionDatepicker(a,c,h)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,c){if(a=this._getInst(a)){this._setDate(a,c);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,c){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,c);return a?this._getDate(a):null},_doKeyDown:function(a){var c=b.datepicker._getInst(a.target),h=true,i=c.dpDiv.is(".ui-datepicker-rtl");
+c._keyEvent=true;if(b.datepicker._datepickerShowing)switch(a.keyCode){case 9:b.datepicker._hideDatepicker();h=false;break;case 13:h=b("td."+b.datepicker._dayOverClass+":not(."+b.datepicker._currentClass+")",c.dpDiv);h[0]?b.datepicker._selectDay(a.target,c.selectedMonth,c.selectedYear,h[0]):b.datepicker._hideDatepicker();return false;case 27:b.datepicker._hideDatepicker();break;case 33:b.datepicker._adjustDate(a.target,a.ctrlKey?-b.datepicker._get(c,"stepBigMonths"):-b.datepicker._get(c,"stepMonths"),
+"M");break;case 34:b.datepicker._adjustDate(a.target,a.ctrlKey?+b.datepicker._get(c,"stepBigMonths"):+b.datepicker._get(c,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)b.datepicker._clearDate(a.target);h=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)b.datepicker._gotoToday(a.target);h=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,i?+1:-1,"D");h=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)b.datepicker._adjustDate(a.target,a.ctrlKey?
+-b.datepicker._get(c,"stepBigMonths"):-b.datepicker._get(c,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,-7,"D");h=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,i?-1:+1,"D");h=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)b.datepicker._adjustDate(a.target,a.ctrlKey?+b.datepicker._get(c,"stepBigMonths"):+b.datepicker._get(c,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)b.datepicker._adjustDate(a.target,
++7,"D");h=a.ctrlKey||a.metaKey;break;default:h=false}else if(a.keyCode==36&&a.ctrlKey)b.datepicker._showDatepicker(this);else h=false;if(h){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var c=b.datepicker._getInst(a.target);if(b.datepicker._get(c,"constrainInput")){c=b.datepicker._possibleChars(b.datepicker._get(c,"dateFormat"));var h=String.fromCharCode(a.charCode==d?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||h<" "||!c||c.indexOf(h)>-1}},_doKeyUp:function(a){a=b.datepicker._getInst(a.target);
+if(a.input.val()!=a.lastVal)try{if(b.datepicker.parseDate(b.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,b.datepicker._getFormatConfig(a))){b.datepicker._setDateFromField(a);b.datepicker._updateAlternate(a);b.datepicker._updateDatepicker(a)}}catch(c){b.datepicker.log(c)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=b("input",a.parentNode)[0];if(!(b.datepicker._isDisabledDatepicker(a)||b.datepicker._lastInput==a)){var c=b.datepicker._getInst(a);
+b.datepicker._curInst&&b.datepicker._curInst!=c&&b.datepicker._curInst.dpDiv.stop(true,true);var h=b.datepicker._get(c,"beforeShow");g(c.settings,h?h.apply(a,[a,c]):{});c.lastVal=null;b.datepicker._lastInput=a;b.datepicker._setDateFromField(c);if(b.datepicker._inDialog)a.value="";if(!b.datepicker._pos){b.datepicker._pos=b.datepicker._findPos(a);b.datepicker._pos[1]+=a.offsetHeight}var i=false;b(a).parents().each(function(){i|=b(this).css("position")=="fixed";return!i});if(i&&b.browser.opera){b.datepicker._pos[0]-=
+document.documentElement.scrollLeft;b.datepicker._pos[1]-=document.documentElement.scrollTop}h={left:b.datepicker._pos[0],top:b.datepicker._pos[1]};b.datepicker._pos=null;c.dpDiv.empty();c.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});b.datepicker._updateDatepicker(c);h=b.datepicker._checkOffset(c,h,i);c.dpDiv.css({position:b.datepicker._inDialog&&b.blockUI?"static":i?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"});if(!c.inline){h=b.datepicker._get(c,"showAnim");
+var j=b.datepicker._get(c,"duration"),n=function(){b.datepicker._datepickerShowing=true;var p=c.dpDiv.find("iframe.ui-datepicker-cover");if(p.length){var l=b.datepicker._getBorders(c.dpDiv);p.css({left:-l[0],top:-l[1],width:c.dpDiv.outerWidth(),height:c.dpDiv.outerHeight()})}};c.dpDiv.zIndex(b(a).zIndex()+1);b.effects&&b.effects[h]?c.dpDiv.show(h,b.datepicker._get(c,"showOptions"),j,n):c.dpDiv[h||"show"](h?j:null,n);if(!h||!j)n();c.input.is(":visible")&&!c.input.is(":disabled")&&c.input.focus();b.datepicker._curInst=
+c}}},_updateDatepicker:function(a){var c=this,h=b.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var i=a.dpDiv.find("iframe.ui-datepicker-cover");i.length&&i.css({left:-h[0],top:-h[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(){b(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&b(this).removeClass("ui-datepicker-prev-hover");
+this.className.indexOf("ui-datepicker-next")!=-1&&b(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!c._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){b(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");b(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&b(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&b(this).addClass("ui-datepicker-next-hover")}}).end().find("."+
+this._dayOverClass+" a").trigger("mouseover").end();h=this._getNumberOfMonths(a);i=h[1];i>1?a.dpDiv.addClass("ui-datepicker-multi-"+i).css("width",17*i+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(h[0]!=1||h[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==b.datepicker._curInst&&b.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&
+a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var j=a.yearshtml;setTimeout(function(){j===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);j=a.yearshtml=null},0)}},_getBorders:function(a){var c=function(h){return{thin:1,medium:2,thick:3}[h]||h};return[parseFloat(c(a.css("border-left-width"))),parseFloat(c(a.css("border-top-width")))]},_checkOffset:function(a,c,h){var i=a.dpDiv.outerWidth(),j=a.dpDiv.outerHeight(),n=a.input?a.input.outerWidth():
+0,p=a.input?a.input.outerHeight():0,l=document.documentElement.clientWidth+b(document).scrollLeft(),k=document.documentElement.clientHeight+b(document).scrollTop();c.left-=this._get(a,"isRTL")?i-n:0;c.left-=h&&c.left==a.input.offset().left?b(document).scrollLeft():0;c.top-=h&&c.top==a.input.offset().top+p?b(document).scrollTop():0;c.left-=Math.min(c.left,c.left+i>l&&l>i?Math.abs(c.left+i-l):0);c.top-=Math.min(c.top,c.top+j>k&&k>j?Math.abs(j+p):0);return c},_findPos:function(a){for(var c=this._get(this._getInst(a),
+"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||b.expr.filters.hidden(a));)a=a[c?"previousSibling":"nextSibling"];a=b(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var c=this._curInst;if(!(!c||a&&c!=b.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(c,"showAnim");var h=this._get(c,"duration"),i=function(){b.datepicker._tidyDialog(c);this._curInst=null};b.effects&&b.effects[a]?c.dpDiv.hide(a,b.datepicker._get(c,"showOptions"),h,i):c.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?
+"fadeOut":"hide"](a?h:null,i);a||i();if(a=this._get(c,"onClose"))a.apply(c.input?c.input[0]:null,[c.input?c.input.val():"",c]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(b.blockUI){b.unblockUI();b("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(b.datepicker._curInst){a=
+b(a.target);a[0].id!=b.datepicker._mainDivId&&a.parents("#"+b.datepicker._mainDivId).length==0&&!a.hasClass(b.datepicker.markerClassName)&&!a.hasClass(b.datepicker._triggerClass)&&b.datepicker._datepickerShowing&&!(b.datepicker._inDialog&&b.blockUI)&&b.datepicker._hideDatepicker()}},_adjustDate:function(a,c,h){a=b(a);var i=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(i,c+(h=="M"?this._get(i,"showCurrentAtPos"):0),h);this._updateDatepicker(i)}},_gotoToday:function(a){a=
+b(a);var c=this._getInst(a[0]);if(this._get(c,"gotoCurrent")&&c.currentDay){c.selectedDay=c.currentDay;c.drawMonth=c.selectedMonth=c.currentMonth;c.drawYear=c.selectedYear=c.currentYear}else{var h=new Date;c.selectedDay=h.getDate();c.drawMonth=c.selectedMonth=h.getMonth();c.drawYear=c.selectedYear=h.getFullYear()}this._notifyChange(c);this._adjustDate(a)},_selectMonthYear:function(a,c,h){a=b(a);var i=this._getInst(a[0]);i._selectingMonthYear=false;i["selected"+(h=="M"?"Month":"Year")]=i["draw"+(h==
+"M"?"Month":"Year")]=parseInt(c.options[c.selectedIndex].value,10);this._notifyChange(i);this._adjustDate(a)},_clickMonthYear:function(a){var c=this._getInst(b(a)[0]);c.input&&c._selectingMonthYear&&setTimeout(function(){c.input.focus()},0);c._selectingMonthYear=!c._selectingMonthYear},_selectDay:function(a,c,h,i){var j=b(a);if(!(b(i).hasClass(this._unselectableClass)||this._isDisabledDatepicker(j[0]))){j=this._getInst(j[0]);j.selectedDay=j.currentDay=b("a",i).html();j.selectedMonth=j.currentMonth=
+c;j.selectedYear=j.currentYear=h;this._selectDate(a,this._formatDate(j,j.currentDay,j.currentMonth,j.currentYear))}},_clearDate:function(a){a=b(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,c){a=this._getInst(b(a)[0]);c=c!=null?c:this._formatDate(a);a.input&&a.input.val(c);this._updateAlternate(a);var h=this._get(a,"onSelect");if(h)h.apply(a.input?a.input[0]:null,[c,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 c=this._get(a,"altField");if(c){var h=this._get(a,"altFormat")||this._get(a,"dateFormat"),i=this._getDate(a),j=this.formatDate(h,i,this._getFormatConfig(a));b(c).each(function(){b(this).val(j)})}},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 c=a.getTime();a.setMonth(0);
+a.setDate(1);return Math.floor(Math.round((c-a)/864E5)/7)+1},parseDate:function(a,c,h){if(a==null||c==null)throw"Invalid arguments";c=typeof c=="object"?c.toString():c+"";if(c=="")return null;var i=(h?h.shortYearCutoff:null)||this._defaults.shortYearCutoff;i=typeof i!="string"?i:(new Date).getFullYear()%100+parseInt(i,10);for(var j=(h?h.dayNamesShort:null)||this._defaults.dayNamesShort,n=(h?h.dayNames:null)||this._defaults.dayNames,p=(h?h.monthNamesShort:null)||this._defaults.monthNamesShort,l=(h?
+h.monthNames:null)||this._defaults.monthNames,k=h=-1,m=-1,o=-1,q=false,s=function(x){(x=y+1<a.length&&a.charAt(y+1)==x)&&y++;return x},r=function(x){var C=s(x);x=new RegExp("^\\d{1,"+(x=="@"?14:x=="!"?20:x=="y"&&C?4:x=="o"?3:2)+"}");x=c.substring(w).match(x);if(!x)throw"Missing number at position "+w;w+=x[0].length;return parseInt(x[0],10)},u=function(x,C,J){x=s(x)?J:C;for(C=0;C<x.length;C++)if(c.substr(w,x[C].length).toLowerCase()==x[C].toLowerCase()){w+=x[C].length;return C+1}throw"Unknown name at position "+
+w;},v=function(){if(c.charAt(w)!=a.charAt(y))throw"Unexpected literal at position "+w;w++},w=0,y=0;y<a.length;y++)if(q)if(a.charAt(y)=="'"&&!s("'"))q=false;else v();else switch(a.charAt(y)){case "d":m=r("d");break;case "D":u("D",j,n);break;case "o":o=r("o");break;case "m":k=r("m");break;case "M":k=u("M",p,l);break;case "y":h=r("y");break;case "@":var B=new Date(r("@"));h=B.getFullYear();k=B.getMonth()+1;m=B.getDate();break;case "!":B=new Date((r("!")-this._ticksTo1970)/1E4);h=B.getFullYear();k=B.getMonth()+
+1;m=B.getDate();break;case "'":if(s("'"))v();else q=true;break;default:v()}if(h==-1)h=(new Date).getFullYear();else if(h<100)h+=(new Date).getFullYear()-(new Date).getFullYear()%100+(h<=i?0:-100);if(o>-1){k=1;m=o;do{i=this._getDaysInMonth(h,k-1);if(m<=i)break;k++;m-=i}while(1)}B=this._daylightSavingAdjust(new Date(h,k-1,m));if(B.getFullYear()!=h||B.getMonth()+1!=k||B.getDate()!=m)throw"Invalid date";return B},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,c,h){if(!c)return"";var i=(h?h.dayNamesShort:null)||this._defaults.dayNamesShort,j=(h?h.dayNames:null)||this._defaults.dayNames,n=(h?h.monthNamesShort:null)||this._defaults.monthNamesShort;h=(h?h.monthNames:null)||this._defaults.monthNames;var p=function(s){(s=q+1<a.length&&
+a.charAt(q+1)==s)&&q++;return s},l=function(s,r,u){r=""+r;if(p(s))for(;r.length<u;)r="0"+r;return r},k=function(s,r,u,v){return p(s)?v[r]:u[r]},m="",o=false;if(c)for(var q=0;q<a.length;q++)if(o)if(a.charAt(q)=="'"&&!p("'"))o=false;else m+=a.charAt(q);else switch(a.charAt(q)){case "d":m+=l("d",c.getDate(),2);break;case "D":m+=k("D",c.getDay(),i,j);break;case "o":m+=l("o",(c.getTime()-(new Date(c.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":m+=l("m",c.getMonth()+1,2);break;case "M":m+=k("M",
+c.getMonth(),n,h);break;case "y":m+=p("y")?c.getFullYear():(c.getYear()%100<10?"0":"")+c.getYear()%100;break;case "@":m+=c.getTime();break;case "!":m+=c.getTime()*1E4+this._ticksTo1970;break;case "'":if(p("'"))m+="'";else o=true;break;default:m+=a.charAt(q)}return m},_possibleChars:function(a){for(var c="",h=false,i=function(n){(n=j+1<a.length&&a.charAt(j+1)==n)&&j++;return n},j=0;j<a.length;j++)if(h)if(a.charAt(j)=="'"&&!i("'"))h=false;else c+=a.charAt(j);else switch(a.charAt(j)){case "d":case "m":case "y":case "@":c+=
+"0123456789";break;case "D":case "M":return null;case "'":if(i("'"))c+="'";else h=true;break;default:c+=a.charAt(j)}return c},_get:function(a,c){return a.settings[c]!==d?a.settings[c]:this._defaults[c]},_setDateFromField:function(a,c){if(a.input.val()!=a.lastVal){var h=this._get(a,"dateFormat"),i=a.lastVal=a.input?a.input.val():null,j,n;j=n=this._getDefaultDate(a);var p=this._getFormatConfig(a);try{j=this.parseDate(h,i,p)||n}catch(l){this.log(l);i=c?"":i}a.selectedDay=j.getDate();a.drawMonth=a.selectedMonth=
+j.getMonth();a.drawYear=a.selectedYear=j.getFullYear();a.currentDay=i?j.getDate():0;a.currentMonth=i?j.getMonth():0;a.currentYear=i?j.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,c,h){var i=function(n){var p=new Date;p.setDate(p.getDate()+n);return p},j=function(n){try{return b.datepicker.parseDate(b.datepicker._get(a,"dateFormat"),n,b.datepicker._getFormatConfig(a))}catch(p){}var l=
+(n.toLowerCase().match(/^c/)?b.datepicker._getDate(a):null)||new Date,k=l.getFullYear(),m=l.getMonth();l=l.getDate();for(var o=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,q=o.exec(n);q;){switch(q[2]||"d"){case "d":case "D":l+=parseInt(q[1],10);break;case "w":case "W":l+=parseInt(q[1],10)*7;break;case "m":case "M":m+=parseInt(q[1],10);l=Math.min(l,b.datepicker._getDaysInMonth(k,m));break;case "y":case "Y":k+=parseInt(q[1],10);l=Math.min(l,b.datepicker._getDaysInMonth(k,m));break}q=o.exec(n)}return new Date(k,
+m,l)};if(c=(c=c==null||c===""?h:typeof c=="string"?j(c):typeof c=="number"?isNaN(c)?h:i(c):new Date(c.getTime()))&&c.toString()=="Invalid Date"?h:c){c.setHours(0);c.setMinutes(0);c.setSeconds(0);c.setMilliseconds(0)}return this._daylightSavingAdjust(c)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,c,h){var i=!c,j=a.selectedMonth,n=a.selectedYear;c=this._restrictMinMax(a,this._determineDate(a,c,new Date));a.selectedDay=
+a.currentDay=c.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=c.getMonth();a.drawYear=a.selectedYear=a.currentYear=c.getFullYear();if((j!=a.selectedMonth||n!=a.selectedYear)&&!h)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(i?"":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 c=new Date;c=this._daylightSavingAdjust(new Date(c.getFullYear(),
+c.getMonth(),c.getDate()));var h=this._get(a,"isRTL"),i=this._get(a,"showButtonPanel"),j=this._get(a,"hideIfNoPrevNext"),n=this._get(a,"navigationAsDateFormat"),p=this._getNumberOfMonths(a),l=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),m=p[0]!=1||p[1]!=1,o=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),q=this._getMinMaxDate(a,"min"),s=this._getMinMaxDate(a,"max");l=a.drawMonth-l;var r=a.drawYear;if(l<0){l+=12;r--}if(s){var u=
+this._daylightSavingAdjust(new Date(s.getFullYear(),s.getMonth()-p[0]*p[1]+1,s.getDate()));for(u=q&&u<q?q:u;this._daylightSavingAdjust(new Date(r,l,1))>u;){l--;if(l<0){l=11;r--}}}a.drawMonth=l;a.drawYear=r;u=this._get(a,"prevText");u=!n?u:this.formatDate(u,this._daylightSavingAdjust(new Date(r,l-k,1)),this._getFormatConfig(a));u=this._canAdjustMonth(a,-1,r,l)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+u+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(h?"e":"w")+'">'+u+"</span></a>":j?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+u+'"><span class="ui-icon ui-icon-circle-triangle-'+(h?"e":"w")+'">'+u+"</span></a>";var v=this._get(a,"nextText");v=!n?v:this.formatDate(v,this._daylightSavingAdjust(new Date(r,l+k,1)),this._getFormatConfig(a));j=this._canAdjustMonth(a,+1,r,l)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+v+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(h?"w":"e")+'">'+v+"</span></a>":j?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+v+'"><span class="ui-icon ui-icon-circle-triangle-'+(h?"w":"e")+'">'+v+"</span></a>";k=this._get(a,"currentText");v=this._get(a,"gotoCurrent")&&a.currentDay?o:c;k=!n?k:this.formatDate(k,v,this._getFormatConfig(a));n=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+f+'.datepicker._hideDatepicker();">'+this._get(a,
+"closeText")+"</button>":"";i=i?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(h?n:"")+(this._isInRange(a,v)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+f+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(h?"":n)+"</div>":"";n=parseInt(this._get(a,"firstDay"),10);n=isNaN(n)?0:n;k=this._get(a,"showWeek");v=this._get(a,"dayNames");this._get(a,"dayNamesShort");var w=this._get(a,"dayNamesMin"),y=
+this._get(a,"monthNames"),B=this._get(a,"monthNamesShort"),x=this._get(a,"beforeShowDay"),C=this._get(a,"showOtherMonths"),J=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),K="",G=0;G<p[0];G++){for(var N="",H=0;H<p[1];H++){var O=this._daylightSavingAdjust(new Date(r,l,a.selectedDay)),A=" ui-corner-all",D="";if(m){D+='<div class="ui-datepicker-group';if(p[1]>1)switch(H){case 0:D+=" ui-datepicker-group-first";A=" ui-corner-"+(h?"right":"left");break;case p[1]-
+1:D+=" ui-datepicker-group-last";A=" ui-corner-"+(h?"left":"right");break;default:D+=" ui-datepicker-group-middle";A="";break}D+='">'}D+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+A+'">'+(/all|left/.test(A)&&G==0?h?j:u:"")+(/all|right/.test(A)&&G==0?h?u:j:"")+this._generateMonthYearHeader(a,l,r,q,s,G>0||H>0,y,B)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var E=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(A=0;A<7;A++){var z=
+(A+n)%7;E+="<th"+((A+n+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+v[z]+'">'+w[z]+"</span></th>"}D+=E+"</tr></thead><tbody>";E=this._getDaysInMonth(r,l);if(r==a.selectedYear&&l==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,E);A=(this._getFirstDayOfMonth(r,l)-n+7)%7;E=m?6:Math.ceil((A+E)/7);z=this._daylightSavingAdjust(new Date(r,l,1-A));for(var P=0;P<E;P++){D+="<tr>";var Q=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(z)+"</td>";for(A=0;A<7;A++){var I=
+x?x.apply(a.input?a.input[0]:null,[z]):[true,""],F=z.getMonth()!=l,L=F&&!J||!I[0]||q&&z<q||s&&z>s;Q+='<td class="'+((A+n+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(z.getTime()==O.getTime()&&l==a.selectedMonth&&a._keyEvent||M.getTime()==z.getTime()&&M.getTime()==O.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!C?"":" "+I[1]+(z.getTime()==o.getTime()?" "+this._currentClass:"")+(z.getTime()==c.getTime()?" ui-datepicker-today":
+""))+'"'+((!F||C)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+f+".datepicker._selectDay('#"+a.id+"',"+z.getMonth()+","+z.getFullYear()+', this);return false;"')+">"+(F&&!C?" ":L?'<span class="ui-state-default">'+z.getDate()+"</span>":'<a class="ui-state-default'+(z.getTime()==c.getTime()?" ui-state-highlight":"")+(z.getTime()==o.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+z.getDate()+"</a>")+"</td>";z.setDate(z.getDate()+1);z=this._daylightSavingAdjust(z)}D+=
+Q+"</tr>"}l++;if(l>11){l=0;r++}D+="</tbody></table>"+(m?"</div>"+(p[0]>0&&H==p[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");N+=D}K+=N}K+=i+(b.browser.msie&&parseInt(b.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return K},_generateMonthYearHeader:function(a,c,h,i,j,n,p,l){var k=this._get(a,"changeMonth"),m=this._get(a,"changeYear"),o=this._get(a,"showMonthAfterYear"),q='<div class="ui-datepicker-title">',
+s="";if(n||!k)s+='<span class="ui-datepicker-month">'+p[c]+"</span>";else{p=i&&i.getFullYear()==h;var r=j&&j.getFullYear()==h;s+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+f+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+f+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var u=0;u<12;u++)if((!p||u>=i.getMonth())&&(!r||u<=j.getMonth()))s+='<option value="'+u+'"'+(u==c?' selected="selected"':"")+">"+l[u]+"</option>";s+="</select>"}o||(q+=s+(n||!(k&&
+m)?" ":""));a.yearshtml="";if(n||!m)q+='<span class="ui-datepicker-year">'+h+"</span>";else{l=this._get(a,"yearRange").split(":");var v=(new Date).getFullYear();p=function(w){w=w.match(/c[+-].*/)?h+parseInt(w.substring(1),10):w.match(/[+-].*/)?v+parseInt(w,10):parseInt(w,10);return isNaN(w)?v:w};c=p(l[0]);l=Math.max(c,p(l[1]||""));c=i?Math.max(c,i.getFullYear()):c;l=j?Math.min(l,j.getFullYear()):l;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+f+".datepicker._selectMonthYear('#"+
+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+f+".datepicker._clickMonthYear('#"+a.id+"');\">";c<=l;c++)a.yearshtml+='<option value="'+c+'"'+(c==h?' selected="selected"':"")+">"+c+"</option>";a.yearshtml+="</select>";if(b.browser.mozilla)q+='<select class="ui-datepicker-year"><option value="'+h+'" selected="selected">'+h+"</option></select>";else{q+=a.yearshtml;a.yearshtml=null}}q+=this._get(a,"yearSuffix");if(o)q+=(n||!(k&&m)?" ":"")+s;q+="</div>";return q},_adjustInstDate:function(a,c,h){var i=
+a.drawYear+(h=="Y"?c:0),j=a.drawMonth+(h=="M"?c:0);c=Math.min(a.selectedDay,this._getDaysInMonth(i,j))+(h=="D"?c:0);i=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(i,j,c)));a.selectedDay=i.getDate();a.drawMonth=a.selectedMonth=i.getMonth();a.drawYear=a.selectedYear=i.getFullYear();if(h=="M"||h=="Y")this._notifyChange(a)},_restrictMinMax:function(a,c){var h=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");c=h&&c<h?h:c;return c=a&&c>a?a:c},_notifyChange:function(a){var c=this._get(a,
+"onChangeMonthYear");if(c)c.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,c){return this._determineDate(a,this._get(a,c+"Date"),null)},_getDaysInMonth:function(a,c){return 32-this._daylightSavingAdjust(new Date(a,c,32)).getDate()},_getFirstDayOfMonth:function(a,c){return(new Date(a,c,1)).getDay()},_canAdjustMonth:function(a,c,h,i){var j=this._getNumberOfMonths(a);
+h=this._daylightSavingAdjust(new Date(h,i+(c<0?c:j[0]*j[1]),1));c<0&&h.setDate(this._getDaysInMonth(h.getFullYear(),h.getMonth()));return this._isInRange(a,h)},_isInRange:function(a,c){var h=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!h||c.getTime()>=h.getTime())&&(!a||c.getTime()<=a.getTime())},_getFormatConfig:function(a){var c=this._get(a,"shortYearCutoff");c=typeof c!="string"?c:(new Date).getFullYear()%100+parseInt(c,10);return{shortYearCutoff:c,dayNamesShort:this._get(a,
+"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,c,h,i){if(!c){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}c=c?typeof c=="object"?c:this._daylightSavingAdjust(new Date(i,h,c)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),c,this._getFormatConfig(a))}});b.fn.datepicker=
+function(a){if(!this.length)return this;if(!b.datepicker.initialized){b(document).mousedown(b.datepicker._checkExternalClick).find("body").append(b.datepicker.dpDiv);b.datepicker.initialized=true}var c=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this[0]].concat(c));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,
+[this[0]].concat(c));return this.each(function(){typeof a=="string"?b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this].concat(c)):b.datepicker._attachDatepicker(this,a)})};b.datepicker=new e;b.datepicker.initialized=false;b.datepicker.uuid=(new Date).getTime();b.datepicker.version="1.8.11";window["DP_jQuery_"+f]=b})(jQuery);
+(function(b,d){var e={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},g={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};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:{my:"center",at:"center",collision:"fit",using:function(f){var a=b(this).css(f).offset().top;a<0&&
+b(this).css("top",f.top-a)}},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 f=this,a=f.options,c=a.title||" ",h=b.ui.dialog.getTitleId(f.element),i=(f.uiDialog=b("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+a.dialogClass).css({zIndex:a.zIndex}).attr("tabIndex",
+-1).css("outline",0).keydown(function(p){if(a.closeOnEscape&&p.keyCode&&p.keyCode===b.ui.keyCode.ESCAPE){f.close(p);p.preventDefault()}}).attr({role:"dialog","aria-labelledby":h}).mousedown(function(p){f.moveToTop(false,p)});f.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(i);var j=(f.uiDialogTitlebar=b("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(i),n=b('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role",
+"button").hover(function(){n.addClass("ui-state-hover")},function(){n.removeClass("ui-state-hover")}).focus(function(){n.addClass("ui-state-focus")}).blur(function(){n.removeClass("ui-state-focus")}).click(function(p){f.close(p);return false}).appendTo(j);(f.uiDialogTitlebarCloseText=b("<span></span>")).addClass("ui-icon ui-icon-closethick").text(a.closeText).appendTo(n);b("<span></span>").addClass("ui-dialog-title").attr("id",h).html(c).prependTo(j);if(b.isFunction(a.beforeclose)&&!b.isFunction(a.beforeClose))a.beforeClose=
+a.beforeclose;j.find("*").add(j).disableSelection();a.draggable&&b.fn.draggable&&f._makeDraggable();a.resizable&&b.fn.resizable&&f._makeResizable();f._createButtons(a.buttons);f._isOpen=false;b.fn.bgiframe&&i.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var f=this;f.overlay&&f.overlay.destroy();f.uiDialog.hide();f.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");f.uiDialog.remove();f.originalTitle&&
+f.element.attr("title",f.originalTitle);return f},widget:function(){return this.uiDialog},close:function(f){var a=this,c,h;if(false!==a._trigger("beforeClose",f)){a.overlay&&a.overlay.destroy();a.uiDialog.unbind("keypress.ui-dialog");a._isOpen=false;if(a.options.hide)a.uiDialog.hide(a.options.hide,function(){a._trigger("close",f)});else{a.uiDialog.hide();a._trigger("close",f)}b.ui.dialog.overlay.resize();if(a.options.modal){c=0;b(".ui-dialog").each(function(){if(this!==a.uiDialog[0]){h=b(this).css("z-index");
+isNaN(h)||(c=Math.max(c,h))}});b.ui.dialog.maxZ=c}return a}},isOpen:function(){return this._isOpen},moveToTop:function(f,a){var c=this,h=c.options;if(h.modal&&!f||!h.stack&&!h.modal)return c._trigger("focus",a);if(h.zIndex>b.ui.dialog.maxZ)b.ui.dialog.maxZ=h.zIndex;if(c.overlay){b.ui.dialog.maxZ+=1;c.overlay.$el.css("z-index",b.ui.dialog.overlay.maxZ=b.ui.dialog.maxZ)}f={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(f);c._trigger("focus",a);return c},open:function(){if(!this._isOpen){var f=this,a=f.options,c=f.uiDialog;f.overlay=a.modal?new b.ui.dialog.overlay(f):null;f._size();f._position(a.position);c.show(a.show);f.moveToTop(true);a.modal&&c.bind("keypress.ui-dialog",function(h){if(h.keyCode===b.ui.keyCode.TAB){var i=b(":tabbable",this),j=i.filter(":first");i=i.filter(":last");if(h.target===i[0]&&!h.shiftKey){j.focus(1);return false}else if(h.target===j[0]&&h.shiftKey){i.focus(1);return false}}});
+b(f.element.find(":tabbable").get().concat(c.find(".ui-dialog-buttonpane :tabbable").get().concat(c.get()))).eq(0).focus();f._isOpen=true;f._trigger("open");return f}},_createButtons:function(f){var a=this,c=false,h=b("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),i=b("<div></div>").addClass("ui-dialog-buttonset").appendTo(h);a.uiDialog.find(".ui-dialog-buttonpane").remove();typeof f==="object"&&f!==null&&b.each(f,function(){return!(c=true)});if(c){b.each(f,function(j,
+n){n=b.isFunction(n)?{click:n,text:j}:n;j=b('<button type="button"></button>').attr(n,true).unbind("click").click(function(){n.click.apply(a.element[0],arguments)}).appendTo(i);b.fn.button&&j.button()});h.appendTo(a.uiDialog)}},_makeDraggable:function(){function f(j){return{position:j.position,offset:j.offset}}var a=this,c=a.options,h=b(document),i;a.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(j,n){i=
+c.height==="auto"?"auto":b(this).height();b(this).height(b(this).height()).addClass("ui-dialog-dragging");a._trigger("dragStart",j,f(n))},drag:function(j,n){a._trigger("drag",j,f(n))},stop:function(j,n){c.position=[n.position.left-h.scrollLeft(),n.position.top-h.scrollTop()];b(this).removeClass("ui-dialog-dragging").height(i);a._trigger("dragStop",j,f(n));b.ui.dialog.overlay.resize()}})},_makeResizable:function(f){function a(j){return{originalPosition:j.originalPosition,originalSize:j.originalSize,
+position:j.position,size:j.size}}f=f===d?this.options.resizable:f;var c=this,h=c.options,i=c.uiDialog.css("position");f=typeof f==="string"?f:"n,e,s,w,se,sw,ne,nw";c.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:c.element,maxWidth:h.maxWidth,maxHeight:h.maxHeight,minWidth:h.minWidth,minHeight:c._minHeight(),handles:f,start:function(j,n){b(this).addClass("ui-dialog-resizing");c._trigger("resizeStart",j,a(n))},resize:function(j,n){c._trigger("resize",j,a(n))},stop:function(j,
+n){b(this).removeClass("ui-dialog-resizing");h.height=b(this).height();h.width=b(this).width();c._trigger("resizeStop",j,a(n));b.ui.dialog.overlay.resize()}}).css("position",i).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var f=this.options;return f.height==="auto"?f.minHeight:Math.min(f.minHeight,f.height)},_position:function(f){var a=[],c=[0,0],h;if(f){if(typeof f==="string"||typeof f==="object"&&"0"in f){a=f.split?f.split(" "):[f[0],f[1]];if(a.length===
+1)a[1]=a[0];b.each(["left","top"],function(i,j){if(+a[i]===a[i]){c[i]=a[i];a[i]=j}});f={my:a.join(" "),at:a.join(" "),offset:c.join(" ")}}f=b.extend({},b.ui.dialog.prototype.options.position,f)}else f=b.ui.dialog.prototype.options.position;(h=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(b.extend({of:window},f));h||this.uiDialog.hide()},_setOptions:function(f){var a=this,c={},h=false;b.each(f,function(i,j){a._setOption(i,j);if(i in e)h=true;if(i in
+g)c[i]=j});h&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",c)},_setOption:function(f,a){var c=this,h=c.uiDialog;switch(f){case "beforeclose":f="beforeClose";break;case "buttons":c._createButtons(a);break;case "closeText":c.uiDialogTitlebarCloseText.text(""+a);break;case "dialogClass":h.removeClass(c.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+a);break;case "disabled":a?h.addClass("ui-dialog-disabled"):h.removeClass("ui-dialog-disabled");
+break;case "draggable":var i=h.is(":data(draggable)");i&&!a&&h.draggable("destroy");!i&&a&&c._makeDraggable();break;case "position":c._position(a);break;case "resizable":(i=h.is(":data(resizable)"))&&!a&&h.resizable("destroy");i&&typeof a==="string"&&h.resizable("option","handles",a);!i&&a!==false&&c._makeResizable(a);break;case "title":b(".ui-dialog-title",c.uiDialogTitlebar).html(""+(a||" "));break}b.Widget.prototype._setOption.apply(c,arguments)},_size:function(){var f=this.options,a,c,h=
+this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(f.minWidth>f.width)f.width=f.minWidth;a=this.uiDialog.css({height:"auto",width:f.width}).height();c=Math.max(0,f.minHeight-a);if(f.height==="auto")if(b.support.minHeight)this.element.css({minHeight:c,height:"auto"});else{this.uiDialog.show();f=this.element.css("height","auto").height();h||this.uiDialog.hide();this.element.height(Math.max(f,c))}else this.element.height(Math.max(f.height-a,0));this.uiDialog.is(":data(resizable)")&&
+this.uiDialog.resizable("option","minHeight",this._minHeight())}});b.extend(b.ui.dialog,{version:"1.8.11",uuid:0,maxZ:0,getTitleId:function(f){f=f.attr("id");if(!f){this.uuid+=1;f=this.uuid}return"ui-dialog-title-"+f},overlay:function(f){this.$el=b.ui.dialog.overlay.create(f)}});b.extend(b.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:b.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(f){return f+".dialog-overlay"}).join(" "),create:function(f){if(this.instances.length===
+0){setTimeout(function(){b.ui.dialog.overlay.instances.length&&b(document).bind(b.ui.dialog.overlay.events,function(c){if(b(c.target).zIndex()<b.ui.dialog.overlay.maxZ)return false})},1);b(document).bind("keydown.dialog-overlay",function(c){if(f.options.closeOnEscape&&c.keyCode&&c.keyCode===b.ui.keyCode.ESCAPE){f.close(c);c.preventDefault()}});b(window).bind("resize.dialog-overlay",b.ui.dialog.overlay.resize)}var a=(this.oldInstances.pop()||b("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
+height:this.height()});b.fn.bgiframe&&a.bgiframe();this.instances.push(a);return a},destroy:function(f){var a=b.inArray(f,this.instances);a!=-1&&this.oldInstances.push(this.instances.splice(a,1)[0]);this.instances.length===0&&b([document,window]).unbind(".dialog-overlay");f.remove();var c=0;b.each(this.instances,function(){c=Math.max(c,this.css("z-index"))});this.maxZ=c},height:function(){var f,a;if(b.browser.msie&&b.browser.version<7){f=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
+a=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return f<a?b(window).height()+"px":f+"px"}else return b(document).height()+"px"},width:function(){var f,a;if(b.browser.msie&&b.browser.version<7){f=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);a=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return f<a?b(window).width()+"px":f+"px"}else return b(document).width()+"px"},resize:function(){var f=b([]);b.each(b.ui.dialog.overlay.instances,
+function(){f=f.add(this)});f.css({width:0,height:0}).css({width:b.ui.dialog.overlay.width(),height:b.ui.dialog.overlay.height()})}});b.extend(b.ui.dialog.overlay.prototype,{destroy:function(){b.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+(function(b){b.ui=b.ui||{};var d=/left|center|right/,e=/top|center|bottom/,g=b.fn.position,f=b.fn.offset;b.fn.position=function(a){if(!a||!a.of)return g.apply(this,arguments);a=b.extend({},a);var c=b(a.of),h=c[0],i=(a.collision||"flip").split(" "),j=a.offset?a.offset.split(" "):[0,0],n,p,l;if(h.nodeType===9){n=c.width();p=c.height();l={top:0,left:0}}else if(h.setTimeout){n=c.width();p=c.height();l={top:c.scrollTop(),left:c.scrollLeft()}}else if(h.preventDefault){a.at="left top";n=p=0;l={top:a.of.pageY,
+left:a.of.pageX}}else{n=c.outerWidth();p=c.outerHeight();l=c.offset()}b.each(["my","at"],function(){var k=(a[this]||"").split(" ");if(k.length===1)k=d.test(k[0])?k.concat(["center"]):e.test(k[0])?["center"].concat(k):["center","center"];k[0]=d.test(k[0])?k[0]:"center";k[1]=e.test(k[1])?k[1]:"center";a[this]=k});if(i.length===1)i[1]=i[0];j[0]=parseInt(j[0],10)||0;if(j.length===1)j[1]=j[0];j[1]=parseInt(j[1],10)||0;if(a.at[0]==="right")l.left+=n;else if(a.at[0]==="center")l.left+=n/2;if(a.at[1]==="bottom")l.top+=
+p;else if(a.at[1]==="center")l.top+=p/2;l.left+=j[0];l.top+=j[1];return this.each(function(){var k=b(this),m=k.outerWidth(),o=k.outerHeight(),q=parseInt(b.curCSS(this,"marginLeft",true))||0,s=parseInt(b.curCSS(this,"marginTop",true))||0,r=m+q+(parseInt(b.curCSS(this,"marginRight",true))||0),u=o+s+(parseInt(b.curCSS(this,"marginBottom",true))||0),v=b.extend({},l),w;if(a.my[0]==="right")v.left-=m;else if(a.my[0]==="center")v.left-=m/2;if(a.my[1]==="bottom")v.top-=o;else if(a.my[1]==="center")v.top-=
+o/2;v.left=Math.round(v.left);v.top=Math.round(v.top);w={left:v.left-q,top:v.top-s};b.each(["left","top"],function(y,B){b.ui.position[i[y]]&&b.ui.position[i[y]][B](v,{targetWidth:n,targetHeight:p,elemWidth:m,elemHeight:o,collisionPosition:w,collisionWidth:r,collisionHeight:u,offset:j,my:a.my,at:a.at})});b.fn.bgiframe&&k.bgiframe();k.offset(b.extend(v,{using:a.using}))})};b.ui.position={fit:{left:function(a,c){var h=b(window);h=c.collisionPosition.left+c.collisionWidth-h.width()-h.scrollLeft();a.left=
+h>0?a.left-h:Math.max(a.left-c.collisionPosition.left,a.left)},top:function(a,c){var h=b(window);h=c.collisionPosition.top+c.collisionHeight-h.height()-h.scrollTop();a.top=h>0?a.top-h:Math.max(a.top-c.collisionPosition.top,a.top)}},flip:{left:function(a,c){if(c.at[0]!=="center"){var h=b(window);h=c.collisionPosition.left+c.collisionWidth-h.width()-h.scrollLeft();var i=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,j=c.at[0]==="left"?c.targetWidth:-c.targetWidth,n=-2*c.offset[0];a.left+=
+c.collisionPosition.left<0?i+j+n:h>0?i+j+n:0}},top:function(a,c){if(c.at[1]!=="center"){var h=b(window);h=c.collisionPosition.top+c.collisionHeight-h.height()-h.scrollTop();var i=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,j=c.at[1]==="top"?c.targetHeight:-c.targetHeight,n=-2*c.offset[1];a.top+=c.collisionPosition.top<0?i+j+n:h>0?i+j+n:0}}}};if(!b.offset.setOffset){b.offset.setOffset=function(a,c){if(/static/.test(b.curCSS(a,"position")))a.style.position="relative";var h=b(a),
+i=h.offset(),j=parseInt(b.curCSS(a,"top",true),10)||0,n=parseInt(b.curCSS(a,"left",true),10)||0;i={top:c.top-i.top+j,left:c.left-i.left+n};"using"in c?c.using.call(a,i):h.css(i)};b.fn.offset=function(a){var c=this[0];if(!c||!c.ownerDocument)return null;if(a)return this.each(function(){b.offset.setOffset(this,a)});return f.call(this)}}})(jQuery);
+(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("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").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(e){if(e===d)return this._value();this._setOption("value",e);return this},_setOption:function(e,g){if(e==="value"){this.options.value=g;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var e=this.options.value;if(typeof e!=="number")e=0;return Math.min(this.options.max,Math.max(this.min,e))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var e=this.value(),g=this._percentage();if(this.oldValue!==e){this.oldValue=e;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",e===this.options.max).width(g.toFixed(0)+"%");this.element.attr("aria-valuenow",e)}});b.extend(b.ui.progressbar,{version:"1.8.11"})})(jQuery);
+(function(b){b.widget("ui.slider",b.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var d=this,e=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");e.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
+this.range=b([]);if(e.range){if(e.range===true){this.range=b("<div></div>");if(!e.values)e.values=[this._valueMin(),this._valueMin()];if(e.values.length&&e.values.length!==2)e.values=[e.values[0],e.values[0]]}else this.range=b("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(e.range==="min"||e.range==="max")this.range.addClass("ui-slider-range-"+e.range);this.range.addClass("ui-widget-header")}b(".ui-slider-handle",this.element).length===0&&b("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
+if(e.values&&e.values.length)for(;b(".ui-slider-handle",this.element).length<e.values.length;)b("<a href='#'></a>").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(g){g.preventDefault()}).hover(function(){e.disabled||b(this).addClass("ui-state-hover")},function(){b(this).removeClass("ui-state-hover")}).focus(function(){if(e.disabled)b(this).blur();
+else{b(".ui-slider .ui-state-focus").removeClass("ui-state-focus");b(this).addClass("ui-state-focus")}}).blur(function(){b(this).removeClass("ui-state-focus")});this.handles.each(function(g){b(this).data("index.ui-slider-handle",g)});this.handles.keydown(function(g){var f=true,a=b(this).data("index.ui-slider-handle"),c,h,i;if(!d.options.disabled){switch(g.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:f=
+false;if(!d._keySliding){d._keySliding=true;b(this).addClass("ui-state-active");c=d._start(g,a);if(c===false)return}break}i=d.options.step;c=d.options.values&&d.options.values.length?(h=d.values(a)):(h=d.value());switch(g.keyCode){case b.ui.keyCode.HOME:h=d._valueMin();break;case b.ui.keyCode.END:h=d._valueMax();break;case b.ui.keyCode.PAGE_UP:h=d._trimAlignValue(c+(d._valueMax()-d._valueMin())/5);break;case b.ui.keyCode.PAGE_DOWN:h=d._trimAlignValue(c-(d._valueMax()-d._valueMin())/5);break;case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:if(c===
+d._valueMax())return;h=d._trimAlignValue(c+i);break;case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:if(c===d._valueMin())return;h=d._trimAlignValue(c-i);break}d._slide(g,a,h);return f}}).keyup(function(g){var f=b(this).data("index.ui-slider-handle");if(d._keySliding){d._keySliding=false;d._stop(g,f);d._change(g,f);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(d){var e=this.options,g,f,a,c,h;if(e.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();g=this._normValueFromMouse({x:d.pageX,y:d.pageY});f=this._valueMax()-this._valueMin()+1;c=this;this.handles.each(function(i){var j=Math.abs(g-c.values(i));if(f>j){f=j;a=b(this);h=i}});if(e.range===true&&this.values(1)===e.min){h+=1;a=b(this.handles[h])}if(this._start(d,
+h)===false)return false;this._mouseSliding=true;c._handleIndex=h;a.addClass("ui-state-active").focus();e=a.offset();this._clickOffset=!b(d.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:d.pageX-e.left-a.width()/2,top:d.pageY-e.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(d,h,g);return this._animateOff=true},_mouseStart:function(){return true},
+_mouseDrag:function(d){var e=this._normValueFromMouse({x:d.pageX,y:d.pageY});this._slide(d,this._handleIndex,e);return false},_mouseStop:function(d){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(d,this._handleIndex);this._change(d,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(d){var e;
+if(this.orientation==="horizontal"){e=this.elementSize.width;d=d.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{e=this.elementSize.height;d=d.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}e=d/e;if(e>1)e=1;if(e<0)e=0;if(this.orientation==="vertical")e=1-e;d=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+e*d)},_start:function(d,e){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=
+this.values(e);g.values=this.values()}return this._trigger("start",d,g)},_slide:function(d,e,g){var f;if(this.options.values&&this.options.values.length){f=this.values(e?0:1);if(this.options.values.length===2&&this.options.range===true&&(e===0&&g>f||e===1&&g<f))g=f;if(g!==this.values(e)){f=this.values();f[e]=g;d=this._trigger("slide",d,{handle:this.handles[e],value:g,values:f});this.values(e?0:1);d!==false&&this.values(e,g,true)}}else if(g!==this.value()){d=this._trigger("slide",d,{handle:this.handles[e],
+value:g});d!==false&&this.value(g)}},_stop:function(d,e){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=this.values(e);g.values=this.values()}this._trigger("stop",d,g)},_change:function(d,e){if(!this._keySliding&&!this._mouseSliding){var g={handle:this.handles[e],value:this.value()};if(this.options.values&&this.options.values.length){g.value=this.values(e);g.values=this.values()}this._trigger("change",d,g)}},value:function(d){if(arguments.length){this.options.value=
+this._trimAlignValue(d);this._refreshValue();this._change(null,0)}return this._value()},values:function(d,e){var g,f,a;if(arguments.length>1){this.options.values[d]=this._trimAlignValue(e);this._refreshValue();this._change(null,d)}if(arguments.length)if(b.isArray(arguments[0])){g=this.options.values;f=arguments[0];for(a=0;a<g.length;a+=1){g[a]=this._trimAlignValue(f[a]);this._change(null,a)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(d):this.value();
+else return this._values()},_setOption:function(d,e){var g,f=0;if(b.isArray(this.options.values))f=this.options.values.length;b.Widget.prototype._setOption.apply(this,arguments);switch(d){case "disabled":if(e){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(g=0;g<f;g+=1)this._change(null,g);this._animateOff=false;break}},_value:function(){var d=this.options.value;return d=this._trimAlignValue(d)},_values:function(d){var e,g;if(arguments.length){e=this.options.values[d];
+return e=this._trimAlignValue(e)}else{e=this.options.values.slice();for(g=0;g<e.length;g+=1)e[g]=this._trimAlignValue(e[g]);return e}},_trimAlignValue:function(d){if(d<=this._valueMin())return this._valueMin();if(d>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,g=(d-this._valueMin())%e;alignValue=d-g;if(Math.abs(g)*2>=e)alignValue+=g>0?e:-e;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
+_refreshValue:function(){var d=this.options.range,e=this.options,g=this,f=!this._animateOff?e.animate:false,a,c={},h,i,j,n;if(this.options.values&&this.options.values.length)this.handles.each(function(p){a=(g.values(p)-g._valueMin())/(g._valueMax()-g._valueMin())*100;c[g.orientation==="horizontal"?"left":"bottom"]=a+"%";b(this).stop(1,1)[f?"animate":"css"](c,e.animate);if(g.options.range===true)if(g.orientation==="horizontal"){if(p===0)g.range.stop(1,1)[f?"animate":"css"]({left:a+"%"},e.animate);
+if(p===1)g.range[f?"animate":"css"]({width:a-h+"%"},{queue:false,duration:e.animate})}else{if(p===0)g.range.stop(1,1)[f?"animate":"css"]({bottom:a+"%"},e.animate);if(p===1)g.range[f?"animate":"css"]({height:a-h+"%"},{queue:false,duration:e.animate})}h=a});else{i=this.value();j=this._valueMin();n=this._valueMax();a=n!==j?(i-j)/(n-j)*100:0;c[g.orientation==="horizontal"?"left":"bottom"]=a+"%";this.handle.stop(1,1)[f?"animate":"css"](c,e.animate);if(d==="min"&&this.orientation==="horizontal")this.range.stop(1,
+1)[f?"animate":"css"]({width:a+"%"},e.animate);if(d==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-a+"%"},{queue:false,duration:e.animate});if(d==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:a+"%"},e.animate);if(d==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-a+"%"},{queue:false,duration:e.animate})}}});b.extend(b.ui.slider,{version:"1.8.11"})})(jQuery);
+(function(b,d){function e(){return++f}function g(){return++a}var f=0,a=0;b.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:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading…</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(c,h){if(c=="selected")this.options.collapsible&&
+h==this.options.selected||this.select(h);else{this.options[c]=h;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+g());return b.cookie.apply(null,[c].concat(b.makeArray(arguments)))},_ui:function(c,h){return{tab:c,panel:h,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c=
+b(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function h(r,u){r.css("display","");!b.support.opacity&&u.opacity&&r[0].style.removeAttribute("filter")}var i=this,j=this.options,n=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=b(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return b("a",this)[0]});this.panels=b([]);this.anchors.each(function(r,u){var v=b(u).attr("href"),w=v.split("#")[0],y;if(w&&(w===location.toString().split("#")[0]||
+(y=b("base")[0])&&w===y.href)){v=u.hash;u.href=v}if(n.test(v))i.panels=i.panels.add(i.element.find(i._sanitizeSelector(v)));else if(v&&v!=="#"){b.data(u,"href.tabs",v);b.data(u,"load.tabs",v.replace(/#.*$/,""));v=i._tabId(u);u.href="#"+v;u=i.element.find("#"+v);if(!u.length){u=b(j.panelTemplate).attr("id",v).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(i.panels[r-1]||i.list);u.data("destroy.tabs",true)}i.panels=i.panels.add(u)}else j.disabled.push(r)});if(c){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(j.selected===d){location.hash&&this.anchors.each(function(r,u){if(u.hash==location.hash){j.selected=r;return false}});if(typeof j.selected!=="number"&&j.cookie)j.selected=parseInt(i._cookie(),10);if(typeof j.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)j.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));j.selected=j.selected||(this.lis.length?0:-1)}else if(j.selected===null)j.selected=-1;j.selected=j.selected>=0&&this.anchors[j.selected]||j.selected<0?j.selected:0;j.disabled=b.unique(j.disabled.concat(b.map(this.lis.filter(".ui-state-disabled"),function(r){return i.lis.index(r)}))).sort();b.inArray(j.selected,j.disabled)!=-1&&j.disabled.splice(b.inArray(j.selected,j.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(j.selected>=0&&this.anchors.length){i.element.find(i._sanitizeSelector(i.anchors[j.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(j.selected).addClass("ui-tabs-selected ui-state-active");i.element.queue("tabs",function(){i._trigger("show",null,i._ui(i.anchors[j.selected],i.element.find(i._sanitizeSelector(i.anchors[j.selected].hash))[0]))});this.load(j.selected)}b(window).bind("unload",function(){i.lis.add(i.anchors).unbind(".tabs");i.lis=i.anchors=i.panels=null})}else j.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[j.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");j.cookie&&this._cookie(j.selected,j.cookie);c=0;for(var p;p=this.lis[c];c++)b(p)[b.inArray(c,j.disabled)!=-1&&!b(p).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");j.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(j.event!=="mouseover"){var l=function(r,u){u.is(":not(.ui-state-disabled)")&&u.addClass("ui-state-"+r)},k=function(r,u){u.removeClass("ui-state-"+
+r)};this.lis.bind("mouseover.tabs",function(){l("hover",b(this))});this.lis.bind("mouseout.tabs",function(){k("hover",b(this))});this.anchors.bind("focus.tabs",function(){l("focus",b(this).closest("li"))});this.anchors.bind("blur.tabs",function(){k("focus",b(this).closest("li"))})}var m,o;if(j.fx)if(b.isArray(j.fx)){m=j.fx[0];o=j.fx[1]}else m=o=j.fx;var q=o?function(r,u){b(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){h(u,o);i._trigger("show",null,i._ui(r,u[0]))})}:function(r,u){b(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.removeClass("ui-tabs-hide");i._trigger("show",null,i._ui(r,u[0]))},s=m?function(r,u){u.animate(m,m.duration||"normal",function(){i.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");h(u,m);i.element.dequeue("tabs")})}:function(r,u){i.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");i.element.dequeue("tabs")};
+this.anchors.bind(j.event+".tabs",function(){var r=this,u=b(r).closest("li"),v=i.panels.filter(":not(.ui-tabs-hide)"),w=i.element.find(i._sanitizeSelector(r.hash));if(u.hasClass("ui-tabs-selected")&&!j.collapsible||u.hasClass("ui-state-disabled")||u.hasClass("ui-state-processing")||i.panels.filter(":animated").length||i._trigger("select",null,i._ui(this,w[0]))===false){this.blur();return false}j.selected=i.anchors.index(this);i.abort();if(j.collapsible)if(u.hasClass("ui-tabs-selected")){j.selected=
+-1;j.cookie&&i._cookie(j.selected,j.cookie);i.element.queue("tabs",function(){s(r,v)}).dequeue("tabs");this.blur();return false}else if(!v.length){j.cookie&&i._cookie(j.selected,j.cookie);i.element.queue("tabs",function(){q(r,w)});i.load(i.anchors.index(this));this.blur();return false}j.cookie&&i._cookie(j.selected,j.cookie);if(w.length){v.length&&i.element.queue("tabs",function(){s(r,v)});i.element.queue("tabs",function(){q(r,w)});i.load(i.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+b.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(c){if(typeof c=="string")c=this.anchors.index(this.anchors.filter("[href$="+c+"]"));return c},destroy:function(){var c=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 h=
+b.data(this,"href.tabs");if(h)this.href=h;var i=b(this).unbind(".tabs");b.each(["href","load","cache"],function(j,n){i.removeData(n+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){b.data(this,"destroy.tabs")?b(this).remove():b(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")});c.cookie&&this._cookie(null,c.cookie);return this},add:function(c,
+h,i){if(i===d)i=this.anchors.length;var j=this,n=this.options;h=b(n.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,h));c=!c.indexOf("#")?c.replace("#",""):this._tabId(b("a",h)[0]);h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var p=j.element.find("#"+c);p.length||(p=b(n.panelTemplate).attr("id",c).data("destroy.tabs",true));p.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(i>=this.lis.length){h.appendTo(this.list);p.appendTo(this.list[0].parentNode)}else{h.insertBefore(this.lis[i]);
+p.insertBefore(this.panels[i])}n.disabled=b.map(n.disabled,function(l){return l>=i?++l:l});this._tabify();if(this.anchors.length==1){n.selected=0;h.addClass("ui-tabs-selected ui-state-active");p.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){j._trigger("show",null,j._ui(j.anchors[0],j.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[i],this.panels[i]));return this},remove:function(c){c=this._getIndex(c);var h=this.options,i=this.lis.eq(c).remove(),j=this.panels.eq(c).remove();
+if(i.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(c+(c+1<this.anchors.length?1:-1));h.disabled=b.map(b.grep(h.disabled,function(n){return n!=c}),function(n){return n>=c?--n:n});this._tabify();this._trigger("remove",null,this._ui(i.find("a")[0],j[0]));return this},enable:function(c){c=this._getIndex(c);var h=this.options;if(b.inArray(c,h.disabled)!=-1){this.lis.eq(c).removeClass("ui-state-disabled");h.disabled=b.grep(h.disabled,function(i){return i!=c});this._trigger("enable",null,
+this._ui(this.anchors[c],this.panels[c]));return this}},disable:function(c){c=this._getIndex(c);var h=this.options;if(c!=h.selected){this.lis.eq(c).addClass("ui-state-disabled");h.disabled.push(c);h.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}return this},select:function(c){c=this._getIndex(c);if(c==-1)if(this.options.collapsible&&this.options.selected!=-1)c=this.options.selected;else return this;this.anchors.eq(c).trigger(this.options.event+".tabs");return this},
+load:function(c){c=this._getIndex(c);var h=this,i=this.options,j=this.anchors.eq(c)[0],n=b.data(j,"load.tabs");this.abort();if(!n||this.element.queue("tabs").length!==0&&b.data(j,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(c).addClass("ui-state-processing");if(i.spinner){var p=b("span",j);p.data("label.tabs",p.html()).html(i.spinner)}this.xhr=b.ajax(b.extend({},i.ajaxOptions,{url:n,success:function(l,k){h.element.find(h._sanitizeSelector(j.hash)).html(l);h._cleanup();i.cache&&b.data(j,
+"cache.tabs",true);h._trigger("load",null,h._ui(h.anchors[c],h.panels[c]));try{i.ajaxOptions.success(l,k)}catch(m){}},error:function(l,k){h._cleanup();h._trigger("load",null,h._ui(h.anchors[c],h.panels[c]));try{i.ajaxOptions.error(l,k,c,j)}catch(m){}}}));h.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(c,h){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",h);return this},length:function(){return this.anchors.length}});b.extend(b.ui.tabs,{version:"1.8.11"});b.extend(b.ui.tabs.prototype,{rotation:null,rotate:function(c,h){var i=this,j=this.options,n=i._rotate||(i._rotate=function(p){clearTimeout(i.rotation);i.rotation=setTimeout(function(){var l=j.selected;i.select(++l<i.anchors.length?l:0)},c);p&&p.stopPropagation()});h=i._unrotate||(i._unrotate=!h?function(p){p.clientX&&
i.rotate(null)}:function(){t=j.selected;n()});if(c){this.element.bind("tabsshow",n);this.anchors.bind(j.event+".tabs",h);n()}else{clearTimeout(i.rotation);this.element.unbind("tabsshow",n);this.anchors.unbind(j.event+".tabs",h);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
\ No newline at end of file
-/**\r
- * Class and function collection for WCF\r
- * \r
- * @author Tim Düsterhus, Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-\r
-/**\r
- * Initialize WCF namespace\r
- */\r
-var WCF = {};\r
-\r
-/**\r
- * Extends jQuery with additional methods.\r
- */\r
-$.extend(true, {\r
- /**\r
- * Escapes an ID to work with jQuery selectors.\r
- *\r
- * @see http://docs.jquery.com/Frequently_Asked_Questions#How_do_I_select_an_element_by_an_ID_that_has_characters_used_in_CSS_notation.3F\r
- * @param string id\r
- * @return string\r
- */\r
- wcfEscapeID: function(id) {\r
- return id.replace(/(:|\.)/g, '\\$1');\r
- },\r
- \r
- /**\r
- * Returns true if given ID exists within DOM.\r
- * \r
- * @param string id\r
- * @return boolean\r
- */\r
- wcfIsset: function(id) {\r
- return !!$('#' + $.wcfEscapeID(id)).length;\r
- }\r
-});\r
-\r
-/**\r
- * Extends jQuery's chainable methods.\r
- */\r
-$.fn.extend({\r
- /**\r
- * Returns tag name of current jQuery element.\r
- * \r
- * @returns string\r
- */\r
- getTagName: function() {\r
- return this.get(0).tagName.toLowerCase();\r
- },\r
- \r
- /**\r
- * Returns the dimensions for current element.\r
- * \r
- * @see http://api.jquery.com/hidden-selector/\r
- * @param string type\r
- * @return object\r
- */\r
- getDimensions: function(type) {\r
- var dimensions = css = {};\r
- var wasHidden = false;\r
- \r
- // show element to retrieve dimensions and restore them later\r
- if (this.is(':hidden')) {\r
- css = {\r
- display: this.css('display'),\r
- visibility: this.css('visibility')\r
- };\r
- \r
- wasHidden = true;\r
- \r
- this.css({\r
- display: 'block',\r
- visibility: 'hidden'\r
- });\r
- }\r
- \r
- switch (type) {\r
- case 'inner':\r
- dimensions = {\r
- height: this.innerHeight(),\r
- width: this.innerWidth()\r
- };\r
- break;\r
- \r
- case 'outer':\r
- dimensions = {\r
- height: this.outerHeight(),\r
- width: this.outerWidth()\r
- };\r
- break;\r
- \r
- default:\r
- dimensions = {\r
- height: this.height(),\r
- width: this.width()\r
- };\r
- break;\r
- }\r
- \r
- // restore previous settings\r
- if (wasHidden) {\r
- this.css(css);\r
- }\r
- \r
- return dimensions;\r
- },\r
- \r
- /**\r
- * Returns the offsets for current element, defaults to position\r
- * relative to document.\r
- * \r
- * @see http://api.jquery.com/hidden-selector/\r
- * @param string type\r
- * @return object\r
- */\r
- getOffsets: function(type) {\r
- var offsets = css = {};\r
- var wasHidden = false;\r
- \r
- // show element to retrieve dimensions and restore them later\r
- if (this.is(':hidden')) {\r
- css = {\r
- display: this.css('display'),\r
- visibility: this.css('visibility')\r
- };\r
- \r
- wasHidden = true;\r
- \r
- this.css({\r
- display: 'block',\r
- visibility: 'hidden'\r
- });\r
- }\r
- \r
- switch (type) {\r
- case 'offset':\r
- offsets = this.offset();\r
- break;\r
- \r
- case 'position':\r
- default:\r
- offsets = this.position();\r
- break;\r
- }\r
- \r
- // restore previous settings\r
- if (wasHidden) {\r
- this.css(css);\r
- }\r
- \r
- return offsets;\r
- },\r
- \r
- /**\r
- * Changes element's position to 'absolute' or 'fixed' while maintaining it's\r
- * current position relative to viewport. Optionally removes element from\r
- * current DOM-node and moving it into body-element (useful for drag & drop)\r
- * \r
- * @param boolean rebase\r
- * @return object\r
- */\r
- makePositioned: function(position, rebase) {\r
- if (position != 'absolute' && position != 'fixed') {\r
- position = 'absolute';\r
- }\r
- \r
- var $currentPosition = this.getOffsets('position');\r
- this.css({\r
- position: position,\r
- left: $currentPosition.left,\r
- margin: 0,\r
- top: $currentPosition.top\r
- });\r
- \r
- if (rebase) {\r
- this.remove().appentTo('body');\r
- }\r
- \r
- return this;\r
- },\r
- \r
- /**\r
- * Disables a form element.\r
- * \r
- * @return jQuery\r
- */\r
- disable: function() {\r
- return this.attr('disabled', 'disabled');\r
- },\r
- \r
- /**\r
- * Enables a form element.\r
- * \r
- * @return jQuery\r
- */\r
- enable: function() {\r
- return this.removeAttr('disabled');\r
- },\r
- \r
- /**\r
- * Applies a grow-effect by resizing element while moving the\r
- * element appropriately\r
- * \r
- * @param object data\r
- * @param object options\r
- * @return jQuery\r
- */\r
- wcfGrow: function(data, options) {\r
- // create temporarily element to determine dimensions\r
- var $tempElementID = WCF.getRandomID();\r
- $('body').append('<div id="' + $tempElementID + '" class="wcfDimensions">' + data.content + '</div>');\r
- var $tempElement = $('#' + $tempElementID);\r
- \r
- // get content dimensions\r
- var $dimensions = $tempElement.getDimensions();\r
- \r
- // remove temporarily element\r
- $tempElement.empty().remove();\r
- \r
- // move parent element, used if applying effect on dialogs\r
- if (!data.parent) {\r
- data.parent = this;\r
- }\r
- \r
- // calculate values for grow-effect\r
- var $borderHeight = parseInt(data.parent.css('borderTopWidth')) + parseInt(data.parent.css('borderBottomWidth'));\r
- var $borderWidth = parseInt(data.parent.css('borderLeftWidth')) + parseInt(data.parent.css('borderRightWidth'));\r
- \r
- var $windowDimensions = $(window).getDimensions();\r
- var $leftOffset = Math.round(($windowDimensions.width - ($dimensions.width + $borderWidth)) / 2);\r
- var $topOffset = Math.round(($windowDimensions.height - ($dimensions.height + $borderHeight)) / 2);\r
- \r
- data.parent.makePositioned('fixed', false);\r
- data.parent.animate({\r
- left: $leftOffset + 'px',\r
- top: $topOffset + 'px'\r
- }, options);\r
- \r
- return this.animate({\r
- height: $dimensions.height,\r
- width: $dimensions.width\r
- }, options);\r
- },\r
- \r
- /**\r
- * Shows an element by sliding and fading it into viewport.\r
- * \r
- * @param string direction\r
- * @param object callback\r
- * @returns jQuery\r
- */\r
- wcfDropIn: function(direction, callback) {\r
- if (!direction) direction = 'up';\r
- \r
- return this.show(WCF.getEffect(this.getTagName(), 'drop'), { direction: direction }, 600, callback);\r
- },\r
- \r
- /**\r
- * Hides an element by sliding and fading it out the viewport.\r
- * \r
- * @param string direction\r
- * @param object callback\r
- * @returns jQuery\r
- */\r
- wcfDropOut: function(direction, callback) {\r
- if (!direction) direction = 'down';\r
- \r
- return this.hide(WCF.getEffect(this.getTagName(), 'drop'), { direction: direction }, 600, callback);\r
- },\r
- \r
- /**\r
- * Shows an element by blinding it up.\r
- * \r
- * @param string direction\r
- * @param object callback\r
- * @returns jQuery\r
- */\r
- wcfBlindIn: function(direction, callback) {\r
- if (!direction) direction = 'vertical';\r
- \r
- return this.show(WCF.getEffect(this.getTagName(), 'blind'), { direction: direction }, 200, callback);\r
- },\r
- \r
- /**\r
- * Hides an element by blinding it down.\r
- * \r
- * @param string direction\r
- * @param object callback\r
- * @returns jQuery\r
- */\r
- wcfBlindOut: function(direction, callback) {\r
- if (!direction) direction = 'vertical';\r
- \r
- return this.hide(WCF.getEffect(this.getTagName(), 'blind'), { direction: direction }, 200, callback);\r
- },\r
- \r
- /**\r
- * Highlights an element.\r
- * \r
- * @param object options\r
- * @param object callback\r
- * @returns jQuery\r
- */\r
- wcfHighlight: function(options, callback) {\r
- return this.effect('highlight', options, 600, callback);\r
- }\r
-});\r
-\r
-/**\r
- * WoltLab Community Framework core methods\r
- */\r
-$.extend(WCF, {\r
- /**\r
- * Counter for dynamic element id's\r
- *\r
- * @var integer\r
- */\r
- _idCounter: 0,\r
- \r
- /**\r
- * Shows a modal dialog with a built-in AJAX-loader.\r
- * \r
- * @param string dialogID\r
- * @param boolean resetDialog\r
- */\r
- showAJAXDialog: function(dialogID, resetDialog) {\r
- if (!dialogID) {\r
- dialogID = this.getRandomID();\r
- }\r
- \r
- if (!$.wcfIsset(dialogID)) {\r
- $('body').append($('<div id="' + dialogID + '"></div>'));\r
- }\r
- \r
- var dialog = $('#' + $.wcfEscapeID(dialogID));\r
- \r
- if (resetDialog) {\r
- dialog.empty();\r
- }\r
- \r
- dialog.addClass('overlayLoading');\r
- \r
- var dialogOptions = arguments[2] || {};\r
- dialog.wcfAJAXDialog(dialogOptions);\r
- },\r
- \r
- /**\r
- * Shows a modal dialog.\r
- * @param string dialogID\r
- */\r
- showDialog: function(dialogID) {\r
- // we cannot work with a non-existant dialog, if you wish to\r
- // load content via AJAX, see showAJAXDialog() instead\r
- if (!$.wcfIsset(dialogID)) return;\r
- \r
- var $dialog = $('#' + $.wcfEscapeID(dialogID));\r
- \r
- var dialogOptions = arguments[2] || {};\r
- $dialog.wcfDialog(dialogOptions);\r
- },\r
- \r
- /**\r
- * Returns a dynamically created id.\r
- * \r
- * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/dom/dom.js#L1789\r
- * @return string\r
- */\r
- getRandomID: function() {\r
- var $elementID = '';\r
- \r
- do {\r
- $elementID = 'wcf' + this._idCounter++;\r
- }\r
- while ($.wcfIsset($elementID));\r
- \r
- return $elementID;\r
- },\r
- \r
- /**\r
- * Wrapper for $.inArray which returns boolean value instead of\r
- * index value, similar to PHP's in_array().\r
- * \r
- * @param mixed needle\r
- * @param array haystack\r
- * @return boolean\r
- */\r
- inArray: function(needle, haystack) {\r
- return ($.inArray(needle, haystack) != -1);\r
- },\r
- \r
- /**\r
- * Adjusts effect for partially supported elements.\r
- * \r
- * @param object object\r
- * @param string effect\r
- * @return string\r
- */\r
- getEffect: function(tagName, effect) {\r
- // most effects are not properly supported on table rows, use highlight instead\r
- if (tagName == 'tr') {\r
- return 'highlight';\r
- }\r
- \r
- return effect;\r
- }\r
-});\r
-\r
-/**\r
- * Provides a simple call for periodical executed functions. Based upon\r
- * ideas by Prototype's PeriodicalExecuter.\r
- * \r
- * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/periodical_executer.js\r
- * @param function callback\r
- * @param integer delay\r
- */\r
-WCF.PeriodicalExecuter = function(callback, delay) { this.init(callback, delay); };\r
-WCF.PeriodicalExecuter.prototype = {\r
- /**\r
- * Initializes a periodical executer.\r
- * \r
- * @param function callback\r
- * @param integer delay\r
- */\r
- init: function(callback, delay) {\r
- this.callback = callback;\r
- this.delay = delay;\r
- this.loop = true;\r
- \r
- this.intervalID = setInterval($.proxy(this._execute, this), this.delay);\r
- },\r
- \r
- /**\r
- * Executes callback.\r
- */\r
- _execute: function() {\r
- this.callback(this);\r
- \r
- if (!this.loop) {\r
- clearInterval(this.intervalID);\r
- }\r
- },\r
- \r
- /**\r
- * Terminates loop.\r
- */\r
- stop: function() {\r
- this.loop = false;\r
- }\r
-};\r
-\r
-/**\r
- * Namespace for AJAXProxies\r
- */\r
-WCF.Action = {};\r
-\r
-/**\r
- * Basic implementation for AJAX-based proxyies\r
- * \r
- * @param object options\r
- */\r
-WCF.Action.Proxy = function(options) { this.init(options); };\r
-WCF.Action.Proxy.prototype = {\r
- /**\r
- * Initializes AJAXProxy.\r
- * \r
- * @param object options\r
- */\r
- init: function(options) {\r
- // initialize default values\r
- this.options = $.extend(true, {\r
- autoSend: false,\r
- data: { },\r
- after: null,\r
- init: null,\r
- failure: null,\r
- success: null,\r
- type: 'POST',\r
- url: 'index.php?action=AJAXProxy&t=' + SECURITY_TOKEN + SID_ARG_2ND\r
- }, options);\r
- \r
- this.confirmationDialog = null;\r
- this.loading = null;\r
- \r
- // send request immediately after initialization\r
- if (this.options.autoSend) {\r
- this.sendRequest();\r
- }\r
- },\r
- \r
- /**\r
- * Sends an AJAX request.\r
- */\r
- sendRequest: function() {\r
- this._init();\r
- \r
- $.ajax({\r
- data: this.options.data,\r
- dataType: 'json',\r
- type: this.options.type,\r
- url: this.options.url,\r
- success: $.proxy(this._success, this),\r
- error: $.proxy(this._failure, this)\r
- });\r
- },\r
- \r
- /**\r
- * Fires before request is send, displays global loading status.\r
- */\r
- _init: function() {\r
- if ($.isFunction(this.options.init)) {\r
- this.options.init();\r
- }\r
- \r
- $('<div id="actionProxyLoading" style="display: none;">Loading …</div>').appendTo($('body'));\r
- this.loading = $('#actionProxyLoading');\r
- this.loading.wcfDropIn();\r
- },\r
- \r
- /**\r
- * Handles AJAX errors.\r
- * \r
- * @param object jqXHR\r
- * @param string textStatus\r
- * @param string errorThrown\r
- */\r
- _failure: function(jqXHR, textStatus, errorThrown) {\r
- try {\r
- var data = $.parseJSON(jqXHR.responseText);\r
- \r
- // call child method if applicable\r
- if ($.isFunction(this.options.failure)) {\r
- this.options.failure(jqXHR, textStatus, errorThrown, data);\r
- }\r
- \r
- var $randomID = WCF.getRandomID();\r
- $('<div id="' + $randomID + '" title="HTTP/1.0 ' + jqXHR.status + ' ' + errorThrown + '"><p>Der Server antwortete: ' + data.message + '.</p></div>').wcfDialog();\r
- }\r
- // failed to parse JSON\r
- catch (e) {\r
- var $randomID = WCF.getRandomID();\r
- $('<div id="' + $randomID + '" title="HTTP/1.0 ' + jqXHR.status + ' ' + errorThrown + '"><p>Der Server antwortete: ' + jqXHR.responseText + '.</p></div>').wcfDialog();\r
- }\r
- \r
- this._after();\r
- },\r
- \r
- /**\r
- * Handles successful AJAX requests.\r
- * \r
- * @param object data\r
- * @param string textStatus\r
- * @param object jqXHR\r
- */\r
- _success: function(data, textStatus, jqXHR) {\r
- // call child method if applicable\r
- if ($.isFunction(this.options.success)) {\r
- this.options.success(data, textStatus, jqXHR);\r
- }\r
- \r
- this._after();\r
- },\r
- \r
- /**\r
- * Fires after an AJAX request, hides global loading status.\r
- */\r
- _after: function() {\r
- if ($.isFunction(this.options.after)) {\r
- this.options.after();\r
- }\r
- \r
- this.loading.wcfDropOut('up');\r
- },\r
- \r
- /**\r
- * Sets options, MUST be used to set parameters before sending request\r
- * if calling from child classes.\r
- * \r
- * @param string optionName\r
- * @param mixed optionData\r
- */\r
- setOption: function(optionName, optionData) {\r
- this.options[optionName] = optionData;\r
- }\r
-};\r
-\r
-/**\r
- * Basic implementation for simple proxy access using bound elements.\r
- * \r
- * @param object options\r
- * @param object callbacks\r
- */\r
-WCF.Action.SimpleProxy = function(options, callbacks) { this.init(options, callbacks); };\r
-WCF.Action.SimpleProxy.prototype = {\r
- /**\r
- * Initializes SimpleProxy.\r
- * \r
- * @param object options\r
- * @param object callbacks\r
- */\r
- init: function(options, callbacks) {\r
- /**\r
- * action-specific options\r
- */\r
- this.options = $.extend(true, {\r
- action: '',\r
- className: '',\r
- elements: null,\r
- eventName: 'click'\r
- }, options);\r
- \r
- /**\r
- * proxy-specific options\r
- */\r
- this.callbacks = $.extend(true, {\r
- after: null,\r
- failure: null,\r
- init: null,\r
- success: null\r
- }, callbacks);\r
- \r
- if (!this.options.elements) return;\r
- \r
- // initialize proxy\r
- this.proxy = new WCF.Action.Proxy(this.callbacks);\r
- \r
- // bind event listener\r
- this.options.elements.each($.proxy(function(index, element) {\r
- $(element).bind(this.options.eventName, $.proxy(this._handleEvent, this));\r
- }, this));\r
- },\r
- \r
- /**\r
- * Handles event actions.\r
- * \r
- * @param object event\r
- */\r
- _handleEvent: function(event) {\r
- this.proxy.setOption('data', {\r
- actionName: this.options.action,\r
- className: this.options.className,\r
- objectIDs: [ $(event.target).data('objectID') ]\r
- });\r
- \r
- this.proxy.sendRequest();\r
- }\r
-};\r
-\r
-/**\r
- * Basic implementation for AJAXProxy-based deletion.\r
- * \r
- * @param string className\r
- * @param jQuery containerList\r
- */\r
-WCF.Action.Delete = function(className, containerList) { this.init(className, containerList); };\r
-WCF.Action.Delete.prototype = {\r
- /**\r
- * Initializes 'delete'-Proxy.\r
- * \r
- * @param string className\r
- * @param jQuery containerList\r
- */\r
- init: function(className, containerList) {\r
- if (!containerList.length) return;\r
- this.containerList = containerList;\r
- this.className = className;\r
- \r
- // initialize proxy\r
- var options = {\r
- success: $.proxy(this._success, this)\r
- };\r
- this.proxy = new WCF.Action.Proxy(options);\r
- \r
- // bind event listener\r
- this.containerList.each($.proxy(function(index, container) {\r
- $(container).find('.deleteButton').bind('click', $.proxy(this._click, this));\r
- }, this));\r
- },\r
- \r
- /**\r
- * Sends AJAX request.\r
- * \r
- * @param object event\r
- */\r
- _click: function(event) {\r
- var $target = $(event.target);\r
- \r
- if ($target.data('confirmMessage')) {\r
- if (confirm($target.data('confirmMessage'))) {\r
- this._sendRequest($target);\r
- }\r
- }\r
- else {\r
- this._sendRequest($target);\r
- }\r
- \r
- },\r
- \r
- _sendRequest: function(object) {\r
- this.proxy.setOption('data', {\r
- actionName: 'delete',\r
- className: this.className,\r
- objectIDs: [ $(object).data('objectID') ]\r
- });\r
- \r
- this.proxy.sendRequest();\r
- },\r
- \r
- /**\r
- * Deletes items from containers.\r
- * \r
- * @param object data\r
- * @param string textStatus\r
- * @param object jqXHR\r
- */\r
- _success: function(data, textStatus, jqXHR) {\r
- // remove items\r
- this.containerList.each(function(index, container) {\r
- var $objectID = $(container).find('.deleteButton').data('objectID');\r
- if (WCF.inArray($objectID, data.objectIDs)) {\r
- $(container).wcfBlindOut('up', function() {\r
- $(container).empty().remove();\r
- }, container);\r
- }\r
- });\r
- }\r
-};\r
-\r
-/**\r
- * Basic implementation for AJAXProxy-based toggle actions.\r
- * \r
- * @param string className\r
- * @param jQuery containerList\r
- */\r
-WCF.Action.Toggle = function(className, containerList) { this.init(className, containerList); };\r
-WCF.Action.Toggle.prototype = {\r
- /**\r
- * Initializes 'toggle'-Proxy\r
- * \r
- * @param string className\r
- * @param jQuery containerList\r
- */\r
- init: function(className, containerList) {\r
- if (!containerList.length) return;\r
- this.containerList = containerList;\r
- this.className = className;\r
- \r
- // initialize proxy\r
- var options = {\r
- success: $.proxy(this._success, this)\r
- };\r
- this.proxy = new WCF.Action.Proxy(options);\r
- \r
- // bind event listener\r
- this.containerList.each($.proxy(function(index, container) {\r
- $(container).find('.toggleButton').bind('click', $.proxy(this._click, this));\r
- }, this));\r
- },\r
- \r
- /**\r
- * Sends AJAX request.\r
- * \r
- * @param object event\r
- */\r
- _click: function(event) {\r
- this.proxy.setOption('data', {\r
- actionName: 'toggle',\r
- className: this.className,\r
- objectIDs: [ $(event.target).data('objectID') ]\r
- });\r
- \r
- this.proxy.sendRequest();\r
- },\r
- \r
- /**\r
- * Toggles status icons.\r
- * \r
- * @param object data\r
- * @param string textStatus\r
- * @param object jqXHR\r
- */\r
- _success: function(data, textStatus, jqXHR) {\r
- // remove items\r
- this.containerList.each(function(index, container) {\r
- var $toggleButton = $(container).find('.toggleButton');\r
- if (WCF.inArray($toggleButton.data('objectID'), data.objectIDs)) {\r
- $(container).wcfHighlight();\r
- \r
- // toggle icon source\r
- $toggleButton.attr('src', function() {\r
- if (this.src.match(/enabled(S|M|L)\.png$/)) {\r
- return this.src.replace(/enabled(S|M|L)\.png$/, 'disabled$1\.png');\r
- }\r
- else {\r
- return this.src.replace(/disabled(S|M|L)\.png$/, 'enabled$1\.png');\r
- }\r
- });\r
- // toogle icon title\r
- $toggleButton.attr('title', function() {\r
- if (this.src.match(/enabled(S|M|L)\.png$/)) {\r
- return $(this).data('disableMessage');\r
- }\r
- else {\r
- return $(this).data('enableMessage');\r
- }\r
- });\r
- }\r
- });\r
- }\r
-};\r
-\r
-/**\r
- * Namespace for date-related functions.\r
- */\r
-WCF.Date = {};\r
-\r
-/**\r
- * Provides utility functions for date operations.\r
- */\r
-WCF.Date.Util = {\r
- /**\r
- * Returns UTC timestamp, if date is not given, current time will be used.\r
- * \r
- * @param Date date\r
- * @return integer\r
- */\r
- gmdate: function(date) {\r
- var $date = (date) ? date : new Date();\r
- \r
- return Math.round(Date.UTC(\r
- $date.getUTCFullYear(),\r
- $date.getUTCMonth(),\r
- $date.getUTCDay(),\r
- $date.getUTCHours(),\r
- $date.getUTCMinutes(),\r
- $date.getUTCSeconds()\r
- ) / 1000);\r
- },\r
- \r
- /**\r
- * Returns a Date object with precise offset (including timezone and local timezone).\r
- * Parameter timestamp must be in miliseconds!\r
- * \r
- * @param integer timestamp\r
- * @param integer offset\r
- * @return Date\r
- */\r
- getTimezoneDate: function(timestamp, offset) {\r
- var $date = new Date(timestamp);\r
- var $localOffset = $date.getTimezoneOffset() * -1 * 60000;\r
- \r
- return new Date((timestamp - $localOffset - offset));\r
- }\r
-};\r
-\r
-/**\r
- * Handles relative time designations.\r
- */\r
-WCF.Date.Time = function() { this.init(); };\r
-WCF.Date.Time.prototype = {\r
- /**\r
- * Initializes relative datetimes.\r
- */\r
- init: function() {\r
- // initialize variables\r
- this.elements = $('time.datetime');\r
- this.timestamp = 0;\r
- \r
- // calculate relative datetime on init\r
- this._refresh();\r
- \r
- // re-calculate relative datetime every minute\r
- new WCF.PeriodicalExecuter($.proxy(this._refresh, this), 60000);\r
- },\r
- \r
- /**\r
- * Refreshes relative datetime for each element.\r
- */\r
- _refresh: function() {\r
- // TESTING ONLY!\r
- var $date = new Date();\r
- this.timestamp = ($date.getTime() - $date.getMilliseconds()) / 1000;\r
- // TESTING ONLY!\r
- \r
- this.elements.each($.proxy(this._refreshElement, this));\r
- },\r
- \r
- /**\r
- * Refreshes relative datetime for current element.\r
- * \r
- * @param integer index\r
- * @param object element\r
- */\r
- _refreshElement: function(index, element) {\r
- if (!$(element).attr('title')) {\r
- $(element).attr('title', $(element).text());\r
- }\r
- \r
- var $timestamp = $(element).data('timestamp');\r
- var $date = $(element).data('date');\r
- var $time = $(element).data('time');\r
- var $offset = $(element).data('offset');\r
- \r
- // timestamp is less than 60 minutes ago (display 1 hour ago rather than 60 minutes ago)\r
- if (this.timestamp < ($timestamp + 3540)) {\r
- var $minutes = Math.round((this.timestamp - $timestamp) / 60);\r
- $(element).text(eval(WCF.Language.get('wcf.global.date.relative.minutes')));\r
- }\r
- // timestamp is less than 24 hours ago\r
- else if (this.timestamp < ($timestamp + 86400)) {\r
- var $hours = Math.round((this.timestamp - $timestamp) / 3600);\r
- $(element).text(eval(WCF.Language.get('wcf.global.date.relative.hours')));\r
- }\r
- // timestamp is less than a week ago\r
- else if (this.timestamp < ($timestamp + 604800)) {\r
- var $days = Math.round((this.timestamp - $timestamp) / 86400);\r
- var $string = eval(WCF.Language.get('wcf.global.date.relative.pastDays'));\r
- \r
- // get day of week\r
- var $dateObj = WCF.Date.Util.getTimezoneDate(($timestamp * 1000), $offset);\r
- var $dow = $dateObj.getDay();\r
- \r
- $(element).text($string.replace(/\%day\%/, WCF.Language.get('__days')[$dow]).replace(/\%time\%/, $time));\r
- }\r
- // timestamp is between ~700 million years BC and last week\r
- else {\r
- var $string = WCF.Language.get('wcf.global.date.dateTimeFormat');\r
- $(element).text($string.replace(/\%date\%/, $date).replace(/\%time\%/, $time));\r
- }\r
- }\r
-};\r
-\r
-/**\r
- * Hash-like dictionary. Based upon idead from Prototype's hash\r
- * \r
- * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/hash.js\r
- */\r
-WCF.Dictionary = function() { this.init(); };\r
-WCF.Dictionary.prototype = {\r
- /**\r
- * Initializes a new dictionary.\r
- */\r
- init: function() {\r
- this.variables = { };\r
- },\r
- \r
- /**\r
- * Adds an entry.\r
- * \r
- * @param string key\r
- * @param mixed value\r
- */\r
- add: function(key, value) {\r
- this.variables[key] = value;\r
- },\r
- \r
- /**\r
- * Adds a traditional object to current dataset.\r
- * \r
- * @param object object\r
- */\r
- addObject: function(object) {\r
- for (var $key in object) {\r
- this.add($key, object[$key]);\r
- }\r
- },\r
- \r
- /**\r
- * Adds a dictionary to current dataset.\r
- * \r
- * @param object dictionary\r
- */\r
- addDictionary: function(dictionary) {\r
- dictionary.each($.proxy(function(pair) {\r
- this.add(pair.key, pair.value);\r
- }, this));\r
- },\r
- \r
- /**\r
- * Retrieves the value of an entry or returns null if key is not found.\r
- * \r
- * @param string key\r
- * @returns mixed\r
- */\r
- get: function(key) {\r
- if (this.isset(key)) {\r
- return this.variables[key];\r
- }\r
- \r
- return null;\r
- },\r
- \r
- /**\r
- * Returns true if given key is a valid entry.\r
- * \r
- * @param string key\r
- */\r
- isset: function(key) {\r
- return this.variables.hasOwnProperty(key);\r
- },\r
- \r
- /**\r
- * Removes an entry.\r
- * \r
- * @param string key\r
- */\r
- remove: function(key) {\r
- delete this.variables[key];\r
- },\r
- \r
- /**\r
- * Iterates through dictionary.\r
- * \r
- * Usage:\r
- * var $hash = new WCF.Dictionary();\r
- * $hash.add('foo', 'bar');\r
- * $hash.each(function(pair) {\r
- * // alerts: foo = bar\r
- * alert(pair.key + ' = ' + pair.value);\r
- * });\r
- * \r
- * @param function callback\r
- */\r
- each: function(callback) {\r
- if (!$.isFunction(callback)) {\r
- return;\r
- }\r
- \r
- for (var $key in this.variables) {\r
- var $value = this.variables[$key];\r
- var $pair = {\r
- key: $key,\r
- value: $value\r
- };\r
- \r
- callback($pair);\r
- }\r
- }\r
-};\r
-\r
-/**\r
- * Global language storage.\r
- * \r
- * @see WCF.Dictionary\r
- */\r
-WCF.Language = {\r
- _variables: new WCF.Dictionary(),\r
- \r
- /**\r
- * @see WCF.Dictionary.addObject()\r
- */\r
- add: function(key, value) {\r
- this._variables.add(key, value);\r
- },\r
- \r
- /**\r
- * @see WCF.Dictionary.addObject()\r
- */\r
- addObject: function(object) {\r
- this._variables.addObject(object);\r
- },\r
- \r
- /**\r
- * Retrieves a variable.\r
- * \r
- * @param string key\r
- * @return mixed\r
- */\r
- get: function(key) {\r
- return this._variables.get(key);\r
- }\r
-};\r
-\r
-/**\r
- * String utilities.\r
- */\r
-WCF.String = {\r
- /**\r
- * Escapes special HTML-characters within a string\r
- * \r
- * @param string string\r
- * @return string\r
- */\r
- escapeHTML: function (string) {\r
- return string.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');\r
- },\r
- \r
- /**\r
- * Escapes a String to work with RegExp.\r
- *\r
- * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/regexp.js#L25\r
- * @param string string\r
- * @return string\r
- */\r
- escapeRegExp: function(string) {\r
- return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');\r
- },\r
- \r
- /**\r
- * Makes a string's first character uppercase\r
- * \r
- * @param string string\r
- * @return string\r
- */\r
- ucfirst: function(string) {\r
- return string.substring(0, 1).toUpperCase() + string.substring(1);\r
- },\r
- \r
- /**\r
- * Adds thousands separators to a given number.\r
- * \r
- * @param mixed number\r
- * @return string\r
- */\r
- addThousandsSeparator: function(number) {\r
- var $numberString = String(number);\r
- if (number >= 1000 || number <= -1000) {\r
- var $negative = false;\r
- if (number <= -1000) {\r
- $negative = true;\r
- $numberString = $numberString.substring(1);\r
- }\r
- var $separator = WCF.Language.get('wcf.global.thousandsSeparator');\r
- \r
- if ($separator != null && $separator != '') {\r
- var $numElements = new Array();\r
- var $firstPart = $numberString.length % 3\r
- if ($firstPart == 0) $firstPart = 3;\r
- for (var $i = 0; $i < Math.ceil($numberString.length / 3); $i++) {\r
- if ($i == 0) $numElements.push($numberString.substring(0, $firstPart));\r
- else {\r
- var $start = (($i - 1) * 3) + $firstPart\r
- $numElements.push($numberString.substring($start, $start + 3));\r
- }\r
- }\r
- $numberString = (($negative) ? ('-') : ('')) + $numElements.join($separator);\r
- }\r
- }\r
- \r
- return $numberString;\r
- }\r
-};\r
-\r
-/**\r
- * Basic implementation for WCF TabMenus. Use the data attributes 'active' to specify the\r
- * tab which should be shown on init. Furthermore you may specify a 'store' data-attribute\r
- * which will be filled with the currently selected tab.\r
- */\r
-WCF.TabMenu = {\r
- /**\r
- * Initializes all TabMenus\r
- */\r
- init: function() {\r
- $('.tabMenuContainer').each(function(index, tabMenu) {\r
- if (!$(tabMenu).attr('id')) {\r
- var $randomID = WCF.getRandomID();\r
- $(tabMenu).attr('id', $randomID);\r
- }\r
- \r
- // init jQuery UI TabMenu\r
- $(tabMenu).wcfTabs({\r
- select: function(event, ui) {\r
- var $panel = $(ui.panel);\r
- var $container = $panel.closest('.tabMenuContainer');\r
- \r
- // store currently selected item\r
- if ($container.data('store')) {\r
- if ($.wcfIsset($container.data('store'))) {\r
- $('#' + $container.data('store')).attr('value', $panel.attr('id'));\r
- }\r
- }\r
- }\r
- });\r
- \r
- // display active item on init\r
- if ($(tabMenu).data('active')) {\r
- $(tabMenu).find('.tabMenuContent').each(function(index, tabMenuItem) {\r
- if ($(tabMenuItem).attr('id') == $(tabMenu).data('active')) {\r
- $(tabMenu).wcfTabs('select', index);\r
- }\r
- });\r
- }\r
- });\r
- }\r
-};\r
-\r
-/**\r
- * Templates that may be fetched more than once with different variables. Based upon ideas from Prototype's template\r
- * \r
- * Usage:\r
- * var myTemplate = new WCF.Template('{$hello} World');\r
- * myTemplate.fetch({ hello: 'Hi' }); // Hi World\r
- * myTemplate.fetch({ hello: 'Hello' }); // Hello World\r
- * \r
- * my2ndTemplate = new WCF.Template('{@$html}{$html}');\r
- * my2ndTemplate.fetch({ html: '<b>Test</b>' }); // <b>Test</b><b>Test</b>\r
- * \r
- * var my3rdTemplate = new WCF.Template('You can use {literal}{$variable}{/literal}-Tags here');\r
- * my3rdTemplate.fetch({ variable: 'Not shown' }); // You can use {$variable}-Tags here\r
- * \r
- * \r
- * @param template template-content\r
- * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/template.js\r
- */\r
-WCF.Template = function(template) { this.init(template); };\r
-WCF.Template.prototype = {\r
- /**\r
- * Template-content\r
- * \r
- * @var string\r
- */\r
- _template: '',\r
- \r
- /**\r
- * Saved literal-tags\r
- * \r
- * @var WCF.Dictionary\r
- */\r
- _literals: new WCF.Dictionary(),\r
- \r
- /**\r
- * Prepares template\r
- * \r
- * @param $template template-content\r
- */\r
- init: function($template) {\r
- this._template = $template;\r
- \r
- // save literal-tags\r
- this._template = this._template.replace(/\{literal\}(.*?)\{\/literal\}/g, $.proxy(function ($match) {\r
- // hopefully no one uses this string in one of his templates\r
- var id = '@@@@@@@@@@@'+Math.random()+'@@@@@@@@@@@';\r
- this._literals.add(id, $match.replace(/\{\/?literal\}/g, ''));\r
- \r
- return id;\r
- }, this));\r
- },\r
- \r
- /**\r
- * Fetches the template with the given variables\r
- *\r
- * @param $variables variables to insert\r
- * @return parsed template\r
- */\r
- fetch: function($variables) {\r
- var $result = this._template;\r
- \r
- // insert them :)\r
- for (var $key in $variables) {\r
- $result = $result.replace(new RegExp(WCF.String.escapeRegExp('{$'+$key+'}'), 'g'), WCF.String.escapeHTML($variables[$key]));\r
- $result = $result.replace(new RegExp(WCF.String.escapeRegExp('{@$'+$key+'}'), 'g'), $variables[$key]);\r
- }\r
- \r
- // insert delimiter tags\r
- $result = $result.replace('{ldelim}', '{').replace('{rdelim}', '}');\r
- \r
- // and re-insert saved literals\r
- return this.insertLiterals($result);\r
- },\r
- \r
- /**\r
- * Inserts literals into given string\r
- * \r
- * @param $template string to insert into\r
- * @return string with inserted literals\r
- */\r
- insertLiterals: function ($template) {\r
- this._literals.each(function ($pair) {\r
- $template = $template.replace($pair.key, $pair.value);\r
- });\r
- \r
- return $template;\r
- },\r
- \r
- /**\r
- * Compiles this template into javascript-code\r
- * \r
- * @return WCF.Template.Compiled\r
- */\r
- compile: function () {\r
- var $compiled = this._template;\r
- \r
- // escape \ and '\r
- $compiled = $compiled.replace('\\', '\\\\').replace("'", "\\'");\r
- \r
- // parse our variable-tags\r
- $compiled = $compiled.replace(/\{\$(.*?)\}/g, function ($match) {\r
- var $name = '$v.' + $match.substring(2, $match.length - 1);\r
- // trinary operator to maintain compatibility with uncompiled template\r
- // ($name) ? $name : '$match'\r
- // -> $v.muh ? $v.muh : '{$muh}'\r
- return "' + WCF.String.escapeHTML("+ $name + " ? " + $name + " : '" + $match + "') + '";\r
- }).replace(/\{@\$(.*?)\}/g, function ($match) {\r
- var $name = '$v.' + $match.substring(3, $match.length - 1);\r
- // trinary operator to maintain compatibility with uncompiled template\r
- // ($name) ? $name : '$match'\r
- // -> $v.muh ? $v.muh : '{$muh}'\r
- return "' + ("+ $name + " ? " + $name + " : '" + $match + "') + '";\r
- });\r
- \r
- // insert delimiter tags\r
- $compiled = $compiled.replace('{ldelim}', '{').replace('{rdelim}', '}');\r
- \r
- // and re-insert saved literals\r
- return new WCF.Template.Compiled("'" + this.insertLiterals($compiled) + "';");\r
- }\r
-};\r
-\r
-/**\r
- * Represents a compiled template\r
- * \r
- * @param compiled compiled template\r
- */\r
-WCF.Template.Compiled = function(compiled) { this.init(compiled); };\r
-WCF.Template.Compiled.prototype = {\r
- /**\r
- * Compiled template\r
- * \r
- * @var string\r
- */\r
- _compiled: '',\r
- \r
- /**\r
- * Initializes our compiled template\r
- * \r
- * @param $compiled compiled template\r
- */\r
- init: function($compiled) {\r
- this._compiled = $compiled;\r
- },\r
- \r
- /**\r
- * @see WCF.Template.fetch\r
- */\r
- fetch: function($v) {\r
- return eval(this._compiled);\r
- }\r
-};\r
-\r
-/**\r
- * Toggles options.\r
- * \r
- * @param string element\r
- * @param array showItems\r
- * @param array hideItems\r
- */\r
-WCF.ToggleOptions = function(element, showItems, hideItems) { this.init(element, showItems, hideItems); };\r
-WCF.ToggleOptions.prototype = {\r
- /**\r
- * target item\r
- * \r
- * @var jQuery\r
- */\r
- _element: null,\r
- \r
- /**\r
- * list of items to be shown\r
- * \r
- * @var array\r
- */\r
- _showItems: [],\r
- \r
- /**\r
- * list of items to be hidden\r
- * \r
- * @var array\r
- */\r
- _hideItems: [],\r
- \r
- /**\r
- * Initializes option toggle.\r
- * \r
- * @param string element\r
- * @param array showItems\r
- * @param array hideItems\r
- */\r
- init: function(element, showItems, hideItems) {\r
- this._element = $('#' + element);\r
- this._showItems = showItems;\r
- this._hideItems = hideItems;\r
- \r
- // bind event\r
- this._element.click($.proxy(this._toggle, this));\r
- \r
- // execute toggle on init\r
- this._toggle();\r
- },\r
- \r
- /**\r
- * Toggles items.\r
- */\r
- _toggle: function() {\r
- if (!this._element.attr('checked')) return;\r
- \r
- for (var $i = 0, $length = this._showItems.length; $i < $length; $i++) {\r
- var $item = this._showItems[$i];\r
- \r
- $('#' + $item).show();\r
- }\r
- \r
- for (var $i = 0, $length = this._hideItems.length; $i < $length; $i++) {\r
- var $item = this._hideItems[$i];\r
- \r
- $('#' + $item).hide();\r
- }\r
- }\r
-};\r
-\r
-/**\r
- * Basic implementation for WCF dialogs.\r
- */\r
-$.widget('ui.wcfDialog', $.ui.dialog, {\r
- _init: function() {\r
- this.options.autoOpen = true;\r
- this.options.close = function(event, ui) {\r
- $(this).parent('.ui-dialog').wcfDropOut('down', $.proxy(function() {\r
- $(this).parent('.ui-dialog').empty().remove();\r
- }, this));\r
- };\r
- this.options.height = 'auto';\r
- this.options.minHeight = 0;\r
- this.options.modal = true;\r
- this.options.width = 'auto';\r
- \r
- $.ui.dialog.prototype._init.apply(this, arguments);\r
- }\r
-});\r
-\r
-/**\r
- * Basic implementation for WCF dialogs loading content\r
- * via AJAX before calling dialog itself.\r
- */\r
-$.widget('ui.wcfAJAXDialog', $.ui.dialog, {\r
- /**\r
- * Indicates wether callback was already executed\r
- * \r
- * @var boolean\r
- */\r
- _callbackExecuted: false,\r
- \r
- /**\r
- * Initializes AJAX-request to fetch content.\r
- */\r
- _init: function() {\r
- if (this.options.ajax) {\r
- this._loadContent();\r
- }\r
- \r
- // force dialog to be placed centered\r
- this.options.position = {\r
- my: 'center center',\r
- at: 'center center'\r
- };\r
- \r
- // dialog should display a spinner-like image, thus immediately fire up dialog\r
- this.options.autoOpen = true;\r
- this.options.width = 'auto';\r
- this.options.minHeight = 80;\r
- \r
- // disable ability to move dialog\r
- this.options.resizable = false;\r
- this.options.draggable = false;\r
- \r
- this.options.modal = true;\r
- this.options.hide = {\r
- effect: 'drop',\r
- direction: 'down'\r
- };\r
- \r
- this.options.close = function(event, ui) {\r
- // loading ajax content seems to block properly closing\r
- $(this).parent('.ui-dialog').empty().remove();\r
- };\r
- \r
- if (this.options.preventClose) {\r
- this.options.closeOnEscape = false;\r
- }\r
- \r
- $.ui.dialog.prototype._init.apply(this, arguments);\r
- \r
- // remove complete node instead of removing node-by-node\r
- if (this.options.hideTitle && this.options.preventClose) {\r
- this.element.parent('.ui-dialog').find('div.ui-dialog-titlebar').empty().remove();\r
- }\r
- else {\r
- if (this.options.hideTitle) {\r
- // remove title element\r
- $('#ui-dialog-title-' + this.element.attr('id')).empty().remove();\r
- }\r
- \r
- if (this.options.preventClose) {\r
- // remove close-button\r
- this.element.parent('.ui-dialog').find('a.ui-dialog-titlebar-close').empty().remove();\r
- }\r
- }\r
- },\r
- \r
- /**\r
- * Loads content via AJAX.\r
- * \r
- * @todo Enforce JSON\r
- */\r
- _loadContent: function() {\r
- var $type = 'GET';\r
- if (this.options.ajax.type) {\r
- $type = this.options.ajax.type;\r
- \r
- if (this.options.ajax.type != 'GET' && this.options.ajax.type != 'POST') {\r
- $type = 'GET';\r
- }\r
- }\r
- \r
- var $data = this.options.ajax.data || {};\r
- \r
- $.ajax({\r
- url: this.options.ajax.url,\r
- context: this,\r
- dataType: 'json',\r
- type: $type,\r
- data: $data,\r
- success: $.proxy(this._createDialog, this),\r
- error: function(transport) {\r
- alert(transport.responseText);\r
- }\r
- });\r
- },\r
- \r
- /**\r
- * Inserts content.\r
- * \r
- * @param string data\r
- */\r
- _createDialog: function(data) {\r
- data.ignoreTemplate = true;\r
- this.element.data('responseData', data);\r
- \r
- this.element.wcfGrow({\r
- content: data.template,\r
- parent: this.element.parent('.ui-dialog')\r
- }, {\r
- duration: 600,\r
- complete: $.proxy(function(data) {\r
- this.element.css({\r
- height: 'auto'\r
- });\r
- \r
- // prevent double execution due to two complete-calls (two times animate)\r
- if (this._callbackExecuted) {\r
- return;\r
- }\r
- \r
- this._callbackExecuted = true;\r
- \r
- this.element.removeClass('overlayLoading');\r
- this.element.html(this.element.data('responseData').template);\r
- \r
- if (this.options.ajax.success) {\r
- this.options.ajax.success();\r
- }\r
- }, this)\r
- });\r
- },\r
- \r
- /**\r
- * Redraws dialog, should be executed everytime content is changed.\r
- */\r
- redraw: function() {\r
- var $dimensions = this.element.getDimensions();\r
- \r
- if ($dimensions.height > 200) {\r
- this.element.wcfGrow({\r
- content: this.element.html(),\r
- parent: this.element.parent('.ui-dialog')\r
- }, {\r
- duration: 600,\r
- complete: function() {\r
- $(this).css({ height: 'auto' });\r
- }\r
- });\r
- }\r
- }\r
-});\r
-\r
-/**\r
- * Workaround for ids containing a dot ".", until jQuery UI devs learn\r
- * to properly escape ids ... (it took 18 months until they finally\r
- * fixed it!)\r
- * \r
- * @see http://bugs.jqueryui.com/ticket/4681\r
- */\r
-$.widget('ui.wcfTabs', $.ui.tabs, {\r
- _init: function() {\r
- $.ui.dialog.prototype._init.apply(this, arguments);\r
- },\r
- \r
- _sanitizeSelector: function(hash) {\r
- return hash.replace(/([:\.])/g, '\\$1');\r
- }\r
-});\r
-\r
-/**\r
- * jQuery widget implementation of the wcf pagination.\r
- */\r
-$.widget('ui.wcfPages', {\r
- SHOW_LINKS: 11,\r
- SHOW_SUB_LINKS: 20,\r
- \r
- options: {\r
- // vars\r
- activePage: 1,\r
- maxPage: 1,\r
- \r
- // icons\r
- previousIcon: RELATIVE_WCF_DIR + 'icon/previousS.png',\r
- previousDisabledIcon: RELATIVE_WCF_DIR + 'icon/previousDisabledS.png',\r
- arrowDownIcon: RELATIVE_WCF_DIR + 'icon/arrowDown.png',\r
- nextIcon: RELATIVE_WCF_DIR + 'icon/nextS.png',\r
- nextDisabledIcon: RELATIVE_WCF_DIR + 'icon/nextDisabledS.png',\r
- \r
- // language\r
- // we use options here instead of language variables, because the paginator is not only usable with pages\r
- nextPage: null,\r
- previousPage: null,\r
- },\r
- \r
- /**\r
- * Creates the pages widget.\r
- */\r
- _create: function() {\r
- if (this.options.nextPage === null) this.options.nextPage = WCF.Language.get('wcf.global.page.next');\r
- if (this.options.previousPage === null) this.options.previousPage = WCF.Language.get('wcf.global.page.previous');\r
- \r
- this.element.addClass('pageNavigation');\r
- \r
- this._render();\r
- },\r
- \r
- /**\r
- * Destroys the pages widget.\r
- */\r
- destroy: function() {\r
- $.Widget.prototype.destroy.apply(this, arguments);\r
- \r
- this.element.children().remove();\r
- },\r
- \r
- /**\r
- * Renders th pages widget.\r
- */\r
- _render: function() {\r
- // only render if we have more than 1 page\r
- if (!this.options.disabled && this.options.maxPage > 1) {\r
- // make sure pagination is visible\r
- if (this.element.hasClass('hidden')) {\r
- this.element.removeClass('hidden');\r
- }\r
- this.element.show();\r
- \r
- this.element.children().remove();\r
- \r
- var $pageList = $('<ul></ul>');\r
- this.element.append($pageList);\r
- \r
- var $previousElement = $('<li></li>');\r
- $pageList.append($previousElement);\r
- \r
- if (this.options.activePage > 1) {\r
- var $previousLink = $('<a' + ((this.options.previousPage != null) ? (' title="' + this.options.previousPage + '"') : ('')) + '></a>');\r
- $previousElement.append($previousLink);\r
- this._bindSwitchPage($previousLink, this.options.activePage - 1);\r
- \r
- var $previousImage = $('<img src="' + this.options.previousIcon + '" alt="" />');\r
- $previousLink.append($previousImage);\r
- }\r
- else {\r
- var $previousImage = $('<img src="' + this.options.previousDisabledIcon + '" alt="" />');\r
- $previousElement.append($previousImage);\r
- }\r
- $previousElement.addClass('skip');\r
- \r
- // add first page\r
- $pageList.append(this._renderLink(1));\r
- \r
- // calculate page links\r
- var $maxLinks = this.SHOW_LINKS - 4;\r
- var $linksBefore = this.options.activePage - 2;\r
- if ($linksBefore < 0) $linksBefore = 0;\r
- var $linksAfter = this.options.maxPage - (this.options.activePage + 1);\r
- if ($linksAfter < 0) $linksAfter = 0;\r
- if (this.options.activePage > 1 && this.options.activePage < this.options.maxPage) $maxLinks--;\r
- \r
- var $half = $maxLinks / 2;\r
- var $left = this.options.activePage;\r
- var $right = this.options.activePage;\r
- if ($left < 1) $left = 1;\r
- if ($right < 1) $right = 1;\r
- if ($right > this.options.maxPage - 1) $right = this.options.maxPage - 1;\r
- \r
- if ($linksBefore >= $half) {\r
- $left -= $half;\r
- }\r
- else {\r
- $left -= $linksBefore;\r
- $right += $half - $linksBefore;\r
- }\r
- \r
- if ($linksAfter >= $half) {\r
- $right += $half;\r
- }\r
- else {\r
- $right += $linksAfter;\r
- $left -= $half - $linksAfter;\r
- }\r
- \r
- $right = Math.ceil($right);\r
- $left = Math.ceil($left);\r
- if ($left < 1) $left = 1;\r
- if ($right > this.options.maxPage) $right = this.options.maxPage;\r
- \r
- // left ... links\r
- if ($left > 1) {\r
- if ($left - 1 < 2) {\r
- $pageList.append(this._renderLink(2));\r
- }\r
- else {\r
- var $leftChildren = $('<li class="children"></li>');\r
- $pageList.append($leftChildren);\r
- \r
- var $leftChildrenLink = $('<a>…</a>');\r
- $leftChildren.append($leftChildrenLink);\r
- $leftChildrenLink.click($.proxy(this._startInput, this));\r
- \r
- var $leftChildrenImage = $('<img src="' + this.options.arrowDownIcon + '" alt="" />');\r
- $leftChildrenLink.append($leftChildrenImage);\r
- \r
- var $leftChildrenInput = $('<input type="text" class="inputText" name="pageNo" />');\r
- $leftChildren.append($leftChildrenInput);\r
- $leftChildrenInput.keydown($.proxy(this._handleInput, this));\r
- $leftChildrenInput.keyup($.proxy(this._handleInput, this));\r
- $leftChildrenInput.blur($.proxy(this._stopInput, this));\r
- \r
- var $leftChildrenContainer = $('<div></div>');\r
- $leftChildren.append($leftChildrenContainer);\r
- \r
- var $leftChildrenList = $('<ul></u>');\r
- $leftChildrenContainer.append($leftChildrenList);\r
- \r
- // render sublinks\r
- var $k = 0;\r
- var $step = Math.ceil(($left - 2) / this.SHOW_SUB_LINKS);\r
- for (var $i = 2; $i <= $left; $i += $step) {\r
- $leftChildrenList.append(this._renderLink($i, ($k != 0 && $k % 4 == 0)));\r
- $k++;\r
- }\r
- }\r
- }\r
- \r
- // visible links\r
- for (var $i = $left + 1; $i < $right; $i++) {\r
- $pageList.append(this._renderLink($i));\r
- }\r
- \r
- // right ... links\r
- if ($right < this.options.maxPage) {\r
- if (this.options.maxPage - $right < 2) {\r
- $pageList.append(this._renderLink(this.options.maxPage - 1));\r
- }\r
- else {\r
- var $rightChildren = $('<li class="children"></li>');\r
- $pageList.append($rightChildren);\r
- \r
- var $rightChildrenLink = $('<a>…</a>');\r
- $rightChildren.append($rightChildrenLink);\r
- $rightChildrenLink.click($.proxy(this._startInput, this));\r
- \r
- var $rightChildrenImage = $('<img src="' + this.options.arrowDownIcon + '" alt="" />');\r
- $rightChildrenLink.append($rightChildrenImage);\r
- \r
- var $rightChildrenInput = $('<input type="text" class="inputText" name="pageNo" />');\r
- $rightChildren.append($rightChildrenInput);\r
- $rightChildrenInput.keydown($.proxy(this._handleInput, this));\r
- $rightChildrenInput.keyup($.proxy(this._handleInput, this));\r
- $rightChildrenInput.blur($.proxy(this._stopInput, this));\r
- \r
- var $rightChildrenContainer = $('<div></div>');\r
- $rightChildren.append($rightChildrenContainer);\r
- \r
- var $rightChildrenList = $('<ul></ul>');\r
- $rightChildrenContainer.append($rightChildrenList);\r
- \r
- // render sublinks\r
- var $k = 0;\r
- var $step = Math.ceil((this.options.maxPage - $right) / this.SHOW_SUB_LINKS);\r
- for (var $i = $right; $i < this.options.maxPage; $i += $step) {\r
- $rightChildrenList.append(this._renderLink($i, ($k != 0 && $k % 4 == 0)));\r
- $k++;\r
- }\r
- }\r
- }\r
- \r
- // add last page\r
- $pageList.append(this._renderLink(this.options.maxPage));\r
- \r
- // add next button\r
- var $nextElement = $('<li></li>');\r
- $pageList.append($nextElement);\r
- \r
- if (this.options.activePage < this.options.maxPage) {\r
- var $nextLink = $('<a title="' + ((this.options.nextPage != null) ? (' title="' + this.options.nextPage + '"') : ('')) + '"></a>');\r
- $nextElement.append($nextLink);\r
- this._bindSwitchPage($nextLink, this.options.activePage + 1);\r
- \r
- var $nextImage = $('<img src="' + this.options.nextIcon + '" alt="" />');\r
- $nextLink.append($nextImage);\r
- }\r
- else {\r
- var $nextImage = $('<img src="' + this.options.nextDisabledIcon + '" alt="" />');\r
- $nextElement.append($nextImage);\r
- }\r
- $nextElement.addClass('skip');\r
- }\r
- else {\r
- // otherwise hide the paginator if not already hidden\r
- this.element.hide();\r
- }\r
- },\r
- \r
- /**\r
- * Renders a page link\r
- * \r
- * @parameter integer page\r
- * \r
- * @return $(element)\r
- */\r
- _renderLink: function(page, lineBreak) {\r
- var $pageElement = $('<li></li>');\r
- if (lineBreak != undefined && lineBreak) {\r
- $pageElement.addClass('break');\r
- }\r
- if (page != this.options.activePage) {\r
- var $pageLink = $('<a>' + WCF.String.addThousandsSeparator(page) + '</a>'); \r
- $pageElement.append($pageLink);\r
- this._bindSwitchPage($pageLink, page);\r
- }\r
- else {\r
- $pageElement.addClass('active');\r
- var $pageSubElement = $('<span>' + WCF.String.addThousandsSeparator(page) + '</span>');\r
- $pageElement.append($pageSubElement);\r
- }\r
- \r
- return $pageElement;\r
- },\r
- \r
- /**\r
- * Binds the 'click'-event for the page switching to the given element.\r
- * \r
- * @parameter $(element) element\r
- * @paremeter integer page\r
- */\r
- _bindSwitchPage: function(element, page) {\r
- var $self = this;\r
- element.click(function() {\r
- $self.switchPage(page);\r
- });\r
- },\r
- \r
- /**\r
- * Switches to the given page\r
- * \r
- * @parameter Event event\r
- * @parameter integer page\r
- */\r
- switchPage: function(page) {\r
- this._setOption('activePage', page);\r
- },\r
- \r
- /**\r
- * Sets the given option to the given value.\r
- * See the jQuery UI widget documentation for more.\r
- */\r
- _setOption: function(key, value) {\r
- if (key == 'activePage') {\r
- if (value != this.options[key] && value > 0 && value <= this.options.maxPage) {\r
- // you can prevent the page switching by returning false or by event.preventDefault()\r
- // in a shouldSwitch-callback. e.g. if an AJAX request is already running.\r
- var $result = this._trigger('shouldSwitch', undefined, {\r
- nextPage: value,\r
- });\r
- \r
- if ($result) {\r
- this.options[key] = value;\r
- this._render();\r
- this._trigger('switched', undefined, {\r
- activePage: value,\r
- });\r
- }\r
- else {\r
- this._trigger('notSwitched', undefined, {\r
- activePage: value,\r
- });\r
- }\r
- }\r
- }\r
- else {\r
- this.options[key] = value;\r
- \r
- if (key == 'disabled') {\r
- if (value) {\r
- this.element.children().remove();\r
- }\r
- else {\r
- this._render()\r
- }\r
- }\r
- else if (key == 'maxPage') {\r
- this._render();\r
- }\r
- }\r
- \r
- return this;\r
- },\r
- \r
- /**\r
- * Start input of pagenumber\r
- * \r
- * @parameter Event event\r
- */\r
- _startInput: function(event) {\r
- // hide a-tag\r
- var $childLink = $(event.currentTarget);\r
- if (!$childLink.is('a')) $childLink = $childLink.parent('a');\r
- \r
- $childLink.hide();\r
- \r
- // show input-tag\r
- var $childInput = $childLink.parent('li').children('input')\r
- .css('display', 'block')\r
- .val('');\r
- \r
- $childInput.focus();\r
- },\r
- \r
- /**\r
- * Stops input of pagenumber\r
- * \r
- * @parameter Event event\r
- */\r
- _stopInput: function(event) {\r
- // hide input-tag\r
- var $childInput = $(event.currentTarget);\r
- $childInput.css('display', 'none');\r
- \r
- // show a-tag\r
- var $childContainer = $childInput.parent('li')\r
- if ($childContainer != undefined && $childContainer != null) {\r
- $childContainer.children('a').show();\r
- }\r
- },\r
- \r
- /**\r
- * Handles input of pagenumber\r
- * \r
- * @parameter Event event\r
- */\r
- _handleInput: function(event) {\r
- var $ie7 = ($.browser.msie && $.browser.version == '7.0');\r
- if (event.type != 'keyup' || $ie7) {\r
- if (!$ie7 || ((event.which == 13 || event.which == 27) && event.type == 'keyup')) {\r
- if (event.which == 13) {\r
- this.switchPage(parseInt($(event.currentTarget).val()));\r
- }\r
- \r
- if (event.which == 13 || event.which == 27) {\r
- this._stopInput(event);\r
- event.stopPropagation();\r
- }\r
- }\r
- }\r
- }\r
-});\r
-\r
-/**\r
- * Encapsulate eval() within an own function to prevent problems\r
- * with optimizing and minifiny JS.\r
- * \r
- * @param mixed expression\r
- * @returns mixed\r
- */\r
-function wcfEval(expression) {\r
- return eval(expression);\r
-}\r
+/**
+ * Class and function collection for WCF
+ *
+ * @author Tim Düsterhus, Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+
+/**
+ * Initialize WCF namespace
+ */
+var WCF = {};
+
+/**
+ * Extends jQuery with additional methods.
+ */
+$.extend(true, {
+ /**
+ * Escapes an ID to work with jQuery selectors.
+ *
+ * @see http://docs.jquery.com/Frequently_Asked_Questions#How_do_I_select_an_element_by_an_ID_that_has_characters_used_in_CSS_notation.3F
+ * @param string id
+ * @return string
+ */
+ wcfEscapeID: function(id) {
+ return id.replace(/(:|\.)/g, '\\$1');
+ },
+
+ /**
+ * Returns true if given ID exists within DOM.
+ *
+ * @param string id
+ * @return boolean
+ */
+ wcfIsset: function(id) {
+ return !!$('#' + $.wcfEscapeID(id)).length;
+ }
+});
+
+/**
+ * Extends jQuery's chainable methods.
+ */
+$.fn.extend({
+ /**
+ * Returns tag name of current jQuery element.
+ *
+ * @returns string
+ */
+ getTagName: function() {
+ return this.get(0).tagName.toLowerCase();
+ },
+
+ /**
+ * Returns the dimensions for current element.
+ *
+ * @see http://api.jquery.com/hidden-selector/
+ * @param string type
+ * @return object
+ */
+ getDimensions: function(type) {
+ var dimensions = css = {};
+ var wasHidden = false;
+
+ // show element to retrieve dimensions and restore them later
+ if (this.is(':hidden')) {
+ css = {
+ display: this.css('display'),
+ visibility: this.css('visibility')
+ };
+
+ wasHidden = true;
+
+ this.css({
+ display: 'block',
+ visibility: 'hidden'
+ });
+ }
+
+ switch (type) {
+ case 'inner':
+ dimensions = {
+ height: this.innerHeight(),
+ width: this.innerWidth()
+ };
+ break;
+
+ case 'outer':
+ dimensions = {
+ height: this.outerHeight(),
+ width: this.outerWidth()
+ };
+ break;
+
+ default:
+ dimensions = {
+ height: this.height(),
+ width: this.width()
+ };
+ break;
+ }
+
+ // restore previous settings
+ if (wasHidden) {
+ this.css(css);
+ }
+
+ return dimensions;
+ },
+
+ /**
+ * Returns the offsets for current element, defaults to position
+ * relative to document.
+ *
+ * @see http://api.jquery.com/hidden-selector/
+ * @param string type
+ * @return object
+ */
+ getOffsets: function(type) {
+ var offsets = css = {};
+ var wasHidden = false;
+
+ // show element to retrieve dimensions and restore them later
+ if (this.is(':hidden')) {
+ css = {
+ display: this.css('display'),
+ visibility: this.css('visibility')
+ };
+
+ wasHidden = true;
+
+ this.css({
+ display: 'block',
+ visibility: 'hidden'
+ });
+ }
+
+ switch (type) {
+ case 'offset':
+ offsets = this.offset();
+ break;
+
+ case 'position':
+ default:
+ offsets = this.position();
+ break;
+ }
+
+ // restore previous settings
+ if (wasHidden) {
+ this.css(css);
+ }
+
+ return offsets;
+ },
+
+ /**
+ * Changes element's position to 'absolute' or 'fixed' while maintaining it's
+ * current position relative to viewport. Optionally removes element from
+ * current DOM-node and moving it into body-element (useful for drag & drop)
+ *
+ * @param boolean rebase
+ * @return object
+ */
+ makePositioned: function(position, rebase) {
+ if (position != 'absolute' && position != 'fixed') {
+ position = 'absolute';
+ }
+
+ var $currentPosition = this.getOffsets('position');
+ this.css({
+ position: position,
+ left: $currentPosition.left,
+ margin: 0,
+ top: $currentPosition.top
+ });
+
+ if (rebase) {
+ this.remove().appentTo('body');
+ }
+
+ return this;
+ },
+
+ /**
+ * Disables a form element.
+ *
+ * @return jQuery
+ */
+ disable: function() {
+ return this.attr('disabled', 'disabled');
+ },
+
+ /**
+ * Enables a form element.
+ *
+ * @return jQuery
+ */
+ enable: function() {
+ return this.removeAttr('disabled');
+ },
+
+ /**
+ * Applies a grow-effect by resizing element while moving the
+ * element appropriately
+ *
+ * @param object data
+ * @param object options
+ * @return jQuery
+ */
+ wcfGrow: function(data, options) {
+ // create temporarily element to determine dimensions
+ var $tempElementID = WCF.getRandomID();
+ $('body').append('<div id="' + $tempElementID + '" class="wcfDimensions">' + data.content + '</div>');
+ var $tempElement = $('#' + $tempElementID);
+
+ // get content dimensions
+ var $dimensions = $tempElement.getDimensions();
+
+ // remove temporarily element
+ $tempElement.empty().remove();
+
+ // move parent element, used if applying effect on dialogs
+ if (!data.parent) {
+ data.parent = this;
+ }
+
+ // calculate values for grow-effect
+ var $borderHeight = parseInt(data.parent.css('borderTopWidth')) + parseInt(data.parent.css('borderBottomWidth'));
+ var $borderWidth = parseInt(data.parent.css('borderLeftWidth')) + parseInt(data.parent.css('borderRightWidth'));
+
+ var $windowDimensions = $(window).getDimensions();
+ var $leftOffset = Math.round(($windowDimensions.width - ($dimensions.width + $borderWidth)) / 2);
+ var $topOffset = Math.round(($windowDimensions.height - ($dimensions.height + $borderHeight)) / 2);
+
+ data.parent.makePositioned('fixed', false);
+ data.parent.animate({
+ left: $leftOffset + 'px',
+ top: $topOffset + 'px'
+ }, options);
+
+ return this.animate({
+ height: $dimensions.height,
+ width: $dimensions.width
+ }, options);
+ },
+
+ /**
+ * Shows an element by sliding and fading it into viewport.
+ *
+ * @param string direction
+ * @param object callback
+ * @returns jQuery
+ */
+ wcfDropIn: function(direction, callback) {
+ if (!direction) direction = 'up';
+
+ return this.show(WCF.getEffect(this.getTagName(), 'drop'), { direction: direction }, 600, callback);
+ },
+
+ /**
+ * Hides an element by sliding and fading it out the viewport.
+ *
+ * @param string direction
+ * @param object callback
+ * @returns jQuery
+ */
+ wcfDropOut: function(direction, callback) {
+ if (!direction) direction = 'down';
+
+ return this.hide(WCF.getEffect(this.getTagName(), 'drop'), { direction: direction }, 600, callback);
+ },
+
+ /**
+ * Shows an element by blinding it up.
+ *
+ * @param string direction
+ * @param object callback
+ * @returns jQuery
+ */
+ wcfBlindIn: function(direction, callback) {
+ if (!direction) direction = 'vertical';
+
+ return this.show(WCF.getEffect(this.getTagName(), 'blind'), { direction: direction }, 200, callback);
+ },
+
+ /**
+ * Hides an element by blinding it down.
+ *
+ * @param string direction
+ * @param object callback
+ * @returns jQuery
+ */
+ wcfBlindOut: function(direction, callback) {
+ if (!direction) direction = 'vertical';
+
+ return this.hide(WCF.getEffect(this.getTagName(), 'blind'), { direction: direction }, 200, callback);
+ },
+
+ /**
+ * Highlights an element.
+ *
+ * @param object options
+ * @param object callback
+ * @returns jQuery
+ */
+ wcfHighlight: function(options, callback) {
+ return this.effect('highlight', options, 600, callback);
+ }
+});
+
+/**
+ * WoltLab Community Framework core methods
+ */
+$.extend(WCF, {
+ /**
+ * Counter for dynamic element id's
+ *
+ * @var integer
+ */
+ _idCounter: 0,
+
+ /**
+ * Shows a modal dialog with a built-in AJAX-loader.
+ *
+ * @param string dialogID
+ * @param boolean resetDialog
+ */
+ showAJAXDialog: function(dialogID, resetDialog) {
+ if (!dialogID) {
+ dialogID = this.getRandomID();
+ }
+
+ if (!$.wcfIsset(dialogID)) {
+ $('body').append($('<div id="' + dialogID + '"></div>'));
+ }
+
+ var dialog = $('#' + $.wcfEscapeID(dialogID));
+
+ if (resetDialog) {
+ dialog.empty();
+ }
+
+ dialog.addClass('overlayLoading');
+
+ var dialogOptions = arguments[2] || {};
+ dialog.wcfAJAXDialog(dialogOptions);
+ },
+
+ /**
+ * Shows a modal dialog.
+ * @param string dialogID
+ */
+ showDialog: function(dialogID) {
+ // we cannot work with a non-existant dialog, if you wish to
+ // load content via AJAX, see showAJAXDialog() instead
+ if (!$.wcfIsset(dialogID)) return;
+
+ var $dialog = $('#' + $.wcfEscapeID(dialogID));
+
+ var dialogOptions = arguments[2] || {};
+ $dialog.wcfDialog(dialogOptions);
+ },
+
+ /**
+ * Returns a dynamically created id.
+ *
+ * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/dom/dom.js#L1789
+ * @return string
+ */
+ getRandomID: function() {
+ var $elementID = '';
+
+ do {
+ $elementID = 'wcf' + this._idCounter++;
+ }
+ while ($.wcfIsset($elementID));
+
+ return $elementID;
+ },
+
+ /**
+ * Wrapper for $.inArray which returns boolean value instead of
+ * index value, similar to PHP's in_array().
+ *
+ * @param mixed needle
+ * @param array haystack
+ * @return boolean
+ */
+ inArray: function(needle, haystack) {
+ return ($.inArray(needle, haystack) != -1);
+ },
+
+ /**
+ * Adjusts effect for partially supported elements.
+ *
+ * @param object object
+ * @param string effect
+ * @return string
+ */
+ getEffect: function(tagName, effect) {
+ // most effects are not properly supported on table rows, use highlight instead
+ if (tagName == 'tr') {
+ return 'highlight';
+ }
+
+ return effect;
+ }
+});
+
+/**
+ * Provides a simple call for periodical executed functions. Based upon
+ * ideas by Prototype's PeriodicalExecuter.
+ *
+ * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/periodical_executer.js
+ * @param function callback
+ * @param integer delay
+ */
+WCF.PeriodicalExecuter = function(callback, delay) { this.init(callback, delay); };
+WCF.PeriodicalExecuter.prototype = {
+ /**
+ * Initializes a periodical executer.
+ *
+ * @param function callback
+ * @param integer delay
+ */
+ init: function(callback, delay) {
+ this.callback = callback;
+ this.delay = delay;
+ this.loop = true;
+
+ this.intervalID = setInterval($.proxy(this._execute, this), this.delay);
+ },
+
+ /**
+ * Executes callback.
+ */
+ _execute: function() {
+ this.callback(this);
+
+ if (!this.loop) {
+ clearInterval(this.intervalID);
+ }
+ },
+
+ /**
+ * Terminates loop.
+ */
+ stop: function() {
+ this.loop = false;
+ }
+};
+
+/**
+ * Namespace for AJAXProxies
+ */
+WCF.Action = {};
+
+/**
+ * Basic implementation for AJAX-based proxyies
+ *
+ * @param object options
+ */
+WCF.Action.Proxy = function(options) { this.init(options); };
+WCF.Action.Proxy.prototype = {
+ /**
+ * Initializes AJAXProxy.
+ *
+ * @param object options
+ */
+ init: function(options) {
+ // initialize default values
+ this.options = $.extend(true, {
+ autoSend: false,
+ data: { },
+ after: null,
+ init: null,
+ failure: null,
+ success: null,
+ type: 'POST',
+ url: 'index.php?action=AJAXProxy&t=' + SECURITY_TOKEN + SID_ARG_2ND
+ }, options);
+
+ this.confirmationDialog = null;
+ this.loading = null;
+
+ // send request immediately after initialization
+ if (this.options.autoSend) {
+ this.sendRequest();
+ }
+ },
+
+ /**
+ * Sends an AJAX request.
+ */
+ sendRequest: function() {
+ this._init();
+
+ $.ajax({
+ data: this.options.data,
+ dataType: 'json',
+ type: this.options.type,
+ url: this.options.url,
+ success: $.proxy(this._success, this),
+ error: $.proxy(this._failure, this)
+ });
+ },
+
+ /**
+ * Fires before request is send, displays global loading status.
+ */
+ _init: function() {
+ if ($.isFunction(this.options.init)) {
+ this.options.init();
+ }
+
+ $('<div id="actionProxyLoading" style="display: none;">Loading …</div>').appendTo($('body'));
+ this.loading = $('#actionProxyLoading');
+ this.loading.wcfDropIn();
+ },
+
+ /**
+ * Handles AJAX errors.
+ *
+ * @param object jqXHR
+ * @param string textStatus
+ * @param string errorThrown
+ */
+ _failure: function(jqXHR, textStatus, errorThrown) {
+ try {
+ var data = $.parseJSON(jqXHR.responseText);
+
+ // call child method if applicable
+ if ($.isFunction(this.options.failure)) {
+ this.options.failure(jqXHR, textStatus, errorThrown, data);
+ }
+
+ var $randomID = WCF.getRandomID();
+ $('<div id="' + $randomID + '" title="HTTP/1.0 ' + jqXHR.status + ' ' + errorThrown + '"><p>Der Server antwortete: ' + data.message + '.</p></div>').wcfDialog();
+ }
+ // failed to parse JSON
+ catch (e) {
+ var $randomID = WCF.getRandomID();
+ $('<div id="' + $randomID + '" title="HTTP/1.0 ' + jqXHR.status + ' ' + errorThrown + '"><p>Der Server antwortete: ' + jqXHR.responseText + '.</p></div>').wcfDialog();
+ }
+
+ this._after();
+ },
+
+ /**
+ * Handles successful AJAX requests.
+ *
+ * @param object data
+ * @param string textStatus
+ * @param object jqXHR
+ */
+ _success: function(data, textStatus, jqXHR) {
+ // call child method if applicable
+ if ($.isFunction(this.options.success)) {
+ this.options.success(data, textStatus, jqXHR);
+ }
+
+ this._after();
+ },
+
+ /**
+ * Fires after an AJAX request, hides global loading status.
+ */
+ _after: function() {
+ if ($.isFunction(this.options.after)) {
+ this.options.after();
+ }
+
+ this.loading.wcfDropOut('up');
+ },
+
+ /**
+ * Sets options, MUST be used to set parameters before sending request
+ * if calling from child classes.
+ *
+ * @param string optionName
+ * @param mixed optionData
+ */
+ setOption: function(optionName, optionData) {
+ this.options[optionName] = optionData;
+ }
+};
+
+/**
+ * Basic implementation for simple proxy access using bound elements.
+ *
+ * @param object options
+ * @param object callbacks
+ */
+WCF.Action.SimpleProxy = function(options, callbacks) { this.init(options, callbacks); };
+WCF.Action.SimpleProxy.prototype = {
+ /**
+ * Initializes SimpleProxy.
+ *
+ * @param object options
+ * @param object callbacks
+ */
+ init: function(options, callbacks) {
+ /**
+ * action-specific options
+ */
+ this.options = $.extend(true, {
+ action: '',
+ className: '',
+ elements: null,
+ eventName: 'click'
+ }, options);
+
+ /**
+ * proxy-specific options
+ */
+ this.callbacks = $.extend(true, {
+ after: null,
+ failure: null,
+ init: null,
+ success: null
+ }, callbacks);
+
+ if (!this.options.elements) return;
+
+ // initialize proxy
+ this.proxy = new WCF.Action.Proxy(this.callbacks);
+
+ // bind event listener
+ this.options.elements.each($.proxy(function(index, element) {
+ $(element).bind(this.options.eventName, $.proxy(this._handleEvent, this));
+ }, this));
+ },
+
+ /**
+ * Handles event actions.
+ *
+ * @param object event
+ */
+ _handleEvent: function(event) {
+ this.proxy.setOption('data', {
+ actionName: this.options.action,
+ className: this.options.className,
+ objectIDs: [ $(event.target).data('objectID') ]
+ });
+
+ this.proxy.sendRequest();
+ }
+};
+
+/**
+ * Basic implementation for AJAXProxy-based deletion.
+ *
+ * @param string className
+ * @param jQuery containerList
+ */
+WCF.Action.Delete = function(className, containerList) { this.init(className, containerList); };
+WCF.Action.Delete.prototype = {
+ /**
+ * Initializes 'delete'-Proxy.
+ *
+ * @param string className
+ * @param jQuery containerList
+ */
+ init: function(className, containerList) {
+ if (!containerList.length) return;
+ this.containerList = containerList;
+ this.className = className;
+
+ // initialize proxy
+ var options = {
+ success: $.proxy(this._success, this)
+ };
+ this.proxy = new WCF.Action.Proxy(options);
+
+ // bind event listener
+ this.containerList.each($.proxy(function(index, container) {
+ $(container).find('.deleteButton').bind('click', $.proxy(this._click, this));
+ }, this));
+ },
+
+ /**
+ * Sends AJAX request.
+ *
+ * @param object event
+ */
+ _click: function(event) {
+ var $target = $(event.target);
+
+ if ($target.data('confirmMessage')) {
+ if (confirm($target.data('confirmMessage'))) {
+ this._sendRequest($target);
+ }
+ }
+ else {
+ this._sendRequest($target);
+ }
+
+ },
+
+ _sendRequest: function(object) {
+ this.proxy.setOption('data', {
+ actionName: 'delete',
+ className: this.className,
+ objectIDs: [ $(object).data('objectID') ]
+ });
+
+ this.proxy.sendRequest();
+ },
+
+ /**
+ * Deletes items from containers.
+ *
+ * @param object data
+ * @param string textStatus
+ * @param object jqXHR
+ */
+ _success: function(data, textStatus, jqXHR) {
+ // remove items
+ this.containerList.each(function(index, container) {
+ var $objectID = $(container).find('.deleteButton').data('objectID');
+ if (WCF.inArray($objectID, data.objectIDs)) {
+ $(container).wcfBlindOut('up', function() {
+ $(container).empty().remove();
+ }, container);
+ }
+ });
+ }
+};
+
+/**
+ * Basic implementation for AJAXProxy-based toggle actions.
+ *
+ * @param string className
+ * @param jQuery containerList
+ */
+WCF.Action.Toggle = function(className, containerList) { this.init(className, containerList); };
+WCF.Action.Toggle.prototype = {
+ /**
+ * Initializes 'toggle'-Proxy
+ *
+ * @param string className
+ * @param jQuery containerList
+ */
+ init: function(className, containerList) {
+ if (!containerList.length) return;
+ this.containerList = containerList;
+ this.className = className;
+
+ // initialize proxy
+ var options = {
+ success: $.proxy(this._success, this)
+ };
+ this.proxy = new WCF.Action.Proxy(options);
+
+ // bind event listener
+ this.containerList.each($.proxy(function(index, container) {
+ $(container).find('.toggleButton').bind('click', $.proxy(this._click, this));
+ }, this));
+ },
+
+ /**
+ * Sends AJAX request.
+ *
+ * @param object event
+ */
+ _click: function(event) {
+ this.proxy.setOption('data', {
+ actionName: 'toggle',
+ className: this.className,
+ objectIDs: [ $(event.target).data('objectID') ]
+ });
+
+ this.proxy.sendRequest();
+ },
+
+ /**
+ * Toggles status icons.
+ *
+ * @param object data
+ * @param string textStatus
+ * @param object jqXHR
+ */
+ _success: function(data, textStatus, jqXHR) {
+ // remove items
+ this.containerList.each(function(index, container) {
+ var $toggleButton = $(container).find('.toggleButton');
+ if (WCF.inArray($toggleButton.data('objectID'), data.objectIDs)) {
+ $(container).wcfHighlight();
+
+ // toggle icon source
+ $toggleButton.attr('src', function() {
+ if (this.src.match(/enabled(S|M|L)\.png$/)) {
+ return this.src.replace(/enabled(S|M|L)\.png$/, 'disabled$1\.png');
+ }
+ else {
+ return this.src.replace(/disabled(S|M|L)\.png$/, 'enabled$1\.png');
+ }
+ });
+ // toogle icon title
+ $toggleButton.attr('title', function() {
+ if (this.src.match(/enabled(S|M|L)\.png$/)) {
+ return $(this).data('disableMessage');
+ }
+ else {
+ return $(this).data('enableMessage');
+ }
+ });
+ }
+ });
+ }
+};
+
+/**
+ * Namespace for date-related functions.
+ */
+WCF.Date = {};
+
+/**
+ * Provides utility functions for date operations.
+ */
+WCF.Date.Util = {
+ /**
+ * Returns UTC timestamp, if date is not given, current time will be used.
+ *
+ * @param Date date
+ * @return integer
+ */
+ gmdate: function(date) {
+ var $date = (date) ? date : new Date();
+
+ return Math.round(Date.UTC(
+ $date.getUTCFullYear(),
+ $date.getUTCMonth(),
+ $date.getUTCDay(),
+ $date.getUTCHours(),
+ $date.getUTCMinutes(),
+ $date.getUTCSeconds()
+ ) / 1000);
+ },
+
+ /**
+ * Returns a Date object with precise offset (including timezone and local timezone).
+ * Parameter timestamp must be in miliseconds!
+ *
+ * @param integer timestamp
+ * @param integer offset
+ * @return Date
+ */
+ getTimezoneDate: function(timestamp, offset) {
+ var $date = new Date(timestamp);
+ var $localOffset = $date.getTimezoneOffset() * -1 * 60000;
+
+ return new Date((timestamp - $localOffset - offset));
+ }
+};
+
+/**
+ * Handles relative time designations.
+ */
+WCF.Date.Time = function() { this.init(); };
+WCF.Date.Time.prototype = {
+ /**
+ * Initializes relative datetimes.
+ */
+ init: function() {
+ // initialize variables
+ this.elements = $('time.datetime');
+ this.timestamp = 0;
+
+ // calculate relative datetime on init
+ this._refresh();
+
+ // re-calculate relative datetime every minute
+ new WCF.PeriodicalExecuter($.proxy(this._refresh, this), 60000);
+ },
+
+ /**
+ * Refreshes relative datetime for each element.
+ */
+ _refresh: function() {
+ // TESTING ONLY!
+ var $date = new Date();
+ this.timestamp = ($date.getTime() - $date.getMilliseconds()) / 1000;
+ // TESTING ONLY!
+
+ this.elements.each($.proxy(this._refreshElement, this));
+ },
+
+ /**
+ * Refreshes relative datetime for current element.
+ *
+ * @param integer index
+ * @param object element
+ */
+ _refreshElement: function(index, element) {
+ if (!$(element).attr('title')) {
+ $(element).attr('title', $(element).text());
+ }
+
+ var $timestamp = $(element).data('timestamp');
+ var $date = $(element).data('date');
+ var $time = $(element).data('time');
+ var $offset = $(element).data('offset');
+
+ // timestamp is less than 60 minutes ago (display 1 hour ago rather than 60 minutes ago)
+ if (this.timestamp < ($timestamp + 3540)) {
+ var $minutes = Math.round((this.timestamp - $timestamp) / 60);
+ $(element).text(eval(WCF.Language.get('wcf.global.date.relative.minutes')));
+ }
+ // timestamp is less than 24 hours ago
+ else if (this.timestamp < ($timestamp + 86400)) {
+ var $hours = Math.round((this.timestamp - $timestamp) / 3600);
+ $(element).text(eval(WCF.Language.get('wcf.global.date.relative.hours')));
+ }
+ // timestamp is less than a week ago
+ else if (this.timestamp < ($timestamp + 604800)) {
+ var $days = Math.round((this.timestamp - $timestamp) / 86400);
+ var $string = eval(WCF.Language.get('wcf.global.date.relative.pastDays'));
+
+ // get day of week
+ var $dateObj = WCF.Date.Util.getTimezoneDate(($timestamp * 1000), $offset);
+ var $dow = $dateObj.getDay();
+
+ $(element).text($string.replace(/\%day\%/, WCF.Language.get('__days')[$dow]).replace(/\%time\%/, $time));
+ }
+ // timestamp is between ~700 million years BC and last week
+ else {
+ var $string = WCF.Language.get('wcf.global.date.dateTimeFormat');
+ $(element).text($string.replace(/\%date\%/, $date).replace(/\%time\%/, $time));
+ }
+ }
+};
+
+/**
+ * Hash-like dictionary. Based upon idead from Prototype's hash
+ *
+ * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/hash.js
+ */
+WCF.Dictionary = function() { this.init(); };
+WCF.Dictionary.prototype = {
+ /**
+ * Initializes a new dictionary.
+ */
+ init: function() {
+ this.variables = { };
+ },
+
+ /**
+ * Adds an entry.
+ *
+ * @param string key
+ * @param mixed value
+ */
+ add: function(key, value) {
+ this.variables[key] = value;
+ },
+
+ /**
+ * Adds a traditional object to current dataset.
+ *
+ * @param object object
+ */
+ addObject: function(object) {
+ for (var $key in object) {
+ this.add($key, object[$key]);
+ }
+ },
+
+ /**
+ * Adds a dictionary to current dataset.
+ *
+ * @param object dictionary
+ */
+ addDictionary: function(dictionary) {
+ dictionary.each($.proxy(function(pair) {
+ this.add(pair.key, pair.value);
+ }, this));
+ },
+
+ /**
+ * Retrieves the value of an entry or returns null if key is not found.
+ *
+ * @param string key
+ * @returns mixed
+ */
+ get: function(key) {
+ if (this.isset(key)) {
+ return this.variables[key];
+ }
+
+ return null;
+ },
+
+ /**
+ * Returns true if given key is a valid entry.
+ *
+ * @param string key
+ */
+ isset: function(key) {
+ return this.variables.hasOwnProperty(key);
+ },
+
+ /**
+ * Removes an entry.
+ *
+ * @param string key
+ */
+ remove: function(key) {
+ delete this.variables[key];
+ },
+
+ /**
+ * Iterates through dictionary.
+ *
+ * Usage:
+ * var $hash = new WCF.Dictionary();
+ * $hash.add('foo', 'bar');
+ * $hash.each(function(pair) {
+ * // alerts: foo = bar
+ * alert(pair.key + ' = ' + pair.value);
+ * });
+ *
+ * @param function callback
+ */
+ each: function(callback) {
+ if (!$.isFunction(callback)) {
+ return;
+ }
+
+ for (var $key in this.variables) {
+ var $value = this.variables[$key];
+ var $pair = {
+ key: $key,
+ value: $value
+ };
+
+ callback($pair);
+ }
+ }
+};
+
+/**
+ * Global language storage.
+ *
+ * @see WCF.Dictionary
+ */
+WCF.Language = {
+ _variables: new WCF.Dictionary(),
+
+ /**
+ * @see WCF.Dictionary.addObject()
+ */
+ add: function(key, value) {
+ this._variables.add(key, value);
+ },
+
+ /**
+ * @see WCF.Dictionary.addObject()
+ */
+ addObject: function(object) {
+ this._variables.addObject(object);
+ },
+
+ /**
+ * Retrieves a variable.
+ *
+ * @param string key
+ * @return mixed
+ */
+ get: function(key) {
+ return this._variables.get(key);
+ }
+};
+
+/**
+ * String utilities.
+ */
+WCF.String = {
+ /**
+ * Escapes special HTML-characters within a string
+ *
+ * @param string string
+ * @return string
+ */
+ escapeHTML: function (string) {
+ return string.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
+ },
+
+ /**
+ * Escapes a String to work with RegExp.
+ *
+ * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/regexp.js#L25
+ * @param string string
+ * @return string
+ */
+ escapeRegExp: function(string) {
+ return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+ },
+
+ /**
+ * Makes a string's first character uppercase
+ *
+ * @param string string
+ * @return string
+ */
+ ucfirst: function(string) {
+ return string.substring(0, 1).toUpperCase() + string.substring(1);
+ },
+
+ /**
+ * Adds thousands separators to a given number.
+ *
+ * @param mixed number
+ * @return string
+ */
+ addThousandsSeparator: function(number) {
+ var $numberString = String(number);
+ if (number >= 1000 || number <= -1000) {
+ var $negative = false;
+ if (number <= -1000) {
+ $negative = true;
+ $numberString = $numberString.substring(1);
+ }
+ var $separator = WCF.Language.get('wcf.global.thousandsSeparator');
+
+ if ($separator != null && $separator != '') {
+ var $numElements = new Array();
+ var $firstPart = $numberString.length % 3
+ if ($firstPart == 0) $firstPart = 3;
+ for (var $i = 0; $i < Math.ceil($numberString.length / 3); $i++) {
+ if ($i == 0) $numElements.push($numberString.substring(0, $firstPart));
+ else {
+ var $start = (($i - 1) * 3) + $firstPart
+ $numElements.push($numberString.substring($start, $start + 3));
+ }
+ }
+ $numberString = (($negative) ? ('-') : ('')) + $numElements.join($separator);
+ }
+ }
+
+ return $numberString;
+ }
+};
+
+/**
+ * Basic implementation for WCF TabMenus. Use the data attributes 'active' to specify the
+ * tab which should be shown on init. Furthermore you may specify a 'store' data-attribute
+ * which will be filled with the currently selected tab.
+ */
+WCF.TabMenu = {
+ /**
+ * Initializes all TabMenus
+ */
+ init: function() {
+ $('.tabMenuContainer').each(function(index, tabMenu) {
+ if (!$(tabMenu).attr('id')) {
+ var $randomID = WCF.getRandomID();
+ $(tabMenu).attr('id', $randomID);
+ }
+
+ // init jQuery UI TabMenu
+ $(tabMenu).wcfTabs({
+ select: function(event, ui) {
+ var $panel = $(ui.panel);
+ var $container = $panel.closest('.tabMenuContainer');
+
+ // store currently selected item
+ if ($container.data('store')) {
+ if ($.wcfIsset($container.data('store'))) {
+ $('#' + $container.data('store')).attr('value', $panel.attr('id'));
+ }
+ }
+ }
+ });
+
+ // display active item on init
+ if ($(tabMenu).data('active')) {
+ $(tabMenu).find('.tabMenuContent').each(function(index, tabMenuItem) {
+ if ($(tabMenuItem).attr('id') == $(tabMenu).data('active')) {
+ $(tabMenu).wcfTabs('select', index);
+ }
+ });
+ }
+ });
+ }
+};
+
+/**
+ * Templates that may be fetched more than once with different variables. Based upon ideas from Prototype's template
+ *
+ * Usage:
+ * var myTemplate = new WCF.Template('{$hello} World');
+ * myTemplate.fetch({ hello: 'Hi' }); // Hi World
+ * myTemplate.fetch({ hello: 'Hello' }); // Hello World
+ *
+ * my2ndTemplate = new WCF.Template('{@$html}{$html}');
+ * my2ndTemplate.fetch({ html: '<b>Test</b>' }); // <b>Test</b><b>Test</b>
+ *
+ * var my3rdTemplate = new WCF.Template('You can use {literal}{$variable}{/literal}-Tags here');
+ * my3rdTemplate.fetch({ variable: 'Not shown' }); // You can use {$variable}-Tags here
+ *
+ *
+ * @param template template-content
+ * @see https://github.com/sstephenson/prototype/blob/master/src/prototype/lang/template.js
+ */
+WCF.Template = function(template) { this.init(template); };
+WCF.Template.prototype = {
+ /**
+ * Template-content
+ *
+ * @var string
+ */
+ _template: '',
+
+ /**
+ * Saved literal-tags
+ *
+ * @var WCF.Dictionary
+ */
+ _literals: new WCF.Dictionary(),
+
+ /**
+ * Prepares template
+ *
+ * @param $template template-content
+ */
+ init: function($template) {
+ this._template = $template;
+
+ // save literal-tags
+ this._template = this._template.replace(/\{literal\}(.*?)\{\/literal\}/g, $.proxy(function ($match) {
+ // hopefully no one uses this string in one of his templates
+ var id = '@@@@@@@@@@@'+Math.random()+'@@@@@@@@@@@';
+ this._literals.add(id, $match.replace(/\{\/?literal\}/g, ''));
+
+ return id;
+ }, this));
+ },
+
+ /**
+ * Fetches the template with the given variables
+ *
+ * @param $variables variables to insert
+ * @return parsed template
+ */
+ fetch: function($variables) {
+ var $result = this._template;
+
+ // insert them :)
+ for (var $key in $variables) {
+ $result = $result.replace(new RegExp(WCF.String.escapeRegExp('{$'+$key+'}'), 'g'), WCF.String.escapeHTML($variables[$key]));
+ $result = $result.replace(new RegExp(WCF.String.escapeRegExp('{@$'+$key+'}'), 'g'), $variables[$key]);
+ }
+
+ // insert delimiter tags
+ $result = $result.replace('{ldelim}', '{').replace('{rdelim}', '}');
+
+ // and re-insert saved literals
+ return this.insertLiterals($result);
+ },
+
+ /**
+ * Inserts literals into given string
+ *
+ * @param $template string to insert into
+ * @return string with inserted literals
+ */
+ insertLiterals: function ($template) {
+ this._literals.each(function ($pair) {
+ $template = $template.replace($pair.key, $pair.value);
+ });
+
+ return $template;
+ },
+
+ /**
+ * Compiles this template into javascript-code
+ *
+ * @return WCF.Template.Compiled
+ */
+ compile: function () {
+ var $compiled = this._template;
+
+ // escape \ and '
+ $compiled = $compiled.replace('\\', '\\\\').replace("'", "\\'");
+
+ // parse our variable-tags
+ $compiled = $compiled.replace(/\{\$(.*?)\}/g, function ($match) {
+ var $name = '$v.' + $match.substring(2, $match.length - 1);
+ // trinary operator to maintain compatibility with uncompiled template
+ // ($name) ? $name : '$match'
+ // -> $v.muh ? $v.muh : '{$muh}'
+ return "' + WCF.String.escapeHTML("+ $name + " ? " + $name + " : '" + $match + "') + '";
+ }).replace(/\{@\$(.*?)\}/g, function ($match) {
+ var $name = '$v.' + $match.substring(3, $match.length - 1);
+ // trinary operator to maintain compatibility with uncompiled template
+ // ($name) ? $name : '$match'
+ // -> $v.muh ? $v.muh : '{$muh}'
+ return "' + ("+ $name + " ? " + $name + " : '" + $match + "') + '";
+ });
+
+ // insert delimiter tags
+ $compiled = $compiled.replace('{ldelim}', '{').replace('{rdelim}', '}');
+
+ // and re-insert saved literals
+ return new WCF.Template.Compiled("'" + this.insertLiterals($compiled) + "';");
+ }
+};
+
+/**
+ * Represents a compiled template
+ *
+ * @param compiled compiled template
+ */
+WCF.Template.Compiled = function(compiled) { this.init(compiled); };
+WCF.Template.Compiled.prototype = {
+ /**
+ * Compiled template
+ *
+ * @var string
+ */
+ _compiled: '',
+
+ /**
+ * Initializes our compiled template
+ *
+ * @param $compiled compiled template
+ */
+ init: function($compiled) {
+ this._compiled = $compiled;
+ },
+
+ /**
+ * @see WCF.Template.fetch
+ */
+ fetch: function($v) {
+ return eval(this._compiled);
+ }
+};
+
+/**
+ * Toggles options.
+ *
+ * @param string element
+ * @param array showItems
+ * @param array hideItems
+ */
+WCF.ToggleOptions = function(element, showItems, hideItems) { this.init(element, showItems, hideItems); };
+WCF.ToggleOptions.prototype = {
+ /**
+ * target item
+ *
+ * @var jQuery
+ */
+ _element: null,
+
+ /**
+ * list of items to be shown
+ *
+ * @var array
+ */
+ _showItems: [],
+
+ /**
+ * list of items to be hidden
+ *
+ * @var array
+ */
+ _hideItems: [],
+
+ /**
+ * Initializes option toggle.
+ *
+ * @param string element
+ * @param array showItems
+ * @param array hideItems
+ */
+ init: function(element, showItems, hideItems) {
+ this._element = $('#' + element);
+ this._showItems = showItems;
+ this._hideItems = hideItems;
+
+ // bind event
+ this._element.click($.proxy(this._toggle, this));
+
+ // execute toggle on init
+ this._toggle();
+ },
+
+ /**
+ * Toggles items.
+ */
+ _toggle: function() {
+ if (!this._element.attr('checked')) return;
+
+ for (var $i = 0, $length = this._showItems.length; $i < $length; $i++) {
+ var $item = this._showItems[$i];
+
+ $('#' + $item).show();
+ }
+
+ for (var $i = 0, $length = this._hideItems.length; $i < $length; $i++) {
+ var $item = this._hideItems[$i];
+
+ $('#' + $item).hide();
+ }
+ }
+};
+
+/**
+ * Basic implementation for WCF dialogs.
+ */
+$.widget('ui.wcfDialog', $.ui.dialog, {
+ _init: function() {
+ this.options.autoOpen = true;
+ this.options.close = function(event, ui) {
+ $(this).parent('.ui-dialog').wcfDropOut('down', $.proxy(function() {
+ $(this).parent('.ui-dialog').empty().remove();
+ }, this));
+ };
+ this.options.height = 'auto';
+ this.options.minHeight = 0;
+ this.options.modal = true;
+ this.options.width = 'auto';
+
+ $.ui.dialog.prototype._init.apply(this, arguments);
+ }
+});
+
+/**
+ * Basic implementation for WCF dialogs loading content
+ * via AJAX before calling dialog itself.
+ */
+$.widget('ui.wcfAJAXDialog', $.ui.dialog, {
+ /**
+ * Indicates wether callback was already executed
+ *
+ * @var boolean
+ */
+ _callbackExecuted: false,
+
+ /**
+ * Initializes AJAX-request to fetch content.
+ */
+ _init: function() {
+ if (this.options.ajax) {
+ this._loadContent();
+ }
+
+ // force dialog to be placed centered
+ this.options.position = {
+ my: 'center center',
+ at: 'center center'
+ };
+
+ // dialog should display a spinner-like image, thus immediately fire up dialog
+ this.options.autoOpen = true;
+ this.options.width = 'auto';
+ this.options.minHeight = 80;
+
+ // disable ability to move dialog
+ this.options.resizable = false;
+ this.options.draggable = false;
+
+ this.options.modal = true;
+ this.options.hide = {
+ effect: 'drop',
+ direction: 'down'
+ };
+
+ this.options.close = function(event, ui) {
+ // loading ajax content seems to block properly closing
+ $(this).parent('.ui-dialog').empty().remove();
+ };
+
+ if (this.options.preventClose) {
+ this.options.closeOnEscape = false;
+ }
+
+ $.ui.dialog.prototype._init.apply(this, arguments);
+
+ // remove complete node instead of removing node-by-node
+ if (this.options.hideTitle && this.options.preventClose) {
+ this.element.parent('.ui-dialog').find('div.ui-dialog-titlebar').empty().remove();
+ }
+ else {
+ if (this.options.hideTitle) {
+ // remove title element
+ $('#ui-dialog-title-' + this.element.attr('id')).empty().remove();
+ }
+
+ if (this.options.preventClose) {
+ // remove close-button
+ this.element.parent('.ui-dialog').find('a.ui-dialog-titlebar-close').empty().remove();
+ }
+ }
+ },
+
+ /**
+ * Loads content via AJAX.
+ *
+ * @todo Enforce JSON
+ */
+ _loadContent: function() {
+ var $type = 'GET';
+ if (this.options.ajax.type) {
+ $type = this.options.ajax.type;
+
+ if (this.options.ajax.type != 'GET' && this.options.ajax.type != 'POST') {
+ $type = 'GET';
+ }
+ }
+
+ var $data = this.options.ajax.data || {};
+
+ $.ajax({
+ url: this.options.ajax.url,
+ context: this,
+ dataType: 'json',
+ type: $type,
+ data: $data,
+ success: $.proxy(this._createDialog, this),
+ error: function(transport) {
+ alert(transport.responseText);
+ }
+ });
+ },
+
+ /**
+ * Inserts content.
+ *
+ * @param string data
+ */
+ _createDialog: function(data) {
+ data.ignoreTemplate = true;
+ this.element.data('responseData', data);
+
+ this.element.wcfGrow({
+ content: data.template,
+ parent: this.element.parent('.ui-dialog')
+ }, {
+ duration: 600,
+ complete: $.proxy(function(data) {
+ this.element.css({
+ height: 'auto'
+ });
+
+ // prevent double execution due to two complete-calls (two times animate)
+ if (this._callbackExecuted) {
+ return;
+ }
+
+ this._callbackExecuted = true;
+
+ this.element.removeClass('overlayLoading');
+ this.element.html(this.element.data('responseData').template);
+
+ if (this.options.ajax.success) {
+ this.options.ajax.success();
+ }
+ }, this)
+ });
+ },
+
+ /**
+ * Redraws dialog, should be executed everytime content is changed.
+ */
+ redraw: function() {
+ var $dimensions = this.element.getDimensions();
+
+ if ($dimensions.height > 200) {
+ this.element.wcfGrow({
+ content: this.element.html(),
+ parent: this.element.parent('.ui-dialog')
+ }, {
+ duration: 600,
+ complete: function() {
+ $(this).css({ height: 'auto' });
+ }
+ });
+ }
+ }
+});
+
+/**
+ * Workaround for ids containing a dot ".", until jQuery UI devs learn
+ * to properly escape ids ... (it took 18 months until they finally
+ * fixed it!)
+ *
+ * @see http://bugs.jqueryui.com/ticket/4681
+ */
+$.widget('ui.wcfTabs', $.ui.tabs, {
+ _init: function() {
+ $.ui.dialog.prototype._init.apply(this, arguments);
+ },
+
+ _sanitizeSelector: function(hash) {
+ return hash.replace(/([:\.])/g, '\\$1');
+ }
+});
+
+/**
+ * jQuery widget implementation of the wcf pagination.
+ */
+$.widget('ui.wcfPages', {
+ SHOW_LINKS: 11,
+ SHOW_SUB_LINKS: 20,
+
+ options: {
+ // vars
+ activePage: 1,
+ maxPage: 1,
+
+ // icons
+ previousIcon: RELATIVE_WCF_DIR + 'icon/previousS.png',
+ previousDisabledIcon: RELATIVE_WCF_DIR + 'icon/previousDisabledS.png',
+ arrowDownIcon: RELATIVE_WCF_DIR + 'icon/arrowDown.png',
+ nextIcon: RELATIVE_WCF_DIR + 'icon/nextS.png',
+ nextDisabledIcon: RELATIVE_WCF_DIR + 'icon/nextDisabledS.png',
+
+ // language
+ // we use options here instead of language variables, because the paginator is not only usable with pages
+ nextPage: null,
+ previousPage: null,
+ },
+
+ /**
+ * Creates the pages widget.
+ */
+ _create: function() {
+ if (this.options.nextPage === null) this.options.nextPage = WCF.Language.get('wcf.global.page.next');
+ if (this.options.previousPage === null) this.options.previousPage = WCF.Language.get('wcf.global.page.previous');
+
+ this.element.addClass('pageNavigation');
+
+ this._render();
+ },
+
+ /**
+ * Destroys the pages widget.
+ */
+ destroy: function() {
+ $.Widget.prototype.destroy.apply(this, arguments);
+
+ this.element.children().remove();
+ },
+
+ /**
+ * Renders th pages widget.
+ */
+ _render: function() {
+ // only render if we have more than 1 page
+ if (!this.options.disabled && this.options.maxPage > 1) {
+ // make sure pagination is visible
+ if (this.element.hasClass('hidden')) {
+ this.element.removeClass('hidden');
+ }
+ this.element.show();
+
+ this.element.children().remove();
+
+ var $pageList = $('<ul></ul>');
+ this.element.append($pageList);
+
+ var $previousElement = $('<li></li>');
+ $pageList.append($previousElement);
+
+ if (this.options.activePage > 1) {
+ var $previousLink = $('<a' + ((this.options.previousPage != null) ? (' title="' + this.options.previousPage + '"') : ('')) + '></a>');
+ $previousElement.append($previousLink);
+ this._bindSwitchPage($previousLink, this.options.activePage - 1);
+
+ var $previousImage = $('<img src="' + this.options.previousIcon + '" alt="" />');
+ $previousLink.append($previousImage);
+ }
+ else {
+ var $previousImage = $('<img src="' + this.options.previousDisabledIcon + '" alt="" />');
+ $previousElement.append($previousImage);
+ }
+ $previousElement.addClass('skip');
+
+ // add first page
+ $pageList.append(this._renderLink(1));
+
+ // calculate page links
+ var $maxLinks = this.SHOW_LINKS - 4;
+ var $linksBefore = this.options.activePage - 2;
+ if ($linksBefore < 0) $linksBefore = 0;
+ var $linksAfter = this.options.maxPage - (this.options.activePage + 1);
+ if ($linksAfter < 0) $linksAfter = 0;
+ if (this.options.activePage > 1 && this.options.activePage < this.options.maxPage) $maxLinks--;
+
+ var $half = $maxLinks / 2;
+ var $left = this.options.activePage;
+ var $right = this.options.activePage;
+ if ($left < 1) $left = 1;
+ if ($right < 1) $right = 1;
+ if ($right > this.options.maxPage - 1) $right = this.options.maxPage - 1;
+
+ if ($linksBefore >= $half) {
+ $left -= $half;
+ }
+ else {
+ $left -= $linksBefore;
+ $right += $half - $linksBefore;
+ }
+
+ if ($linksAfter >= $half) {
+ $right += $half;
+ }
+ else {
+ $right += $linksAfter;
+ $left -= $half - $linksAfter;
+ }
+
+ $right = Math.ceil($right);
+ $left = Math.ceil($left);
+ if ($left < 1) $left = 1;
+ if ($right > this.options.maxPage) $right = this.options.maxPage;
+
+ // left ... links
+ if ($left > 1) {
+ if ($left - 1 < 2) {
+ $pageList.append(this._renderLink(2));
+ }
+ else {
+ var $leftChildren = $('<li class="children"></li>');
+ $pageList.append($leftChildren);
+
+ var $leftChildrenLink = $('<a>…</a>');
+ $leftChildren.append($leftChildrenLink);
+ $leftChildrenLink.click($.proxy(this._startInput, this));
+
+ var $leftChildrenImage = $('<img src="' + this.options.arrowDownIcon + '" alt="" />');
+ $leftChildrenLink.append($leftChildrenImage);
+
+ var $leftChildrenInput = $('<input type="text" class="inputText" name="pageNo" />');
+ $leftChildren.append($leftChildrenInput);
+ $leftChildrenInput.keydown($.proxy(this._handleInput, this));
+ $leftChildrenInput.keyup($.proxy(this._handleInput, this));
+ $leftChildrenInput.blur($.proxy(this._stopInput, this));
+
+ var $leftChildrenContainer = $('<div></div>');
+ $leftChildren.append($leftChildrenContainer);
+
+ var $leftChildrenList = $('<ul></u>');
+ $leftChildrenContainer.append($leftChildrenList);
+
+ // render sublinks
+ var $k = 0;
+ var $step = Math.ceil(($left - 2) / this.SHOW_SUB_LINKS);
+ for (var $i = 2; $i <= $left; $i += $step) {
+ $leftChildrenList.append(this._renderLink($i, ($k != 0 && $k % 4 == 0)));
+ $k++;
+ }
+ }
+ }
+
+ // visible links
+ for (var $i = $left + 1; $i < $right; $i++) {
+ $pageList.append(this._renderLink($i));
+ }
+
+ // right ... links
+ if ($right < this.options.maxPage) {
+ if (this.options.maxPage - $right < 2) {
+ $pageList.append(this._renderLink(this.options.maxPage - 1));
+ }
+ else {
+ var $rightChildren = $('<li class="children"></li>');
+ $pageList.append($rightChildren);
+
+ var $rightChildrenLink = $('<a>…</a>');
+ $rightChildren.append($rightChildrenLink);
+ $rightChildrenLink.click($.proxy(this._startInput, this));
+
+ var $rightChildrenImage = $('<img src="' + this.options.arrowDownIcon + '" alt="" />');
+ $rightChildrenLink.append($rightChildrenImage);
+
+ var $rightChildrenInput = $('<input type="text" class="inputText" name="pageNo" />');
+ $rightChildren.append($rightChildrenInput);
+ $rightChildrenInput.keydown($.proxy(this._handleInput, this));
+ $rightChildrenInput.keyup($.proxy(this._handleInput, this));
+ $rightChildrenInput.blur($.proxy(this._stopInput, this));
+
+ var $rightChildrenContainer = $('<div></div>');
+ $rightChildren.append($rightChildrenContainer);
+
+ var $rightChildrenList = $('<ul></ul>');
+ $rightChildrenContainer.append($rightChildrenList);
+
+ // render sublinks
+ var $k = 0;
+ var $step = Math.ceil((this.options.maxPage - $right) / this.SHOW_SUB_LINKS);
+ for (var $i = $right; $i < this.options.maxPage; $i += $step) {
+ $rightChildrenList.append(this._renderLink($i, ($k != 0 && $k % 4 == 0)));
+ $k++;
+ }
+ }
+ }
+
+ // add last page
+ $pageList.append(this._renderLink(this.options.maxPage));
+
+ // add next button
+ var $nextElement = $('<li></li>');
+ $pageList.append($nextElement);
+
+ if (this.options.activePage < this.options.maxPage) {
+ var $nextLink = $('<a title="' + ((this.options.nextPage != null) ? (' title="' + this.options.nextPage + '"') : ('')) + '"></a>');
+ $nextElement.append($nextLink);
+ this._bindSwitchPage($nextLink, this.options.activePage + 1);
+
+ var $nextImage = $('<img src="' + this.options.nextIcon + '" alt="" />');
+ $nextLink.append($nextImage);
+ }
+ else {
+ var $nextImage = $('<img src="' + this.options.nextDisabledIcon + '" alt="" />');
+ $nextElement.append($nextImage);
+ }
+ $nextElement.addClass('skip');
+ }
+ else {
+ // otherwise hide the paginator if not already hidden
+ this.element.hide();
+ }
+ },
+
+ /**
+ * Renders a page link
+ *
+ * @parameter integer page
+ *
+ * @return $(element)
+ */
+ _renderLink: function(page, lineBreak) {
+ var $pageElement = $('<li></li>');
+ if (lineBreak != undefined && lineBreak) {
+ $pageElement.addClass('break');
+ }
+ if (page != this.options.activePage) {
+ var $pageLink = $('<a>' + WCF.String.addThousandsSeparator(page) + '</a>');
+ $pageElement.append($pageLink);
+ this._bindSwitchPage($pageLink, page);
+ }
+ else {
+ $pageElement.addClass('active');
+ var $pageSubElement = $('<span>' + WCF.String.addThousandsSeparator(page) + '</span>');
+ $pageElement.append($pageSubElement);
+ }
+
+ return $pageElement;
+ },
+
+ /**
+ * Binds the 'click'-event for the page switching to the given element.
+ *
+ * @parameter $(element) element
+ * @paremeter integer page
+ */
+ _bindSwitchPage: function(element, page) {
+ var $self = this;
+ element.click(function() {
+ $self.switchPage(page);
+ });
+ },
+
+ /**
+ * Switches to the given page
+ *
+ * @parameter Event event
+ * @parameter integer page
+ */
+ switchPage: function(page) {
+ this._setOption('activePage', page);
+ },
+
+ /**
+ * Sets the given option to the given value.
+ * See the jQuery UI widget documentation for more.
+ */
+ _setOption: function(key, value) {
+ if (key == 'activePage') {
+ if (value != this.options[key] && value > 0 && value <= this.options.maxPage) {
+ // you can prevent the page switching by returning false or by event.preventDefault()
+ // in a shouldSwitch-callback. e.g. if an AJAX request is already running.
+ var $result = this._trigger('shouldSwitch', undefined, {
+ nextPage: value,
+ });
+
+ if ($result) {
+ this.options[key] = value;
+ this._render();
+ this._trigger('switched', undefined, {
+ activePage: value,
+ });
+ }
+ else {
+ this._trigger('notSwitched', undefined, {
+ activePage: value,
+ });
+ }
+ }
+ }
+ else {
+ this.options[key] = value;
+
+ if (key == 'disabled') {
+ if (value) {
+ this.element.children().remove();
+ }
+ else {
+ this._render()
+ }
+ }
+ else if (key == 'maxPage') {
+ this._render();
+ }
+ }
+
+ return this;
+ },
+
+ /**
+ * Start input of pagenumber
+ *
+ * @parameter Event event
+ */
+ _startInput: function(event) {
+ // hide a-tag
+ var $childLink = $(event.currentTarget);
+ if (!$childLink.is('a')) $childLink = $childLink.parent('a');
+
+ $childLink.hide();
+
+ // show input-tag
+ var $childInput = $childLink.parent('li').children('input')
+ .css('display', 'block')
+ .val('');
+
+ $childInput.focus();
+ },
+
+ /**
+ * Stops input of pagenumber
+ *
+ * @parameter Event event
+ */
+ _stopInput: function(event) {
+ // hide input-tag
+ var $childInput = $(event.currentTarget);
+ $childInput.css('display', 'none');
+
+ // show a-tag
+ var $childContainer = $childInput.parent('li')
+ if ($childContainer != undefined && $childContainer != null) {
+ $childContainer.children('a').show();
+ }
+ },
+
+ /**
+ * Handles input of pagenumber
+ *
+ * @parameter Event event
+ */
+ _handleInput: function(event) {
+ var $ie7 = ($.browser.msie && $.browser.version == '7.0');
+ if (event.type != 'keyup' || $ie7) {
+ if (!$ie7 || ((event.which == 13 || event.which == 27) && event.type == 'keyup')) {
+ if (event.which == 13) {
+ this.switchPage(parseInt($(event.currentTarget).val()));
+ }
+
+ if (event.which == 13 || event.which == 27) {
+ this._stopInput(event);
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+});
+
+/**
+ * Encapsulate eval() within an own function to prevent problems
+ * with optimizing and minifiny JS.
+ *
+ * @param mixed expression
+ * @returns mixed
+ */
+function wcfEval(expression) {
+ return eval(expression);
+}
-<?php\r
-namespace wcf\acp\action;\r
-\r
-/**\r
- * Copy of the default implementation for object-actions using the AJAX-API.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category Community Framework\r
- */\r
+<?php
+namespace wcf\acp\action;
+
+/**
+ * Copy of the default implementation for object-actions using the AJAX-API.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.action
+ * @category Community Framework
+ */
class AJAXProxyAction extends \wcf\action\AJAXProxyAction { }
-<?php\r
-namespace wcf\acp\action;\r
-use wcf\action\AbstractDialogAction;\r
-use wcf\data\package\installation\queue\PackageInstallationQueue;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Handles an AJAX-based package installation.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category Community Framework\r
- */\r
-class InstallPackageAction extends AbstractDialogAction {\r
- /**\r
- * current node\r
- *\r
- * @var string\r
- */\r
- public $node = '';\r
- \r
- /**\r
- * PackageInstallationDispatcher object\r
- *\r
- * @var PackageInstallationDispatcher\r
- */\r
- public $installation = null;\r
- \r
- /**\r
- * PackageInstallationQueue object\r
- *\r
- * @var PackageInstallationQueue\r
- */\r
- public $queue = null;\r
- \r
- /**\r
- * current queue id\r
- *\r
- * @var integer\r
- */\r
- public $queueID = 0;\r
- \r
- // system\r
- public $templateName = 'packageInstallationStep';\r
- \r
- /**\r
- * @see wcf\action\IAction::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_POST['node'])) $this->node = StringUtil::trim($_POST['node']);\r
- if (isset($_POST['queueID'])) $this->queueID = intval($_POST['queueID']);\r
- $this->queue = new PackageInstallationQueue($this->queueID);\r
- \r
- if (!$this->queue->queueID) {\r
- throw new IllegalLinkException();\r
- }\r
- \r
- $this->installation = new PackageInstallationDispatcher($this->queue);\r
- }\r
- \r
- /**\r
- * Executes installation based upon nodes.\r
- */\r
- protected function stepInstall() {\r
- $step = $this->installation->install($this->node);\r
- \r
- if ($step->hasDocument()) {\r
- $this->data = array(\r
- 'innerTemplate' => $step->getTemplate(),\r
- 'node' => $step->getNode(),\r
- 'progress' => $this->installation->nodeBuilder->calculateProgress($this->node),\r
- 'step' => 'install'\r
- );\r
- }\r
- else {\r
- if ($step->getNode() == '') {\r
- // perform final actions\r
- $queueID = $this->installation->completeSetup();\r
- \r
- // begin with next queue\r
- if ($queueID) {\r
- $this->data = array(\r
- 'progress' => 100,\r
- 'queueID' => $queueID,\r
- 'step' => 'prepare'\r
- );\r
- return;\r
- }\r
- \r
- // no more queues, show success\r
- $this->data = array(\r
- 'progress' => 100,\r
- 'step' => 'success'\r
- );\r
- return;\r
- }\r
- \r
- // continue with next node\r
- $this->data = array(\r
- 'step' => 'install',\r
- 'node' => $step->getNode(),\r
- 'progress' => $this->installation->nodeBuilder->calculateProgress($this->node)\r
- );\r
- }\r
- }\r
- \r
- /**\r
- * Prepares the installation process.\r
- */\r
- protected function stepPrepare() {\r
- // update package information\r
- $this->installation->updatePackage();\r
- \r
- // clean-up previously created nodes\r
- $this->installation->nodeBuilder->purgeNodes();\r
- \r
- // create node tree\r
- $this->installation->nodeBuilder->buildNodes();\r
- $nextNode = $this->installation->nodeBuilder->getNextNode();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'queue' => $this->queue\r
- ));\r
- \r
- $this->data = array(\r
- 'template' => WCF::getTPL()->fetch($this->templateName),\r
- 'step' => 'install',\r
- 'node' => $nextNode,\r
- 'currentAction' => WCF::getLanguage()->get('wcf.package.installation.step.installing'),\r
- 'progress' => 0\r
- );\r
- }\r
- \r
- /**\r
- * @see wcf\action\AbstractDialogAction\AbstractDialogAction::validateStep()\r
- */\r
- protected function validateStep() {\r
- switch ($this->step) {\r
- case 'install':\r
- case 'prepare':\r
- continue;\r
- break;\r
- \r
- default:\r
- throw new IllegalLinkException();\r
- break;\r
- }\r
- }\r
-}\r
+<?php
+namespace wcf\acp\action;
+use wcf\action\AbstractDialogAction;
+use wcf\data\package\installation\queue\PackageInstallationQueue;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * Handles an AJAX-based package installation.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.action
+ * @category Community Framework
+ */
+class InstallPackageAction extends AbstractDialogAction {
+ /**
+ * current node
+ *
+ * @var string
+ */
+ public $node = '';
+
+ /**
+ * PackageInstallationDispatcher object
+ *
+ * @var PackageInstallationDispatcher
+ */
+ public $installation = null;
+
+ /**
+ * PackageInstallationQueue object
+ *
+ * @var PackageInstallationQueue
+ */
+ public $queue = null;
+
+ /**
+ * current queue id
+ *
+ * @var integer
+ */
+ public $queueID = 0;
+
+ // system
+ public $templateName = 'packageInstallationStep';
+
+ /**
+ * @see wcf\action\IAction::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_POST['node'])) $this->node = StringUtil::trim($_POST['node']);
+ if (isset($_POST['queueID'])) $this->queueID = intval($_POST['queueID']);
+ $this->queue = new PackageInstallationQueue($this->queueID);
+
+ if (!$this->queue->queueID) {
+ throw new IllegalLinkException();
+ }
+
+ $this->installation = new PackageInstallationDispatcher($this->queue);
+ }
+
+ /**
+ * Executes installation based upon nodes.
+ */
+ protected function stepInstall() {
+ $step = $this->installation->install($this->node);
+
+ if ($step->hasDocument()) {
+ $this->data = array(
+ 'innerTemplate' => $step->getTemplate(),
+ 'node' => $step->getNode(),
+ 'progress' => $this->installation->nodeBuilder->calculateProgress($this->node),
+ 'step' => 'install'
+ );
+ }
+ else {
+ if ($step->getNode() == '') {
+ // perform final actions
+ $queueID = $this->installation->completeSetup();
+
+ // begin with next queue
+ if ($queueID) {
+ $this->data = array(
+ 'progress' => 100,
+ 'queueID' => $queueID,
+ 'step' => 'prepare'
+ );
+ return;
+ }
+
+ // no more queues, show success
+ $this->data = array(
+ 'progress' => 100,
+ 'step' => 'success'
+ );
+ return;
+ }
+
+ // continue with next node
+ $this->data = array(
+ 'step' => 'install',
+ 'node' => $step->getNode(),
+ 'progress' => $this->installation->nodeBuilder->calculateProgress($this->node)
+ );
+ }
+ }
+
+ /**
+ * Prepares the installation process.
+ */
+ protected function stepPrepare() {
+ // update package information
+ $this->installation->updatePackage();
+
+ // clean-up previously created nodes
+ $this->installation->nodeBuilder->purgeNodes();
+
+ // create node tree
+ $this->installation->nodeBuilder->buildNodes();
+ $nextNode = $this->installation->nodeBuilder->getNextNode();
+
+ WCF::getTPL()->assign(array(
+ 'queue' => $this->queue
+ ));
+
+ $this->data = array(
+ 'template' => WCF::getTPL()->fetch($this->templateName),
+ 'step' => 'install',
+ 'node' => $nextNode,
+ 'currentAction' => WCF::getLanguage()->get('wcf.package.installation.step.installing'),
+ 'progress' => 0
+ );
+ }
+
+ /**
+ * @see wcf\action\AbstractDialogAction\AbstractDialogAction::validateStep()
+ */
+ protected function validateStep() {
+ switch ($this->step) {
+ case 'install':
+ case 'prepare':
+ continue;
+ break;
+
+ default:
+ throw new IllegalLinkException();
+ break;
+ }
+ }
+}
-<?php\r
-namespace wcf\acp\action;\r
-use wcf\action\AbstractSecureAction;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-use wcf\util\HeaderUtil;\r
-\r
-/**\r
- * Does the user logout in the admin control panel.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category Community Framework\r
- */\r
-class LogoutAction extends AbstractSecureAction {\r
- /**\r
- * @see wcf\action\IAction::execute()\r
- */\r
- public function execute() {\r
- parent::execute();\r
- \r
- // validate\r
- if (!WCF::getUser()->userID) {\r
- throw new IllegalLinkException();\r
- }\r
- \r
- // do logout\r
- WCF::getSession()->delete();\r
- \r
- $this->executed();\r
- \r
- // forward to index page\r
- // warning: if doLogout() writes a cookie this is buggy in MS IIS\r
- HeaderUtil::redirect('index.php'.SID_ARG_1ST);\r
- exit;\r
- }\r
-}\r
+<?php
+namespace wcf\acp\action;
+use wcf\action\AbstractSecureAction;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+use wcf\util\HeaderUtil;
+
+/**
+ * Does the user logout in the admin control panel.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.action
+ * @category Community Framework
+ */
+class LogoutAction extends AbstractSecureAction {
+ /**
+ * @see wcf\action\IAction::execute()
+ */
+ public function execute() {
+ parent::execute();
+
+ // validate
+ if (!WCF::getUser()->userID) {
+ throw new IllegalLinkException();
+ }
+
+ // do logout
+ WCF::getSession()->delete();
+
+ $this->executed();
+
+ // forward to index page
+ // warning: if doLogout() writes a cookie this is buggy in MS IIS
+ HeaderUtil::redirect('index.php'.SID_ARG_1ST);
+ exit;
+ }
+}
-<?php\r
-namespace wcf\acp\action;\r
-use wcf\action\AbstractAction;\r
-use wcf\data\option\Option;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Exports the options to an XML.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category Community Framework\r
- */\r
-class OptionExportAction extends AbstractAction {\r
- /**\r
- * @see wcf\action\AbstractAction\AbstractAction::$neededPermissions\r
- */\r
- public $neededPermissions = array('admin.system.canEditOption');\r
- \r
- /**\r
- * @see wcf\action\IAction::execute();\r
- */\r
- public function execute() {\r
- parent::execute();\r
- \r
- // header\r
- @header('Content-type: text/xml');\r
- \r
- // file name\r
- @header('Content-disposition: attachment; filename="options.xml"');\r
- \r
- // no cache headers\r
- @header('Pragma: no-cache');\r
- @header('Expires: 0');\r
- \r
- // content\r
- echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<options>\n";\r
- \r
- $options = Option::getOptions();\r
- foreach ($options as $option) {\r
- echo "\t<option>\n";\r
- echo "\t\t<name><![CDATA[".StringUtil::escapeCDATA($option['optionName'])."]]></name>\n";\r
- echo "\t\t<value><![CDATA[".StringUtil::escapeCDATA($option['optionValue'])."]]></value>\n";\r
- echo "\t</option>\n";\r
- }\r
- \r
- echo '</options>';\r
- $this->executed();\r
- exit;\r
- }\r
-}\r
+<?php
+namespace wcf\acp\action;
+use wcf\action\AbstractAction;
+use wcf\data\option\Option;
+use wcf\util\StringUtil;
+
+/**
+ * Exports the options to an XML.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.action
+ * @category Community Framework
+ */
+class OptionExportAction extends AbstractAction {
+ /**
+ * @see wcf\action\AbstractAction\AbstractAction::$neededPermissions
+ */
+ public $neededPermissions = array('admin.system.canEditOption');
+
+ /**
+ * @see wcf\action\IAction::execute();
+ */
+ public function execute() {
+ parent::execute();
+
+ // header
+ @header('Content-type: text/xml');
+
+ // file name
+ @header('Content-disposition: attachment; filename="options.xml"');
+
+ // no cache headers
+ @header('Pragma: no-cache');
+ @header('Expires: 0');
+
+ // content
+ echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<options>\n";
+
+ $options = Option::getOptions();
+ foreach ($options as $option) {
+ echo "\t<option>\n";
+ echo "\t\t<name><![CDATA[".StringUtil::escapeCDATA($option['optionName'])."]]></name>\n";
+ echo "\t\t<value><![CDATA[".StringUtil::escapeCDATA($option['optionValue'])."]]></value>\n";
+ echo "\t</option>\n";
+ }
+
+ echo '</options>';
+ $this->executed();
+ exit;
+ }
+}
-<?php\r
-namespace wcf\acp\action;\r
-use wcf\action\AbstractDialogAction;\r
-use wcf\data\package\Package;\r
-use wcf\data\package\installation\queue\PackageInstallationQueue;\r
-use wcf\data\package\installation\queue\PackageInstallationQueueEditor;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\package\PackageUninstallationDispatcher;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Handles an AJAX-based package uninstallation.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.action\r
- * @category Community Framework\r
- */\r
-class UninstallPackageAction extends InstallPackageAction {\r
- /**\r
- * active package id\r
- *\r
- * @var integer\r
- */\r
- protected $packageID = 0;\r
- \r
- // system\r
- public $templateName = 'packageUninstallationStep';\r
- \r
- /**\r
- * @see wcf\action\IAction::readParameters()\r
- */\r
- public function readParameters() {\r
- AbstractDialogAction::readParameters();\r
- \r
- if (isset($_POST['node'])) $this->node = StringUtil::trim($_POST['node']);\r
- \r
- if (isset($_POST['packageID'])) {\r
- $this->packageID = intval($_POST['packageID']);\r
- }\r
- else {\r
- if (isset($_POST['queueID'])) $this->queueID = intval($_POST['queueID']);\r
- $this->queue = new PackageInstallationQueue($this->queueID);\r
- \r
- if (!$this->queue->queueID) {\r
- throw new IllegalLinkException();\r
- }\r
- \r
- $this->installation = new PackageUninstallationDispatcher($this->queue);\r
- }\r
- }\r
- \r
- /**\r
- * Prepares the uninstallation process.\r
- */\r
- protected function stepPrepare() {\r
- $package = new Package($this->packageID);\r
- if (!$package->packageID) {\r
- throw new IllegalLinkException();\r
- }\r
- \r
- if (PackageUninstallationDispatcher::hasDependencies($package->packageID)) {\r
- throw new SystemException('hasDependencies');\r
- }\r
- else {\r
- // get new process no\r
- $processNo = PackageInstallationQueue::getNewProcessNo();\r
- \r
- // create queue\r
- $queue = PackageInstallationQueueEditor::create(array(\r
- 'processNo' => $processNo,\r
- 'userID' => WCF::getUser()->userID,\r
- 'packageName' => $package->getName(),\r
- 'packageID' => $package->packageID,\r
- 'action' => 'uninstall',\r
- 'cancelable' => 0\r
- ));\r
- \r
- // initialize uninstallation\r
- $this->installation = new PackageUninstallationDispatcher($queue);\r
- \r
- $this->installation->nodeBuilder->purgeNodes();\r
- $this->installation->nodeBuilder->buildNodes();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'queue' => $queue\r
- ));\r
- \r
- $this->data = array(\r
- 'template' => WCF::getTPL()->fetch($this->templateName),\r
- 'step' => 'uninstall',\r
- 'node' => $this->installation->nodeBuilder->getNextNode(),\r
- 'currentAction' => WCF::getLanguage()->get('wcf.package.installation.step.uninstalling'),\r
- 'progress' => 0,\r
- 'queueID' => $queue->queueID\r
- );\r
- }\r
- }\r
- \r
- /**\r
- * Uninstalls node components and returns next node.\r
- *\r
- * @param string $node\r
- * @return string\r
- */\r
- public function stepUninstall() {\r
- $node = $this->installation->uninstall($this->node);\r
- \r
- if ($node == '') {\r
- // remove node data\r
- $this->installation->nodeBuilder->purgeNodes();\r
- \r
- // TODO: Show 'success' template at this point\r
- $this->data = array(\r
- 'progress' => 100,\r
- 'step' => 'success'\r
- );\r
- return;\r
- }\r
- \r
- // continue with next node\r
- $this->data = array(\r
- 'step' => 'uninstall',\r
- 'node' => $node,\r
- 'progress' => $this->installation->nodeBuilder->calculateProgress($this->node)\r
- );\r
- }\r
- \r
- /**\r
- * @see AbstractDialogAction::validateStep()\r
- */\r
- protected function validateStep() {\r
- switch ($this->step) {\r
- case 'prepare':\r
- case 'uninstall':\r
- continue;\r
- break;\r
- \r
- default:\r
- die(print_r($_POST, true));\r
- throw new IllegalLinkException();\r
- break;\r
- }\r
- }\r
-}\r
+<?php
+namespace wcf\acp\action;
+use wcf\action\AbstractDialogAction;
+use wcf\data\package\Package;
+use wcf\data\package\installation\queue\PackageInstallationQueue;
+use wcf\data\package\installation\queue\PackageInstallationQueueEditor;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\SystemException;
+use wcf\system\package\PackageUninstallationDispatcher;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * Handles an AJAX-based package uninstallation.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.action
+ * @category Community Framework
+ */
+class UninstallPackageAction extends InstallPackageAction {
+ /**
+ * active package id
+ *
+ * @var integer
+ */
+ protected $packageID = 0;
+
+ // system
+ public $templateName = 'packageUninstallationStep';
+
+ /**
+ * @see wcf\action\IAction::readParameters()
+ */
+ public function readParameters() {
+ AbstractDialogAction::readParameters();
+
+ if (isset($_POST['node'])) $this->node = StringUtil::trim($_POST['node']);
+
+ if (isset($_POST['packageID'])) {
+ $this->packageID = intval($_POST['packageID']);
+ }
+ else {
+ if (isset($_POST['queueID'])) $this->queueID = intval($_POST['queueID']);
+ $this->queue = new PackageInstallationQueue($this->queueID);
+
+ if (!$this->queue->queueID) {
+ throw new IllegalLinkException();
+ }
+
+ $this->installation = new PackageUninstallationDispatcher($this->queue);
+ }
+ }
+
+ /**
+ * Prepares the uninstallation process.
+ */
+ protected function stepPrepare() {
+ $package = new Package($this->packageID);
+ if (!$package->packageID) {
+ throw new IllegalLinkException();
+ }
+
+ if (PackageUninstallationDispatcher::hasDependencies($package->packageID)) {
+ throw new SystemException('hasDependencies');
+ }
+ else {
+ // get new process no
+ $processNo = PackageInstallationQueue::getNewProcessNo();
+
+ // create queue
+ $queue = PackageInstallationQueueEditor::create(array(
+ 'processNo' => $processNo,
+ 'userID' => WCF::getUser()->userID,
+ 'packageName' => $package->getName(),
+ 'packageID' => $package->packageID,
+ 'action' => 'uninstall',
+ 'cancelable' => 0
+ ));
+
+ // initialize uninstallation
+ $this->installation = new PackageUninstallationDispatcher($queue);
+
+ $this->installation->nodeBuilder->purgeNodes();
+ $this->installation->nodeBuilder->buildNodes();
+
+ WCF::getTPL()->assign(array(
+ 'queue' => $queue
+ ));
+
+ $this->data = array(
+ 'template' => WCF::getTPL()->fetch($this->templateName),
+ 'step' => 'uninstall',
+ 'node' => $this->installation->nodeBuilder->getNextNode(),
+ 'currentAction' => WCF::getLanguage()->get('wcf.package.installation.step.uninstalling'),
+ 'progress' => 0,
+ 'queueID' => $queue->queueID
+ );
+ }
+ }
+
+ /**
+ * Uninstalls node components and returns next node.
+ *
+ * @param string $node
+ * @return string
+ */
+ public function stepUninstall() {
+ $node = $this->installation->uninstall($this->node);
+
+ if ($node == '') {
+ // remove node data
+ $this->installation->nodeBuilder->purgeNodes();
+
+ // TODO: Show 'success' template at this point
+ $this->data = array(
+ 'progress' => 100,
+ 'step' => 'success'
+ );
+ return;
+ }
+
+ // continue with next node
+ $this->data = array(
+ 'step' => 'uninstall',
+ 'node' => $node,
+ 'progress' => $this->installation->nodeBuilder->calculateProgress($this->node)
+ );
+ }
+
+ /**
+ * @see AbstractDialogAction::validateStep()
+ */
+ protected function validateStep() {
+ switch ($this->step) {
+ case 'prepare':
+ case 'uninstall':
+ continue;
+ break;
+
+ default:
+ die(print_r($_POST, true));
+ throw new IllegalLinkException();
+ break;
+ }
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\form\AbstractForm;\r
-\r
-/**\r
- * Provides a default implementation for the show method in acp forms.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class ACPForm extends AbstractForm {\r
- /**\r
- * Active acp menu item.\r
- * \r
- * @var string\r
- */\r
- public $activeMenuItem = '';\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- // enable menu item\r
- if (!empty($this->activeMenuItem)) ACPMenu::getInstance()->setActiveMenuItem($this->activeMenuItem);\r
- \r
- parent::show();\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\form\AbstractForm;
+
+/**
+ * Provides a default implementation for the show method in acp forms.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class ACPForm extends AbstractForm {
+ /**
+ * Active acp menu item.
+ *
+ * @var string
+ */
+ public $activeMenuItem = '';
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ // enable menu item
+ if (!empty($this->activeMenuItem)) ACPMenu::getInstance()->setActiveMenuItem($this->activeMenuItem);
+
+ parent::show();
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\option\category\OptionCategory;\r
-use wcf\data\option\Option;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * This class provides default implementations for a list of options.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-abstract class AbstractOptionListForm extends AbstractForm {\r
- /**\r
- * @see wcf\form\AbstractForm::$errorField\r
- */\r
- public $errorField = array();\r
- \r
- /**\r
- * @see wcf\form\AbstractForm::$errorType\r
- */\r
- public $errorType = array();\r
-\r
- /**\r
- * cache name\r
- * @var string\r
- */\r
- public $cacheName = 'option-';\r
- \r
- /**\r
- * cache class name\r
- * @var string\r
- */\r
- public $cacheClass = 'wcf\system\cache\builder\CacheBuilderOption';\r
-\r
- /**\r
- * list of all option categories\r
- * @var array<OptionCategory>\r
- */\r
- public $cachedCategories = array();\r
- \r
- /**\r
- * list of all options\r
- * @var array<Option>\r
- */\r
- public $cachedOptions = array();\r
- \r
- /**\r
- * category structure\r
- * @var array\r
- */\r
- public $cachedCategoryStructure = array();\r
- \r
- /**\r
- * option structure\r
- * @var array\r
- */\r
- public $cachedOptionToCategories = array();\r
- \r
- /**\r
- * raw option values\r
- * @var array<mixed>\r
- */\r
- public $rawValues = array();\r
- \r
- /**\r
- * option values\r
- * @var array<mixed>\r
- */\r
- public $optionValues = array();\r
- \r
- /**\r
- * Name of the active option category.\r
- * @var string\r
- */\r
- public $categoryName = '';\r
- \r
- /**\r
- * Options of the active category.\r
- * @var array<Option>\r
- */\r
- public $options = array();\r
- \r
- /**\r
- * Type object cache.\r
- * @var array\r
- */\r
- public $typeObjects = array();\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['values']) && is_array($_POST['values'])) $this->rawValues = $_POST['values'];\r
- }\r
-\r
- /**\r
- * Returns an object of the requested option type.\r
- * \r
- * @param string $type\r
- * @return wcf\system\option\IOptionType\r
- */\r
- protected function getTypeObject($type) {\r
- if (!isset($this->typeObjects[$type])) {\r
- $className = 'wcf\system\option\OptionType'.ucfirst($type);\r
- \r
- // validate class\r
- if (!class_exists($className)) {\r
- throw new SystemException("unable to find class '".$className."'", 11001);\r
- }\r
- if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\IOptionType')) {\r
- throw new SystemException("'".$className."' should implement wcf\system\option\IOptionType");\r
- }\r
- // create instance\r
- $this->typeObjects[$type] = new $className();\r
- }\r
- \r
- return $this->typeObjects[$type];\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- parent::validate();\r
- \r
- foreach ($this->options as $option) {\r
- try {\r
- $this->validateOption($option);\r
- }\r
- catch (UserInputException $e) {\r
- $this->errorType[$e->getField()] = $e->getType();\r
- }\r
- }\r
- \r
- if (count($this->errorType) > 0) {\r
- throw new UserInputException('options', $this->errorType);\r
- }\r
- }\r
- \r
- /**\r
- * Validates an option.\r
- * \r
- * @param Option $option\r
- */\r
- protected function validateOption(Option $option) {\r
- // get type object\r
- $typeObj = $this->getTypeObject($option->optionType);\r
- \r
- // get new value\r
- $newValue = isset($this->rawValues[$option->optionName]) ? $this->rawValues[$option->optionName] : null;\r
- \r
- // get save value\r
- $this->optionValues[$option->optionName] = $typeObj->getData($option, $newValue);\r
- \r
- // validate with pattern\r
- if ($option->validationPattern) {\r
- if (!preg_match('~'.$option->validationPattern.'~', $this->optionValues[$option->optionName])) {\r
- throw new UserInputException($option->optionName, 'validationFailed');\r
- }\r
- }\r
- \r
- // validate by type object\r
- $typeObj->validate($option, $newValue);\r
- }\r
- \r
- /**\r
- * Gets all options and option categories from cache.\r
- */\r
- protected function readCache() {\r
- // init cache\r
- $cacheName = $this->cacheName.PACKAGE_ID;\r
- CacheHandler::getInstance()->addResource($cacheName, WCF_DIR.'cache/cache.'.$cacheName.'.php', $this->cacheClass);\r
- \r
- // get cache contents\r
- $this->cachedCategories = CacheHandler::getInstance()->get($cacheName, 'categories');\r
- $this->cachedOptions = CacheHandler::getInstance()->get($cacheName, 'options');\r
- $this->cachedCategoryStructure = CacheHandler::getInstance()->get($cacheName, 'categoryStructure');\r
- $this->cachedOptionToCategories = CacheHandler::getInstance()->get($cacheName, 'optionToCategories');\r
- \r
- // get active options\r
- $this->loadActiveOptions($this->categoryName);\r
- }\r
- \r
- /**\r
- * Creates a list of all active options.\r
- * \r
- * @param string $parentCategoryName\r
- */\r
- protected function loadActiveOptions($parentCategoryName) {\r
- if (!isset($this->cachedCategories[$parentCategoryName]) || static::checkCategory($this->cachedCategories[$parentCategoryName])) {\r
- if (isset($this->cachedOptionToCategories[$parentCategoryName])) {\r
- foreach ($this->cachedOptionToCategories[$parentCategoryName] as $optionName) {\r
- if (static::checkOption($this->cachedOptions[$optionName])) {\r
- $this->options[$optionName] = $this->cachedOptions[$optionName];\r
- }\r
- }\r
- }\r
- if (isset($this->cachedCategoryStructure[$parentCategoryName])) {\r
- foreach ($this->cachedCategoryStructure[$parentCategoryName] as $categoryName) {\r
- $this->loadActiveOptions($categoryName);\r
- }\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Checks the required permissions and options of a category.\r
- * \r
- * @param OptionCategory $category\r
- * @return boolean\r
- */\r
- protected static function checkCategory(OptionCategory $category) {\r
- if ($category->permissions) {\r
- $hasPermission = false;\r
- $permissions = explode(',', $category->permissions);\r
- foreach ($permissions as $permission) {\r
- if (WCF::getSession()->getPermission($permission)) {\r
- $hasPermission = true;\r
- break;\r
- }\r
- }\r
- \r
- if (!$hasPermission) return false;\r
- \r
- }\r
- if ($category->options) {\r
- $hasEnabledOption = false;\r
- $options = explode(',', strtoupper($category->options));\r
- foreach ($options as $option) {\r
- if (defined($option) && constant($option)) {\r
- $hasEnabledOption = true;\r
- break;\r
- }\r
- }\r
- \r
- if (!$hasEnabledOption) return false;\r
- }\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- protected function getFormElement($type, Option $option) {\r
- return $this->getTypeObject($type)->getFormElement($option, (isset($this->optionValues[$option->optionName]) ? $this->optionValues[$option->optionName] : null));\r
- }\r
- \r
- /**\r
- * Checks the required permissions and options of an option.\r
- * \r
- * @param Option $option\r
- * @return boolean\r
- */\r
- protected static function checkOption(Option $option) {\r
- if ($option->permissions) {\r
- $hasPermission = false;\r
- $permissions = explode(',', $option->permissions);\r
- foreach ($permissions as $permission) {\r
- if (WCF::getSession()->getPermission($permission)) {\r
- $hasPermission = true;\r
- break;\r
- }\r
- }\r
- \r
- if (!$hasPermission) return false;\r
- \r
- }\r
- if ($option->options) {\r
- $hasEnabledOption = false;\r
- $options = explode(',', strtoupper($option->options));\r
- foreach ($options as $option) {\r
- if (defined($option) && constant($option)) {\r
- $hasEnabledOption = true;\r
- break;\r
- }\r
- }\r
- \r
- if (!$hasEnabledOption) return false;\r
- }\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * Returns the tree of options.\r
- * \r
- * @param string $parentCategoryName\r
- * @param integer $level\r
- * @return array\r
- */\r
- protected function getOptionTree($parentCategoryName = '', $level = 0) {\r
- $tree = array();\r
- \r
- if (isset($this->cachedCategoryStructure[$parentCategoryName])) {\r
- // get super categories\r
- foreach ($this->cachedCategoryStructure[$parentCategoryName] as $superCategoryName) {\r
- $superCategoryObject = $this->cachedCategories[$superCategoryName];\r
- $superCategory = array(\r
- 'object' => $superCategoryObject,\r
- 'categories' => array(),\r
- 'options' => array()\r
- );\r
- \r
- if (static::checkCategory($superCategoryObject)) {\r
- if ($level <= 1) {\r
- $superCategory['categories'] = $this->getOptionTree($superCategoryName, $level + 1);\r
- }\r
- if ($level > 1 || count($superCategory['categories']) == 0) {\r
- $superCategory['options'] = $this->getCategoryOptions($superCategoryName);\r
- }\r
- else {\r
- $superCategory['options'] = $this->getCategoryOptions($superCategoryName, false);\r
- }\r
- \r
- if (count($superCategory['categories']) > 0 || count($superCategory['options']) > 0) {\r
- $tree[] = $superCategory;\r
- }\r
- }\r
- }\r
- }\r
- \r
- return $tree;\r
- }\r
- \r
- /**\r
- * Returns a list with the options of a specific option category.\r
- * \r
- * @param string $categoryName\r
- * @param boolean $inherit\r
- * @return array\r
- */\r
- protected function getCategoryOptions($categoryName = '', $inherit = true) {\r
- $children = array();\r
- \r
- // get sub categories\r
- if ($inherit && isset($this->cachedCategoryStructure[$categoryName])) {\r
- foreach ($this->cachedCategoryStructure[$categoryName] as $subCategoryName) {\r
- $children = array_merge($children, $this->getCategoryOptions($subCategoryName));\r
- }\r
- }\r
- \r
- // get options\r
- if (isset($this->cachedOptionToCategories[$categoryName])) {\r
- $i = 0;\r
- $last = count($this->cachedOptionToCategories[$categoryName]) - 1;\r
- foreach ($this->cachedOptionToCategories[$categoryName] as $optionName) {\r
- if (!isset($this->options[$optionName]) || !$this->checkOption($this->options[$optionName])) continue;\r
- \r
- // get option object\r
- $option = $this->options[$optionName];\r
- \r
- // get form element html\r
- $html = $this->getFormElement($option->optionType, $option);\r
- \r
- // add option to list\r
- $children[] = array(\r
- 'object' => $option,\r
- 'html' => $html\r
- );\r
- \r
- $i++;\r
- }\r
- }\r
- \r
- return $children;\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\option\category\OptionCategory;
+use wcf\data\option\Option;
+use wcf\form\AbstractForm;
+use wcf\system\cache\CacheHandler;
+use wcf\system\exception\SystemException;
+use wcf\util\ClassUtil;
+
+/**
+ * This class provides default implementations for a list of options.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+abstract class AbstractOptionListForm extends AbstractForm {
+ /**
+ * @see wcf\form\AbstractForm::$errorField
+ */
+ public $errorField = array();
+
+ /**
+ * @see wcf\form\AbstractForm::$errorType
+ */
+ public $errorType = array();
+
+ /**
+ * cache name
+ * @var string
+ */
+ public $cacheName = 'option-';
+
+ /**
+ * cache class name
+ * @var string
+ */
+ public $cacheClass = 'wcf\system\cache\builder\CacheBuilderOption';
+
+ /**
+ * list of all option categories
+ * @var array<OptionCategory>
+ */
+ public $cachedCategories = array();
+
+ /**
+ * list of all options
+ * @var array<Option>
+ */
+ public $cachedOptions = array();
+
+ /**
+ * category structure
+ * @var array
+ */
+ public $cachedCategoryStructure = array();
+
+ /**
+ * option structure
+ * @var array
+ */
+ public $cachedOptionToCategories = array();
+
+ /**
+ * raw option values
+ * @var array<mixed>
+ */
+ public $rawValues = array();
+
+ /**
+ * option values
+ * @var array<mixed>
+ */
+ public $optionValues = array();
+
+ /**
+ * Name of the active option category.
+ * @var string
+ */
+ public $categoryName = '';
+
+ /**
+ * Options of the active category.
+ * @var array<Option>
+ */
+ public $options = array();
+
+ /**
+ * Type object cache.
+ * @var array
+ */
+ public $typeObjects = array();
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['values']) && is_array($_POST['values'])) $this->rawValues = $_POST['values'];
+ }
+
+ /**
+ * Returns an object of the requested option type.
+ *
+ * @param string $type
+ * @return wcf\system\option\IOptionType
+ */
+ protected function getTypeObject($type) {
+ if (!isset($this->typeObjects[$type])) {
+ $className = 'wcf\system\option\OptionType'.ucfirst($type);
+
+ // validate class
+ if (!class_exists($className)) {
+ throw new SystemException("unable to find class '".$className."'", 11001);
+ }
+ if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\IOptionType')) {
+ throw new SystemException("'".$className."' should implement wcf\system\option\IOptionType");
+ }
+ // create instance
+ $this->typeObjects[$type] = new $className();
+ }
+
+ return $this->typeObjects[$type];
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ parent::validate();
+
+ foreach ($this->options as $option) {
+ try {
+ $this->validateOption($option);
+ }
+ catch (UserInputException $e) {
+ $this->errorType[$e->getField()] = $e->getType();
+ }
+ }
+
+ if (count($this->errorType) > 0) {
+ throw new UserInputException('options', $this->errorType);
+ }
+ }
+
+ /**
+ * Validates an option.
+ *
+ * @param Option $option
+ */
+ protected function validateOption(Option $option) {
+ // get type object
+ $typeObj = $this->getTypeObject($option->optionType);
+
+ // get new value
+ $newValue = isset($this->rawValues[$option->optionName]) ? $this->rawValues[$option->optionName] : null;
+
+ // get save value
+ $this->optionValues[$option->optionName] = $typeObj->getData($option, $newValue);
+
+ // validate with pattern
+ if ($option->validationPattern) {
+ if (!preg_match('~'.$option->validationPattern.'~', $this->optionValues[$option->optionName])) {
+ throw new UserInputException($option->optionName, 'validationFailed');
+ }
+ }
+
+ // validate by type object
+ $typeObj->validate($option, $newValue);
+ }
+
+ /**
+ * Gets all options and option categories from cache.
+ */
+ protected function readCache() {
+ // init cache
+ $cacheName = $this->cacheName.PACKAGE_ID;
+ CacheHandler::getInstance()->addResource($cacheName, WCF_DIR.'cache/cache.'.$cacheName.'.php', $this->cacheClass);
+
+ // get cache contents
+ $this->cachedCategories = CacheHandler::getInstance()->get($cacheName, 'categories');
+ $this->cachedOptions = CacheHandler::getInstance()->get($cacheName, 'options');
+ $this->cachedCategoryStructure = CacheHandler::getInstance()->get($cacheName, 'categoryStructure');
+ $this->cachedOptionToCategories = CacheHandler::getInstance()->get($cacheName, 'optionToCategories');
+
+ // get active options
+ $this->loadActiveOptions($this->categoryName);
+ }
+
+ /**
+ * Creates a list of all active options.
+ *
+ * @param string $parentCategoryName
+ */
+ protected function loadActiveOptions($parentCategoryName) {
+ if (!isset($this->cachedCategories[$parentCategoryName]) || static::checkCategory($this->cachedCategories[$parentCategoryName])) {
+ if (isset($this->cachedOptionToCategories[$parentCategoryName])) {
+ foreach ($this->cachedOptionToCategories[$parentCategoryName] as $optionName) {
+ if (static::checkOption($this->cachedOptions[$optionName])) {
+ $this->options[$optionName] = $this->cachedOptions[$optionName];
+ }
+ }
+ }
+ if (isset($this->cachedCategoryStructure[$parentCategoryName])) {
+ foreach ($this->cachedCategoryStructure[$parentCategoryName] as $categoryName) {
+ $this->loadActiveOptions($categoryName);
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks the required permissions and options of a category.
+ *
+ * @param OptionCategory $category
+ * @return boolean
+ */
+ protected static function checkCategory(OptionCategory $category) {
+ if ($category->permissions) {
+ $hasPermission = false;
+ $permissions = explode(',', $category->permissions);
+ foreach ($permissions as $permission) {
+ if (WCF::getSession()->getPermission($permission)) {
+ $hasPermission = true;
+ break;
+ }
+ }
+
+ if (!$hasPermission) return false;
+
+ }
+ if ($category->options) {
+ $hasEnabledOption = false;
+ $options = explode(',', strtoupper($category->options));
+ foreach ($options as $option) {
+ if (defined($option) && constant($option)) {
+ $hasEnabledOption = true;
+ break;
+ }
+ }
+
+ if (!$hasEnabledOption) return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ protected function getFormElement($type, Option $option) {
+ return $this->getTypeObject($type)->getFormElement($option, (isset($this->optionValues[$option->optionName]) ? $this->optionValues[$option->optionName] : null));
+ }
+
+ /**
+ * Checks the required permissions and options of an option.
+ *
+ * @param Option $option
+ * @return boolean
+ */
+ protected static function checkOption(Option $option) {
+ if ($option->permissions) {
+ $hasPermission = false;
+ $permissions = explode(',', $option->permissions);
+ foreach ($permissions as $permission) {
+ if (WCF::getSession()->getPermission($permission)) {
+ $hasPermission = true;
+ break;
+ }
+ }
+
+ if (!$hasPermission) return false;
+
+ }
+ if ($option->options) {
+ $hasEnabledOption = false;
+ $options = explode(',', strtoupper($option->options));
+ foreach ($options as $option) {
+ if (defined($option) && constant($option)) {
+ $hasEnabledOption = true;
+ break;
+ }
+ }
+
+ if (!$hasEnabledOption) return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns the tree of options.
+ *
+ * @param string $parentCategoryName
+ * @param integer $level
+ * @return array
+ */
+ protected function getOptionTree($parentCategoryName = '', $level = 0) {
+ $tree = array();
+
+ if (isset($this->cachedCategoryStructure[$parentCategoryName])) {
+ // get super categories
+ foreach ($this->cachedCategoryStructure[$parentCategoryName] as $superCategoryName) {
+ $superCategoryObject = $this->cachedCategories[$superCategoryName];
+ $superCategory = array(
+ 'object' => $superCategoryObject,
+ 'categories' => array(),
+ 'options' => array()
+ );
+
+ if (static::checkCategory($superCategoryObject)) {
+ if ($level <= 1) {
+ $superCategory['categories'] = $this->getOptionTree($superCategoryName, $level + 1);
+ }
+ if ($level > 1 || count($superCategory['categories']) == 0) {
+ $superCategory['options'] = $this->getCategoryOptions($superCategoryName);
+ }
+ else {
+ $superCategory['options'] = $this->getCategoryOptions($superCategoryName, false);
+ }
+
+ if (count($superCategory['categories']) > 0 || count($superCategory['options']) > 0) {
+ $tree[] = $superCategory;
+ }
+ }
+ }
+ }
+
+ return $tree;
+ }
+
+ /**
+ * Returns a list with the options of a specific option category.
+ *
+ * @param string $categoryName
+ * @param boolean $inherit
+ * @return array
+ */
+ protected function getCategoryOptions($categoryName = '', $inherit = true) {
+ $children = array();
+
+ // get sub categories
+ if ($inherit && isset($this->cachedCategoryStructure[$categoryName])) {
+ foreach ($this->cachedCategoryStructure[$categoryName] as $subCategoryName) {
+ $children = array_merge($children, $this->getCategoryOptions($subCategoryName));
+ }
+ }
+
+ // get options
+ if (isset($this->cachedOptionToCategories[$categoryName])) {
+ $i = 0;
+ $last = count($this->cachedOptionToCategories[$categoryName]) - 1;
+ foreach ($this->cachedOptionToCategories[$categoryName] as $optionName) {
+ if (!isset($this->options[$optionName]) || !$this->checkOption($this->options[$optionName])) continue;
+
+ // get option object
+ $option = $this->options[$optionName];
+
+ // get form element html
+ $html = $this->getFormElement($option->optionType, $option);
+
+ // add option to list
+ $children[] = array(
+ 'object' => $option,
+ 'html' => $html
+ );
+
+ $i++;
+ }
+ }
+
+ return $children;
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\cronjob\CronjobAction;\r
-use wcf\data\package\Package;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\WCF;\r
-use wcf\util\CronjobUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the cronjobs add form.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class CronjobAddForm extends ACPForm {\r
- /**\r
- * @see wcf\page\AbstractPage::$templateName\r
- */\r
- public $templateName = 'cronjobAdd';\r
- \r
- /**\r
- * @see wcf\acp\form\ACPForm::$activeMenuItem\r
- */\r
- public $activeMenuItem = 'wcf.acp.menu.link.cronjobs.add';\r
- \r
- /**\r
- * @see wcf\page\AbstractPage::$neededPermissions\r
- */\r
- public $neededPermissions = array('admin.system.cronjobs.canAddCronjob');\r
- \r
- /**\r
- * cronjob class name\r
- * @var string\r
- */\r
- public $className = '';\r
- \r
- /**\r
- * cronjob package id\r
- * @var integer\r
- */\r
- public $packageID = PACKAGE_ID;\r
- \r
- /**\r
- * cronjob description\r
- * @var string\r
- */\r
- public $description = '';\r
- \r
- /**\r
- * execution time (min)\r
- * @var string\r
- */\r
- public $startMinute = '*';\r
- \r
- /**\r
- * execution time (hour)\r
- * @var string\r
- */\r
- public $startHour = '*';\r
- \r
- /**\r
- * execution time (day of month)\r
- * @var string\r
- */\r
- public $startDom = '*';\r
- \r
- /**\r
- * execution time (month)\r
- * @var string\r
- */\r
- public $startMonth = '*';\r
- \r
- /**\r
- * execution time (day of week)\r
- * @var string\r
- */\r
- public $startDow = '*';\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['className'])) $this->className = StringUtil::trim($_POST['className']);\r
- if (isset($_POST['description'])) $this->description = StringUtil::trim($_POST['description']);\r
- if (isset($_POST['startMinute'])) $this->startMinute = StringUtil::replace(' ', '', $_POST['startMinute']);\r
- if (isset($_POST['startHour'])) $this->startHour = StringUtil::replace(' ', '', $_POST['startHour']);\r
- if (isset($_POST['startDom'])) $this->startDom = StringUtil::replace(' ', '', $_POST['startDom']);\r
- if (isset($_POST['startMonth'])) $this->startMonth = StringUtil::replace(' ', '', $_POST['startMonth']);\r
- if (isset($_POST['startDow'])) $this->startDow = StringUtil::replace(' ', '', $_POST['startDow']);\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- parent::validate();\r
- \r
- // validate class name\r
- if (empty($this->className)) {\r
- throw new UserInputException('className');\r
- }\r
- \r
- if (!class_exists($this->className)) {\r
- throw new UserInputException('className', 'doesNotExist');\r
- }\r
- \r
- try {\r
- CronjobUtil::validate($this->startMinute, $this->startHour, $this->startDom, $this->startMonth, $this->startDow);\r
- } \r
- catch (SystemException $e) {\r
- // extract field name\r
- $fieldName = '';\r
- if (preg_match("/cronjob attribute '(.*)'/", $e->getMessage(), $match)) {\r
- $fieldName = $match[1];\r
- }\r
- \r
- throw new UserInputException($fieldName, 'notValid');\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- parent::save();\r
- \r
- // save cronjob\r
- $data = array(\r
- 'className' => $this->className,\r
- 'packageID' => $this->packageID,\r
- 'description' => $this->description,\r
- 'startMinute' => $this->startMinute,\r
- 'startHour' => $this->startHour,\r
- 'startDom' => $this->startDom,\r
- 'startMonth' => $this->startMonth,\r
- 'startDow' => $this->startDow\r
- );\r
- \r
- $cronjobAction = new CronjobAction(array(), 'create', array('data' => $data));\r
- $cronjobAction->executeAction();\r
- $this->saved();\r
- \r
- // reset values\r
- $this->className = $this->description = '';\r
- $this->startMinute = $this->startHour = $this->startDom = $this->startMonth = $this->startDow = '*';\r
- \r
- // show success.\r
- WCF::getTPL()->assign(array(\r
- 'success' => true\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'className' => $this->className,\r
- 'description' => $this->description,\r
- 'startMinute' => $this->startMinute,\r
- 'startHour' => $this->startHour,\r
- 'startDom' => $this->startDom,\r
- 'startMonth' => $this->startMonth,\r
- 'startDow' => $this->startDow,\r
- 'action' => 'add'\r
- ));\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\cronjob\CronjobAction;
+use wcf\data\package\Package;
+use wcf\system\exception\SystemException;
+use wcf\system\exception\UserInputException;
+use wcf\system\WCF;
+use wcf\util\CronjobUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the cronjobs add form.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class CronjobAddForm extends ACPForm {
+ /**
+ * @see wcf\page\AbstractPage::$templateName
+ */
+ public $templateName = 'cronjobAdd';
+
+ /**
+ * @see wcf\acp\form\ACPForm::$activeMenuItem
+ */
+ public $activeMenuItem = 'wcf.acp.menu.link.cronjobs.add';
+
+ /**
+ * @see wcf\page\AbstractPage::$neededPermissions
+ */
+ public $neededPermissions = array('admin.system.cronjobs.canAddCronjob');
+
+ /**
+ * cronjob class name
+ * @var string
+ */
+ public $className = '';
+
+ /**
+ * cronjob package id
+ * @var integer
+ */
+ public $packageID = PACKAGE_ID;
+
+ /**
+ * cronjob description
+ * @var string
+ */
+ public $description = '';
+
+ /**
+ * execution time (min)
+ * @var string
+ */
+ public $startMinute = '*';
+
+ /**
+ * execution time (hour)
+ * @var string
+ */
+ public $startHour = '*';
+
+ /**
+ * execution time (day of month)
+ * @var string
+ */
+ public $startDom = '*';
+
+ /**
+ * execution time (month)
+ * @var string
+ */
+ public $startMonth = '*';
+
+ /**
+ * execution time (day of week)
+ * @var string
+ */
+ public $startDow = '*';
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['className'])) $this->className = StringUtil::trim($_POST['className']);
+ if (isset($_POST['description'])) $this->description = StringUtil::trim($_POST['description']);
+ if (isset($_POST['startMinute'])) $this->startMinute = StringUtil::replace(' ', '', $_POST['startMinute']);
+ if (isset($_POST['startHour'])) $this->startHour = StringUtil::replace(' ', '', $_POST['startHour']);
+ if (isset($_POST['startDom'])) $this->startDom = StringUtil::replace(' ', '', $_POST['startDom']);
+ if (isset($_POST['startMonth'])) $this->startMonth = StringUtil::replace(' ', '', $_POST['startMonth']);
+ if (isset($_POST['startDow'])) $this->startDow = StringUtil::replace(' ', '', $_POST['startDow']);
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ parent::validate();
+
+ // validate class name
+ if (empty($this->className)) {
+ throw new UserInputException('className');
+ }
+
+ if (!class_exists($this->className)) {
+ throw new UserInputException('className', 'doesNotExist');
+ }
+
+ try {
+ CronjobUtil::validate($this->startMinute, $this->startHour, $this->startDom, $this->startMonth, $this->startDow);
+ }
+ catch (SystemException $e) {
+ // extract field name
+ $fieldName = '';
+ if (preg_match("/cronjob attribute '(.*)'/", $e->getMessage(), $match)) {
+ $fieldName = $match[1];
+ }
+
+ throw new UserInputException($fieldName, 'notValid');
+ }
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ parent::save();
+
+ // save cronjob
+ $data = array(
+ 'className' => $this->className,
+ 'packageID' => $this->packageID,
+ 'description' => $this->description,
+ 'startMinute' => $this->startMinute,
+ 'startHour' => $this->startHour,
+ 'startDom' => $this->startDom,
+ 'startMonth' => $this->startMonth,
+ 'startDow' => $this->startDow
+ );
+
+ $cronjobAction = new CronjobAction(array(), 'create', array('data' => $data));
+ $cronjobAction->executeAction();
+ $this->saved();
+
+ // reset values
+ $this->className = $this->description = '';
+ $this->startMinute = $this->startHour = $this->startDom = $this->startMonth = $this->startDow = '*';
+
+ // show success.
+ WCF::getTPL()->assign(array(
+ 'success' => true
+ ));
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'className' => $this->className,
+ 'description' => $this->description,
+ 'startMinute' => $this->startMinute,
+ 'startHour' => $this->startHour,
+ 'startDom' => $this->startDom,
+ 'startMonth' => $this->startMonth,
+ 'startDow' => $this->startDow,
+ 'action' => 'add'
+ ));
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\cronjob\Cronjob;\r
-use wcf\data\cronjob\CronjobAction;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows the cronjobs edit form.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class CronjobEditForm extends CronjobAddForm {\r
- /**\r
- * @see wcf\acp\form\ACPForm::$activeMenuItem\r
- */\r
- public $activeMenuItem = 'wcf.acp.menu.link.cronjobs';\r
- \r
- /**\r
- * @see wcf\page\AbstractPage::$neededPermissions\r
- */\r
- public $neededPermissions = array('admin.system.cronjobs.canEditCronjob');\r
- \r
- /**\r
- * cronjob id\r
- * \r
- * @var integer\r
- */\r
- public $cronjobID = 0;\r
- \r
- /**\r
- * cronjob object\r
- *\r
- * @var Cronjob\r
- */\r
- public $cronjob = null;\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_REQUEST['cronjobID'])) $this->cronjobID = intval($_REQUEST['cronjobID']);\r
- $this->cronjob = new Cronjob($this->cronjobID);\r
- if (!$cronjob->cronjobID) {\r
- throw new IllegalLinkException();\r
- }\r
- \r
- $this->packageID = $this->cronjob->packageID;\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- ACPForm::save();\r
- \r
- // update cronjob\r
- $data = array(\r
- 'className' => $this->className,\r
- 'description' => $this->description,\r
- 'startMinute' => $this->startMinute,\r
- 'startHour' => $this->startHour,\r
- 'startDom' => $this->startDom,\r
- 'startMonth' => $this->startMonth,\r
- 'startDow' => $this->startDow\r
- );\r
- \r
- $cronjobAction = new CronjobAction(array($this->cronjobID), 'update', array('data' => $data));\r
- $cronjobAction->executeAction();\r
- \r
- $this->saved();\r
- \r
- // show success\r
- WCF::getTPL()->assign(array(\r
- 'success' => true\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- if (!count($_POST)) {\r
- $this->className = $this->cronjob->className;\r
- $this->description = $this->cronjob->description;\r
- $this->startMinute = $this->cronjob->startMinute;\r
- $this->startHour = $this->cronjob->startHour;\r
- $this->startDom = $this->cronjob->startDom;\r
- $this->startMonth = $this->cronjob->startMonth;\r
- $this->startDow = $this->cronjob->startDow;\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'cronjobID' => $this->cronjobID,\r
- 'action' => 'edit'\r
- ));\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\cronjob\Cronjob;
+use wcf\data\cronjob\CronjobAction;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+
+/**
+ * Shows the cronjobs edit form.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class CronjobEditForm extends CronjobAddForm {
+ /**
+ * @see wcf\acp\form\ACPForm::$activeMenuItem
+ */
+ public $activeMenuItem = 'wcf.acp.menu.link.cronjobs';
+
+ /**
+ * @see wcf\page\AbstractPage::$neededPermissions
+ */
+ public $neededPermissions = array('admin.system.cronjobs.canEditCronjob');
+
+ /**
+ * cronjob id
+ *
+ * @var integer
+ */
+ public $cronjobID = 0;
+
+ /**
+ * cronjob object
+ *
+ * @var Cronjob
+ */
+ public $cronjob = null;
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_REQUEST['cronjobID'])) $this->cronjobID = intval($_REQUEST['cronjobID']);
+ $this->cronjob = new Cronjob($this->cronjobID);
+ if (!$cronjob->cronjobID) {
+ throw new IllegalLinkException();
+ }
+
+ $this->packageID = $this->cronjob->packageID;
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ ACPForm::save();
+
+ // update cronjob
+ $data = array(
+ 'className' => $this->className,
+ 'description' => $this->description,
+ 'startMinute' => $this->startMinute,
+ 'startHour' => $this->startHour,
+ 'startDom' => $this->startDom,
+ 'startMonth' => $this->startMonth,
+ 'startDow' => $this->startDow
+ );
+
+ $cronjobAction = new CronjobAction(array($this->cronjobID), 'update', array('data' => $data));
+ $cronjobAction->executeAction();
+
+ $this->saved();
+
+ // show success
+ WCF::getTPL()->assign(array(
+ 'success' => true
+ ));
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ if (!count($_POST)) {
+ $this->className = $this->cronjob->className;
+ $this->description = $this->cronjob->description;
+ $this->startMinute = $this->cronjob->startMinute;
+ $this->startHour = $this->cronjob->startHour;
+ $this->startDom = $this->cronjob->startDom;
+ $this->startMonth = $this->cronjob->startMonth;
+ $this->startDow = $this->cronjob->startDow;
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'cronjobID' => $this->cronjobID,
+ 'action' => 'edit'
+ ));
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\User;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\auth\UserAuth;\r
-use wcf\system\exception\PermissionDeniedException;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\WCF;\r
-use wcf\util\HeaderUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the acp login form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class LoginForm extends AbstractForm {\r
- /**\r
- * @see wcf\page\AbstractPage::$templateName\r
- */\r
- public $templateName = 'login';\r
- \r
- /**\r
- * given login username\r
- * @var string\r
- */\r
- public $username = '';\r
- \r
- /**\r
- * given login password\r
- * @var string\r
- */\r
- public $password = '';\r
- \r
- /**\r
- * user object\r
- * @var User\r
- */\r
- public $user;\r
- \r
- /**\r
- * given forward url\r
- * @var string\r
- */\r
- public $url = null;\r
- \r
- /**\r
- * Creates a new LoginForm object.\r
- */\r
- public function __construct() {\r
- if (WCF::getUser()->userID) {\r
- throw new PermissionDeniedException();\r
- }\r
- \r
- parent::__construct();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (!empty($_REQUEST['url'])) $this->url = $_REQUEST['url'];\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']);\r
- if (isset($_POST['password'])) $this->password = $_POST['password'];\r
- }\r
- \r
- /**\r
- * Validates the user access data.\r
- */\r
- protected function validateUser() {\r
- $this->user = UserAuth::getInstance()->loginManually($this->username, $this->password);\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- parent::validate();\r
- \r
- // error handling\r
- if (empty($this->username)) {\r
- throw new UserInputException('username');\r
- }\r
- \r
- if (empty($this->password)) {\r
- throw new UserInputException('password');\r
- }\r
- \r
- $this->validateUser();\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- parent::save();\r
- \r
- // change user\r
- WCF::getSession()->changeUser($this->user);\r
- $this->saved();\r
- \r
- if (!empty($this->url)) {\r
- // append session\r
- if (StringUtil::indexOf($this->url, '?') !== false) $this->url .= SID_ARG_2ND_NOT_ENCODED;\r
- else $this->url .= SID_ARG_1ST;\r
- HeaderUtil::redirect($this->url);\r
- }\r
- else {\r
- HeaderUtil::redirect('index.php'.SID_ARG_1ST);\r
- }\r
- exit;\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
-\r
- // get preferred username\r
- if (!count($_POST)) {\r
- if (isset($_COOKIE[COOKIE_PREFIX.'userID'])) {\r
- $user = new User(intval($_COOKIE[COOKIE_PREFIX.'userID']));\r
- if ($user->userID) $this->username = $user->username;\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'username' => $this->username,\r
- 'password' => $this->password,\r
- 'url' => $this->url\r
- ));\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\User;
+use wcf\form\AbstractForm;
+use wcf\system\auth\UserAuth;
+use wcf\system\exception\PermissionDeniedException;
+use wcf\system\exception\UserInputException;
+use wcf\system\WCF;
+use wcf\util\HeaderUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the acp login form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class LoginForm extends AbstractForm {
+ /**
+ * @see wcf\page\AbstractPage::$templateName
+ */
+ public $templateName = 'login';
+
+ /**
+ * given login username
+ * @var string
+ */
+ public $username = '';
+
+ /**
+ * given login password
+ * @var string
+ */
+ public $password = '';
+
+ /**
+ * user object
+ * @var User
+ */
+ public $user;
+
+ /**
+ * given forward url
+ * @var string
+ */
+ public $url = null;
+
+ /**
+ * Creates a new LoginForm object.
+ */
+ public function __construct() {
+ if (WCF::getUser()->userID) {
+ throw new PermissionDeniedException();
+ }
+
+ parent::__construct();
+ }
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (!empty($_REQUEST['url'])) $this->url = $_REQUEST['url'];
+ }
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']);
+ if (isset($_POST['password'])) $this->password = $_POST['password'];
+ }
+
+ /**
+ * Validates the user access data.
+ */
+ protected function validateUser() {
+ $this->user = UserAuth::getInstance()->loginManually($this->username, $this->password);
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ parent::validate();
+
+ // error handling
+ if (empty($this->username)) {
+ throw new UserInputException('username');
+ }
+
+ if (empty($this->password)) {
+ throw new UserInputException('password');
+ }
+
+ $this->validateUser();
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ parent::save();
+
+ // change user
+ WCF::getSession()->changeUser($this->user);
+ $this->saved();
+
+ if (!empty($this->url)) {
+ // append session
+ if (StringUtil::indexOf($this->url, '?') !== false) $this->url .= SID_ARG_2ND_NOT_ENCODED;
+ else $this->url .= SID_ARG_1ST;
+ HeaderUtil::redirect($this->url);
+ }
+ else {
+ HeaderUtil::redirect('index.php'.SID_ARG_1ST);
+ }
+ exit;
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ // get preferred username
+ if (!count($_POST)) {
+ if (isset($_COOKIE[COOKIE_PREFIX.'userID'])) {
+ $user = new User(intval($_COOKIE[COOKIE_PREFIX.'userID']));
+ if ($user->userID) $this->username = $user->username;
+ }
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'username' => $this->username,
+ 'password' => $this->password,
+ 'url' => $this->url
+ ));
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\option\category\OptionCategory;\r
-use wcf\data\option\OptionAction;\r
-use wcf\data\option\Option;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-\r
-/**\r
- * Shows the option edit form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class OptionForm extends AbstractOptionListForm {\r
- /**\r
- * @see wcf\page\AbstractPage::$templateName;\r
- */\r
- public $templateName = 'option';\r
- \r
- /**\r
- * category option\r
- * @var OptionCategory\r
- */\r
- public $category = null;\r
- \r
- /**\r
- * category id\r
- * @var integer\r
- */\r
- public $categoryID = 0;\r
- \r
- /**\r
- * active tab menu item name\r
- * @var string\r
- */\r
- public $activeTabMenuItem = '';\r
- \r
- /**\r
- * the option tree\r
- * @var array\r
- */\r
- public $optionTree = array();\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_REQUEST['categoryID'])) $this->categoryID = intval($_REQUEST['categoryID']);\r
- $this->category = new OptionCategory($this->categoryID);\r
- if (!isset($this->category->categoryID)) {\r
- throw new IllegalLinkException();\r
- }\r
- $this->categoryName = $this->category->categoryName;\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['activeTabMenuItem'])) $this->activeTabMenuItem = $_POST['activeTabMenuItem'];\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- parent::save();\r
- \r
- // save options\r
- $saveOptions = array();\r
- foreach ($this->options as $option) {\r
- $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
- }\r
- $optionAction = new OptionAction(array(), 'updateAll', array('data' => $saveOptions));\r
- $optionAction->executeAction();\r
- $this->saved();\r
- \r
- // show succes message\r
- WCF::getTPL()->assign('success', true);\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- if (!count($_POST)) {\r
- // get option values\r
- foreach ($this->options as $option) {\r
- $this->optionValues[$option->optionName] = $option->optionValue;\r
- }\r
- }\r
- $this->optionTree = $this->getOptionTree($this->category->categoryName);\r
- if (!count($_POST)) {\r
- $this->activeTabMenuItem = $this->optionTree[0]['object']->categoryName;\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'category' => $this->category,\r
- 'optionTree' => $this->optionTree,\r
- 'activeTabMenuItem' => $this->activeTabMenuItem\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::show()\r
- */\r
- public function show() {\r
- // set active menu item\r
- ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.option.category.'.$this->category->categoryName);\r
- \r
- // check permission\r
- WCF::getSession()->checkPermission(array('admin.system.canEditOption'));\r
-\r
- if ($this->category->categoryName == 'module') {\r
- // check master password\r
- WCFACP::checkMasterPassword();\r
- }\r
- \r
- // get options and categories from cache\r
- $this->readCache();\r
- \r
- // show form\r
- parent::show();\r
- }\r
- \r
- /**\r
- * @see AbstractOptionListForm::checkOption()\r
- */\r
- protected static function checkOption(Option $option) {\r
- if (!parent::checkOption($option)) return false;\r
- return ($option->hidden != 1);\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\option\category\OptionCategory;
+use wcf\data\option\OptionAction;
+use wcf\data\option\Option;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+
+/**
+ * Shows the option edit form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class OptionForm extends AbstractOptionListForm {
+ /**
+ * @see wcf\page\AbstractPage::$templateName;
+ */
+ public $templateName = 'option';
+
+ /**
+ * category option
+ * @var OptionCategory
+ */
+ public $category = null;
+
+ /**
+ * category id
+ * @var integer
+ */
+ public $categoryID = 0;
+
+ /**
+ * active tab menu item name
+ * @var string
+ */
+ public $activeTabMenuItem = '';
+
+ /**
+ * the option tree
+ * @var array
+ */
+ public $optionTree = array();
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_REQUEST['categoryID'])) $this->categoryID = intval($_REQUEST['categoryID']);
+ $this->category = new OptionCategory($this->categoryID);
+ if (!isset($this->category->categoryID)) {
+ throw new IllegalLinkException();
+ }
+ $this->categoryName = $this->category->categoryName;
+ }
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['activeTabMenuItem'])) $this->activeTabMenuItem = $_POST['activeTabMenuItem'];
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ parent::save();
+
+ // save options
+ $saveOptions = array();
+ foreach ($this->options as $option) {
+ $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+ }
+ $optionAction = new OptionAction(array(), 'updateAll', array('data' => $saveOptions));
+ $optionAction->executeAction();
+ $this->saved();
+
+ // show succes message
+ WCF::getTPL()->assign('success', true);
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ if (!count($_POST)) {
+ // get option values
+ foreach ($this->options as $option) {
+ $this->optionValues[$option->optionName] = $option->optionValue;
+ }
+ }
+ $this->optionTree = $this->getOptionTree($this->category->categoryName);
+ if (!count($_POST)) {
+ $this->activeTabMenuItem = $this->optionTree[0]['object']->categoryName;
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'category' => $this->category,
+ 'optionTree' => $this->optionTree,
+ 'activeTabMenuItem' => $this->activeTabMenuItem
+ ));
+ }
+
+ /**
+ * @see wcf\form\IForm::show()
+ */
+ public function show() {
+ // set active menu item
+ ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.option.category.'.$this->category->categoryName);
+
+ // check permission
+ WCF::getSession()->checkPermission(array('admin.system.canEditOption'));
+
+ if ($this->category->categoryName == 'module') {
+ // check master password
+ WCFACP::checkMasterPassword();
+ }
+
+ // get options and categories from cache
+ $this->readCache();
+
+ // show form
+ parent::show();
+ }
+
+ /**
+ * @see AbstractOptionListForm::checkOption()
+ */
+ protected static function checkOption(Option $option) {
+ if (!parent::checkOption($option)) return false;
+ return ($option->hidden != 1);
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\package\Package;\r
-use wcf\data\package\installation\queue\PackageInstallationQueue;\r
-use wcf\data\package\installation\queue\PackageInstallationQueueEditor;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\package\PackageArchive;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\util\FileUtil;\r
-use wcf\util\HeaderUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the package install and update form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class PackageStartInstallForm extends ACPForm {\r
- public $templateName = 'packageStartInstall';\r
- public $activeMenuItem = 'wcf.acp.menu.link.package.install';\r
- \r
- public $packageID = 0;\r
- public $package = null;\r
- public $downloadPackage = '';\r
- public $uploadPackage = '';\r
- public $archive = null;\r
- public $queue = null;\r
- \r
- /**\r
- * @see wcf\form\IForm::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_REQUEST['activePackageID'])) {\r
- $this->packageID = intval($_REQUEST['activePackageID']);\r
- if ($this->packageID != 0) {\r
- try {\r
- $this->package = new Package($this->packageID);\r
- }\r
- catch (SystemException $e) {\r
- throw new IllegalLinkException();\r
- }\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['downloadPackage'])) $this->downloadPackage = StringUtil::trim($_POST['downloadPackage']);\r
- if (isset($_FILES['uploadPackage'])) $this->uploadPackage = $_FILES['uploadPackage'];\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- parent::validate();\r
- \r
- if (!empty($this->uploadPackage['name'])) {\r
- $this->validateUploadPackage();\r
- }\r
- else if (!empty($this->downloadPackage)) {\r
- $this->validateDownloadPackage();\r
- }\r
- else {\r
- throw new UserInputException('uploadPackage');\r
- }\r
- }\r
- \r
- /**\r
- * Validates the upload package input.\r
- */\r
- protected function validateUploadPackage() {\r
- if (empty($this->uploadPackage['tmp_name'])) {\r
- throw new UserInputException('uploadPackage', 'uploadFailed');\r
- }\r
- \r
- // get filename\r
- $this->uploadPackage['name'] = FileUtil::getTemporaryFilename('package_', preg_replace('!^.*(?=\.(?:tar\.gz|tgz|tar)$)!i', '', basename($this->uploadPackage['name'])));\r
- \r
- if (!@move_uploaded_file($this->uploadPackage['tmp_name'], $this->uploadPackage['name'])) {\r
- throw new UserInputException('uploadPackage', 'uploadFailed');\r
- }\r
- \r
- $this->archive = new PackageArchive($this->uploadPackage['name'], $this->package);\r
- $this->validateArchive('uploadPackage');\r
- }\r
- \r
- /**\r
- * Validates the download package input.\r
- */\r
- protected function validateDownloadPackage() {\r
- if (FileUtil::isURL($this->downloadPackage)) {\r
- // download package\r
- $this->archive = new PackageArchive($this->downloadPackage, $this->package);\r
- \r
- try {\r
- $this->downloadPackage = $this->archive->downloadArchive();\r
- //$this->archive->downloadArchive();\r
- }\r
- catch (SystemException $e) {\r
- throw new UserInputException('downloadPackage', 'notFound');\r
- }\r
- }\r
- else {\r
- // probably local path\r
- if (!file_exists($this->downloadPackage)) {\r
- throw new UserInputException('downloadPackage', 'notFound');\r
- }\r
- \r
- $this->archive = new PackageArchive($this->downloadPackage, $this->package);\r
- }\r
- \r
- $this->validateArchive('downloadPackage');\r
- }\r
- \r
- /**\r
- * Validates the package archive.\r
- *\r
- * @param string $type upload or download package\r
- */\r
- protected function validateArchive($type) {\r
- // try to open the archive\r
- try {\r
- // TODO: Exceptions thrown within openArchive() are discarded, resulting in\r
- // the meaningless message 'not a valid package'\r
- $this->archive->openArchive();\r
- }\r
- catch (SystemException $e) {\r
- throw new UserInputException($type, 'noValidPackage');\r
- }\r
- \r
- // validate php requirements\r
- $errors = PackageInstallationDispatcher::validatePHPRequirements($this->archive->getPhpRequirements());\r
- if (count($errors)) {\r
- WCF::getTPL()->assign('phpRequirements', $errors);\r
- throw new UserInputException($type, 'phpRequirements');\r
- }\r
- \r
- // check update or install support\r
- if ($this->package !== null) {\r
- if (!$this->archive->isValidUpdate()) {\r
- throw new UserInputException($type, 'noValidUpdate');\r
- }\r
- }\r
- else {\r
- if (!$this->archive->isValidInstall()) {\r
- throw new UserInputException($type, 'noValidInstall');\r
- }\r
- elseif ($this->archive->isAlreadyInstalled()) {\r
- throw new UserInputException($type, 'uniqueAlreadyInstalled');\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- parent::save();\r
- \r
- // get new process no\r
- $processNo = PackageInstallationQueue::getNewProcessNo();\r
- \r
- // obey foreign key\r
- $packageID = ($this->packageID) ? $this->packageID : null;\r
- \r
- // insert queue\r
- $this->queue = PackageInstallationQueueEditor::create(array(\r
- 'processNo' => $processNo,\r
- 'userID' => WCF::getUser()->userID,\r
- 'package' => $this->archive->getPackageInfo('name'),\r
- 'packageName' => $this->archive->getPackageInfo('packageName'),\r
- 'packageID' => $packageID,\r
- 'archive' => (!empty($this->uploadPackage['tmp_name']) ? $this->uploadPackage['name'] : $this->downloadPackage),\r
- 'action' => ($this->package != null ? 'update' : 'install'),\r
- 'confirmInstallation' => 1,\r
- 'cancelable' => ($this->package != null ? 0 : 1)\r
- ));\r
- \r
- $this->saved();\r
- \r
- // open queue\r
- HeaderUtil::redirect('index.php?page=Package&action=openQueue&processNo='.$processNo.''.SID_ARG_2ND_NOT_ENCODED);\r
- exit;\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'packageID' => $this->packageID,\r
- 'package' => $this->package\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- if ($this->action == 'install') WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));\r
- else WCF::getSession()->checkPermission(array('admin.system.package.canUpdatePackage'));\r
- \r
- // check master password\r
- WCFACP::checkMasterPassword();\r
- \r
- parent::show();\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\package\Package;
+use wcf\data\package\installation\queue\PackageInstallationQueue;
+use wcf\data\package\installation\queue\PackageInstallationQueueEditor;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\SystemException;
+use wcf\system\exception\UserInputException;
+use wcf\system\package\PackageArchive;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\util\FileUtil;
+use wcf\util\HeaderUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the package install and update form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class PackageStartInstallForm extends ACPForm {
+ public $templateName = 'packageStartInstall';
+ public $activeMenuItem = 'wcf.acp.menu.link.package.install';
+
+ public $packageID = 0;
+ public $package = null;
+ public $downloadPackage = '';
+ public $uploadPackage = '';
+ public $archive = null;
+ public $queue = null;
+
+ /**
+ * @see wcf\form\IForm::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_REQUEST['activePackageID'])) {
+ $this->packageID = intval($_REQUEST['activePackageID']);
+ if ($this->packageID != 0) {
+ try {
+ $this->package = new Package($this->packageID);
+ }
+ catch (SystemException $e) {
+ throw new IllegalLinkException();
+ }
+ }
+ }
+ }
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['downloadPackage'])) $this->downloadPackage = StringUtil::trim($_POST['downloadPackage']);
+ if (isset($_FILES['uploadPackage'])) $this->uploadPackage = $_FILES['uploadPackage'];
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ parent::validate();
+
+ if (!empty($this->uploadPackage['name'])) {
+ $this->validateUploadPackage();
+ }
+ else if (!empty($this->downloadPackage)) {
+ $this->validateDownloadPackage();
+ }
+ else {
+ throw new UserInputException('uploadPackage');
+ }
+ }
+
+ /**
+ * Validates the upload package input.
+ */
+ protected function validateUploadPackage() {
+ if (empty($this->uploadPackage['tmp_name'])) {
+ throw new UserInputException('uploadPackage', 'uploadFailed');
+ }
+
+ // get filename
+ $this->uploadPackage['name'] = FileUtil::getTemporaryFilename('package_', preg_replace('!^.*(?=\.(?:tar\.gz|tgz|tar)$)!i', '', basename($this->uploadPackage['name'])));
+
+ if (!@move_uploaded_file($this->uploadPackage['tmp_name'], $this->uploadPackage['name'])) {
+ throw new UserInputException('uploadPackage', 'uploadFailed');
+ }
+
+ $this->archive = new PackageArchive($this->uploadPackage['name'], $this->package);
+ $this->validateArchive('uploadPackage');
+ }
+
+ /**
+ * Validates the download package input.
+ */
+ protected function validateDownloadPackage() {
+ if (FileUtil::isURL($this->downloadPackage)) {
+ // download package
+ $this->archive = new PackageArchive($this->downloadPackage, $this->package);
+
+ try {
+ $this->downloadPackage = $this->archive->downloadArchive();
+ //$this->archive->downloadArchive();
+ }
+ catch (SystemException $e) {
+ throw new UserInputException('downloadPackage', 'notFound');
+ }
+ }
+ else {
+ // probably local path
+ if (!file_exists($this->downloadPackage)) {
+ throw new UserInputException('downloadPackage', 'notFound');
+ }
+
+ $this->archive = new PackageArchive($this->downloadPackage, $this->package);
+ }
+
+ $this->validateArchive('downloadPackage');
+ }
+
+ /**
+ * Validates the package archive.
+ *
+ * @param string $type upload or download package
+ */
+ protected function validateArchive($type) {
+ // try to open the archive
+ try {
+ // TODO: Exceptions thrown within openArchive() are discarded, resulting in
+ // the meaningless message 'not a valid package'
+ $this->archive->openArchive();
+ }
+ catch (SystemException $e) {
+ throw new UserInputException($type, 'noValidPackage');
+ }
+
+ // validate php requirements
+ $errors = PackageInstallationDispatcher::validatePHPRequirements($this->archive->getPhpRequirements());
+ if (count($errors)) {
+ WCF::getTPL()->assign('phpRequirements', $errors);
+ throw new UserInputException($type, 'phpRequirements');
+ }
+
+ // check update or install support
+ if ($this->package !== null) {
+ if (!$this->archive->isValidUpdate()) {
+ throw new UserInputException($type, 'noValidUpdate');
+ }
+ }
+ else {
+ if (!$this->archive->isValidInstall()) {
+ throw new UserInputException($type, 'noValidInstall');
+ }
+ elseif ($this->archive->isAlreadyInstalled()) {
+ throw new UserInputException($type, 'uniqueAlreadyInstalled');
+ }
+ }
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ parent::save();
+
+ // get new process no
+ $processNo = PackageInstallationQueue::getNewProcessNo();
+
+ // obey foreign key
+ $packageID = ($this->packageID) ? $this->packageID : null;
+
+ // insert queue
+ $this->queue = PackageInstallationQueueEditor::create(array(
+ 'processNo' => $processNo,
+ 'userID' => WCF::getUser()->userID,
+ 'package' => $this->archive->getPackageInfo('name'),
+ 'packageName' => $this->archive->getPackageInfo('packageName'),
+ 'packageID' => $packageID,
+ 'archive' => (!empty($this->uploadPackage['tmp_name']) ? $this->uploadPackage['name'] : $this->downloadPackage),
+ 'action' => ($this->package != null ? 'update' : 'install'),
+ 'confirmInstallation' => 1,
+ 'cancelable' => ($this->package != null ? 0 : 1)
+ ));
+
+ $this->saved();
+
+ // open queue
+ HeaderUtil::redirect('index.php?page=Package&action=openQueue&processNo='.$processNo.''.SID_ARG_2ND_NOT_ENCODED);
+ exit;
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'packageID' => $this->packageID,
+ 'package' => $this->package
+ ));
+ }
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ if ($this->action == 'install') WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));
+ else WCF::getSession()->checkPermission(array('admin.system.package.canUpdatePackage'));
+
+ // check master password
+ WCFACP::checkMasterPassword();
+
+ parent::show();
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\option\Option;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\UserAction;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\language\LanguageFactory;\r
-use wcf\system\WCF;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\StringUtil;\r
-use wcf\util\UserUtil;\r
-\r
-/**\r
- * Shows the user add form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class UserAddForm extends UserOptionListForm {\r
- /**\r
- * @see wcf\page\AbstractPage::$templateName\r
- */\r
- public $templateName = 'userAdd';\r
- \r
- /**\r
- * @see wcf\page\AbstractPage::$neededPermissions\r
- */\r
- public $neededPermissions = array('admin.user.canAddUser');\r
- \r
- /**\r
- * name of the active menu item\r
- * @var string\r
- */\r
- public $menuItemName = 'wcf.acp.menu.link.user.add';\r
- \r
- /**\r
- * username\r
- * @var string\r
- */\r
- public $username = '';\r
- \r
- /**\r
- * email address\r
- * @var string\r
- */\r
- public $email = '';\r
- \r
- /**\r
- * confirmed email address\r
- * @var string\r
- */\r
- public $confirmEmail = '';\r
- \r
- /**\r
- * user password\r
- * @var string\r
- */\r
- public $password = '';\r
- \r
- /**\r
- * confirmed user password\r
- * @var string\r
- */\r
- public $confirmPassword = '';\r
- \r
- /**\r
- * user group ids\r
- * @var array<integer>\r
- */\r
- public $groupIDs = array();\r
- \r
- /**\r
- * language id\r
- * @var integer\r
- */\r
- public $languageID = 0;\r
- \r
- /**\r
- * visible languages\r
- * @var array<integer>\r
- */\r
- public $visibleLanguages = array();\r
- \r
- /**\r
- * additional fields\r
- * @var array<mixed>\r
- */\r
- public $additionalFields = array();\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']); \r
- if (isset($_POST['email'])) $this->email = StringUtil::trim($_POST['email']);\r
- if (isset($_POST['confirmEmail'])) $this->confirmEmail = StringUtil::trim($_POST['confirmEmail']);\r
- if (isset($_POST['password'])) $this->password = $_POST['password'];\r
- if (isset($_POST['confirmPassword'])) $this->confirmPassword = $_POST['confirmPassword'];\r
- if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);\r
- if (isset($_POST['visibleLanguages']) && is_array($_POST['visibleLanguages'])) $this->visibleLanguages = ArrayUtil::toIntegerArray($_POST['visibleLanguages']);\r
- if (isset($_POST['languageID'])) $this->languageID = intval($_POST['languageID']);\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- // validate static user options \r
- try {\r
- $this->validateUsername($this->username); \r
- }\r
- catch (UserInputException $e) {\r
- $this->errorType[$e->getField()] = $e->getType();\r
- }\r
- \r
- try {\r
- $this->validateEmail($this->email, $this->confirmEmail); \r
- }\r
- catch (UserInputException $e) {\r
- $this->errorType[$e->getField()] = $e->getType();\r
- }\r
- \r
- try {\r
- $this->validatePassword($this->password, $this->confirmPassword);\r
- }\r
- catch (UserInputException $e) {\r
- $this->errorType[$e->getField()] = $e->getType();\r
- }\r
- \r
- // validate user groups\r
- if (count($this->groupIDs) > 0) {\r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("groupID IN (?)", array($this->groupIDs));\r
- $conditions->add("groupType NOT IN (?)", array(array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS)));\r
- \r
- $sql = "SELECT groupID\r
- FROM wcf".WCF_N."_user_group\r
- ".$conditions;\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- $this->groupIDs = array();\r
- while ($row = $statement->fetchArray()) {\r
- if (UserGroup::isAccessibleGroup(array($row['groupID']))) {\r
- $this->groupIDs[] = $row['groupID'];\r
- }\r
- }\r
- }\r
- \r
- // validate user language\r
- $language = LanguageFactory::getLanguage($this->languageID);\r
- if (!$language->languageID) {\r
- // use default language\r
- $this->languageID = LanguageFactory::getDefaultLanguageID();\r
- }\r
- \r
- // validate visible languages\r
- foreach ($this->visibleLanguages as $key => $visibleLanguage) {\r
- $language = LanguageFactory::getLanguage($visibleLanguage);\r
- if (!$language->languageID || !$language->hasContent) {\r
- unset($this->visibleLanguages[$key]);\r
- }\r
- }\r
- if (!count($this->visibleLanguages) && ($language = LanguageFactory::getLanguage($this->languageID)) && $language->hasContent) {\r
- $this->visibleLanguages[] = $this->languageID;\r
- }\r
- \r
- // validate dynamic options\r
- parent::validate();\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- AbstractForm::save();\r
- \r
- // create\r
- $saveOptions = array();\r
- foreach ($this->options as $option) {\r
- $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
- }\r
- $this->additionalFields['languageID'] = $this->languageID;\r
- $data = array(\r
- 'data' => array_merge($this->additionalFields, array(\r
- 'username' => $this->username,\r
- 'email' => $this->email,\r
- 'password' => $this->password,\r
- )),\r
- 'groups' => $this->groupIDs,\r
- 'languages' => $this->visibleLanguages,\r
- 'options' => $saveOptions\r
- );\r
- $userAction = new UserAction(array(), 'create', $data);\r
- $userAction->executeAction();\r
- $this->saved();\r
- \r
- // show empty add form\r
- WCF::getTPL()->assign(array(\r
- 'success' => true\r
- ));\r
- \r
- // reset values\r
- $this->username = $this->email = $this->confirmEmail = $this->password = $this->confirmPassword = '';\r
- $this->groupIDs = array();\r
- $this->languageID = $this->getDefaultFormLanguageID();\r
- $this->optionValues = array();\r
- }\r
- \r
- /**\r
- * Throws a UserInputException if the username is not unique or not valid.\r
- * \r
- * @param string $username\r
- */\r
- protected function validateUsername($username) {\r
- if (empty($username)) {\r
- throw new UserInputException('username');\r
- }\r
- \r
- // check for forbidden chars (e.g. the ",")\r
- if (!UserUtil::isValidUsername($username)) {\r
- throw new UserInputException('username', 'notValid');\r
- }\r
- \r
- // Check if username exists already.\r
- if (!UserUtil::isAvailableUsername($username)) {\r
- throw new UserInputException('username', 'notUnique');\r
- }\r
- }\r
- \r
- /**\r
- * Throws a UserInputException if the email is not unique or not valid.\r
- * \r
- * @param string $email\r
- * @param string $confirmEmail\r
- */\r
- protected function validateEmail($email, $confirmEmail) {\r
- if (empty($email)) { \r
- throw new UserInputException('email');\r
- }\r
- \r
- // check for valid email (one @ etc.)\r
- if (!UserUtil::isValidEmail($email)) {\r
- throw new UserInputException('email', 'notValid');\r
- }\r
- \r
- // Check if email exists already.\r
- if (!UserUtil::isAvailableEmail($email)) {\r
- throw new UserInputException('email', 'notUnique');\r
- }\r
- \r
- // check confirm input\r
- if (StringUtil::toLowerCase($email) != StringUtil::toLowerCase($confirmEmail)) {\r
- throw new UserInputException('confirmEmail', 'notEqual');\r
- }\r
- }\r
- \r
- /**\r
- * Throws a UserInputException if the password is not valid.\r
- * \r
- * @param string $password\r
- * @param string $confirmPassword\r
- */\r
- protected function validatePassword($password, $confirmPassword) {\r
- if (empty($password)) {\r
- throw new UserInputException('password');\r
- }\r
- \r
- // check confirm input\r
- if ($password != $confirmPassword) {\r
- throw new UserInputException('confirmPassword', 'notEqual');\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- $this->optionTree = $this->getOptionTree();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'username' => $this->username,\r
- 'email' => $this->email,\r
- 'confirmEmail' => $this->confirmEmail,\r
- 'password' => $this->password,\r
- 'confirmPassword' => $this->confirmPassword,\r
- 'groupIDs' => $this->groupIDs,\r
- 'optionTree' => $this->optionTree,\r
- 'availableGroups' => $this->getAvailableGroups(),\r
- 'availableLanguages' => $this->getAvailableLanguages(),\r
- 'languageID' => $this->languageID,\r
- 'visibleLanguages' => $this->visibleLanguages,\r
- 'availableContentLanguages' => $this->getAvailableContentLanguages(),\r
- 'action' => 'add'\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- // set active menu item\r
- ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);\r
- \r
- // get the default langauge id\r
- $this->languageID = $this->getDefaultFormLanguageID();\r
- \r
- // get user options and categories from cache\r
- $this->readCache();\r
- \r
- // show form\r
- parent::show();\r
- }\r
- \r
- /**\r
- * @see AbstractOptionListForm::checkOption()\r
- */\r
- protected static function checkOption(Option $option) {\r
- if (!parent::checkOption($option)) return false;\r
- \r
- return ($option->editable != 1 && $option->editable != 4 && !$option->disabled);\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\option\Option;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\UserAction;
+use wcf\form\AbstractForm;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\UserInputException;
+use wcf\system\language\LanguageFactory;
+use wcf\system\WCF;
+use wcf\util\ArrayUtil;
+use wcf\util\StringUtil;
+use wcf\util\UserUtil;
+
+/**
+ * Shows the user add form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class UserAddForm extends UserOptionListForm {
+ /**
+ * @see wcf\page\AbstractPage::$templateName
+ */
+ public $templateName = 'userAdd';
+
+ /**
+ * @see wcf\page\AbstractPage::$neededPermissions
+ */
+ public $neededPermissions = array('admin.user.canAddUser');
+
+ /**
+ * name of the active menu item
+ * @var string
+ */
+ public $menuItemName = 'wcf.acp.menu.link.user.add';
+
+ /**
+ * username
+ * @var string
+ */
+ public $username = '';
+
+ /**
+ * email address
+ * @var string
+ */
+ public $email = '';
+
+ /**
+ * confirmed email address
+ * @var string
+ */
+ public $confirmEmail = '';
+
+ /**
+ * user password
+ * @var string
+ */
+ public $password = '';
+
+ /**
+ * confirmed user password
+ * @var string
+ */
+ public $confirmPassword = '';
+
+ /**
+ * user group ids
+ * @var array<integer>
+ */
+ public $groupIDs = array();
+
+ /**
+ * language id
+ * @var integer
+ */
+ public $languageID = 0;
+
+ /**
+ * visible languages
+ * @var array<integer>
+ */
+ public $visibleLanguages = array();
+
+ /**
+ * additional fields
+ * @var array<mixed>
+ */
+ public $additionalFields = array();
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']);
+ if (isset($_POST['email'])) $this->email = StringUtil::trim($_POST['email']);
+ if (isset($_POST['confirmEmail'])) $this->confirmEmail = StringUtil::trim($_POST['confirmEmail']);
+ if (isset($_POST['password'])) $this->password = $_POST['password'];
+ if (isset($_POST['confirmPassword'])) $this->confirmPassword = $_POST['confirmPassword'];
+ if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);
+ if (isset($_POST['visibleLanguages']) && is_array($_POST['visibleLanguages'])) $this->visibleLanguages = ArrayUtil::toIntegerArray($_POST['visibleLanguages']);
+ if (isset($_POST['languageID'])) $this->languageID = intval($_POST['languageID']);
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ // validate static user options
+ try {
+ $this->validateUsername($this->username);
+ }
+ catch (UserInputException $e) {
+ $this->errorType[$e->getField()] = $e->getType();
+ }
+
+ try {
+ $this->validateEmail($this->email, $this->confirmEmail);
+ }
+ catch (UserInputException $e) {
+ $this->errorType[$e->getField()] = $e->getType();
+ }
+
+ try {
+ $this->validatePassword($this->password, $this->confirmPassword);
+ }
+ catch (UserInputException $e) {
+ $this->errorType[$e->getField()] = $e->getType();
+ }
+
+ // validate user groups
+ if (count($this->groupIDs) > 0) {
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("groupID IN (?)", array($this->groupIDs));
+ $conditions->add("groupType NOT IN (?)", array(array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS)));
+
+ $sql = "SELECT groupID
+ FROM wcf".WCF_N."_user_group
+ ".$conditions;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+ $this->groupIDs = array();
+ while ($row = $statement->fetchArray()) {
+ if (UserGroup::isAccessibleGroup(array($row['groupID']))) {
+ $this->groupIDs[] = $row['groupID'];
+ }
+ }
+ }
+
+ // validate user language
+ $language = LanguageFactory::getLanguage($this->languageID);
+ if (!$language->languageID) {
+ // use default language
+ $this->languageID = LanguageFactory::getDefaultLanguageID();
+ }
+
+ // validate visible languages
+ foreach ($this->visibleLanguages as $key => $visibleLanguage) {
+ $language = LanguageFactory::getLanguage($visibleLanguage);
+ if (!$language->languageID || !$language->hasContent) {
+ unset($this->visibleLanguages[$key]);
+ }
+ }
+ if (!count($this->visibleLanguages) && ($language = LanguageFactory::getLanguage($this->languageID)) && $language->hasContent) {
+ $this->visibleLanguages[] = $this->languageID;
+ }
+
+ // validate dynamic options
+ parent::validate();
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ AbstractForm::save();
+
+ // create
+ $saveOptions = array();
+ foreach ($this->options as $option) {
+ $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+ }
+ $this->additionalFields['languageID'] = $this->languageID;
+ $data = array(
+ 'data' => array_merge($this->additionalFields, array(
+ 'username' => $this->username,
+ 'email' => $this->email,
+ 'password' => $this->password,
+ )),
+ 'groups' => $this->groupIDs,
+ 'languages' => $this->visibleLanguages,
+ 'options' => $saveOptions
+ );
+ $userAction = new UserAction(array(), 'create', $data);
+ $userAction->executeAction();
+ $this->saved();
+
+ // show empty add form
+ WCF::getTPL()->assign(array(
+ 'success' => true
+ ));
+
+ // reset values
+ $this->username = $this->email = $this->confirmEmail = $this->password = $this->confirmPassword = '';
+ $this->groupIDs = array();
+ $this->languageID = $this->getDefaultFormLanguageID();
+ $this->optionValues = array();
+ }
+
+ /**
+ * Throws a UserInputException if the username is not unique or not valid.
+ *
+ * @param string $username
+ */
+ protected function validateUsername($username) {
+ if (empty($username)) {
+ throw new UserInputException('username');
+ }
+
+ // check for forbidden chars (e.g. the ",")
+ if (!UserUtil::isValidUsername($username)) {
+ throw new UserInputException('username', 'notValid');
+ }
+
+ // Check if username exists already.
+ if (!UserUtil::isAvailableUsername($username)) {
+ throw new UserInputException('username', 'notUnique');
+ }
+ }
+
+ /**
+ * Throws a UserInputException if the email is not unique or not valid.
+ *
+ * @param string $email
+ * @param string $confirmEmail
+ */
+ protected function validateEmail($email, $confirmEmail) {
+ if (empty($email)) {
+ throw new UserInputException('email');
+ }
+
+ // check for valid email (one @ etc.)
+ if (!UserUtil::isValidEmail($email)) {
+ throw new UserInputException('email', 'notValid');
+ }
+
+ // Check if email exists already.
+ if (!UserUtil::isAvailableEmail($email)) {
+ throw new UserInputException('email', 'notUnique');
+ }
+
+ // check confirm input
+ if (StringUtil::toLowerCase($email) != StringUtil::toLowerCase($confirmEmail)) {
+ throw new UserInputException('confirmEmail', 'notEqual');
+ }
+ }
+
+ /**
+ * Throws a UserInputException if the password is not valid.
+ *
+ * @param string $password
+ * @param string $confirmPassword
+ */
+ protected function validatePassword($password, $confirmPassword) {
+ if (empty($password)) {
+ throw new UserInputException('password');
+ }
+
+ // check confirm input
+ if ($password != $confirmPassword) {
+ throw new UserInputException('confirmPassword', 'notEqual');
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ $this->optionTree = $this->getOptionTree();
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'username' => $this->username,
+ 'email' => $this->email,
+ 'confirmEmail' => $this->confirmEmail,
+ 'password' => $this->password,
+ 'confirmPassword' => $this->confirmPassword,
+ 'groupIDs' => $this->groupIDs,
+ 'optionTree' => $this->optionTree,
+ 'availableGroups' => $this->getAvailableGroups(),
+ 'availableLanguages' => $this->getAvailableLanguages(),
+ 'languageID' => $this->languageID,
+ 'visibleLanguages' => $this->visibleLanguages,
+ 'availableContentLanguages' => $this->getAvailableContentLanguages(),
+ 'action' => 'add'
+ ));
+ }
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ // set active menu item
+ ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);
+
+ // get the default langauge id
+ $this->languageID = $this->getDefaultFormLanguageID();
+
+ // get user options and categories from cache
+ $this->readCache();
+
+ // show form
+ parent::show();
+ }
+
+ /**
+ * @see AbstractOptionListForm::checkOption()
+ */
+ protected static function checkOption(Option $option) {
+ if (!parent::checkOption($option)) return false;
+
+ return ($option->editable != 1 && $option->editable != 4 && !$option->disabled);
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\UserEditor;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\PermissionDeniedException;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\WCF;\r
-use wcf\util\ArrayUtil;\r
-\r
-/**\r
- * Shows the assign user to group form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class UserAssignToGroupForm extends ACPForm {\r
- public $templateName = 'userAssignToGroup';\r
- public $activeMenuItem = 'wcf.acp.menu.link.user.management';\r
- public $neededPermissions = array('admin.user.canEditUser');\r
- \r
- public $userIDs = array();\r
- public $groupIDs = array();\r
- public $users = array();\r
- public $groups = array();\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));\r
- if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- parent::validate();\r
- \r
- if (empty($this->userIDs)) throw new IllegalLinkException();\r
- \r
- // groups\r
- foreach ($this->groupIDs as $groupID) {\r
- $group = new UserGroup($groupID);\r
- if (!$group->groupID) throw new UserInputException('groupIDs');\r
- if (!$group->isAccessible()) {\r
- throw new PermissionDeniedException();\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- parent::save();\r
- \r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("userID IN (?)", array($this->userIDs));\r
- \r
- $sql = "SELECT userID, groupID\r
- FROM wcf".WCF_N."_user_to_group\r
- ".$conditions;\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- \r
- $groups = array();\r
- while ($row = $statement->fetchArray()) {\r
- $groups[$row['userID']][] = $row['groupID'];\r
- }\r
- \r
- foreach ($this->users as $user) {\r
- if (!UserGroup::isAccessibleGroup($groups[$user->userID])) {\r
- throw new PermissionDeniedException();\r
- }\r
- \r
- $userEditor = new UserEditor($user);\r
- $userEditor->addToGroups($groups[$user->userID], false, false);\r
- }\r
- \r
- // TODO: Implement unmarkAll()\r
- //UserEditor::unmarkAll();\r
- SessionHandler::resetSessions($this->userIDs);\r
- $this->saved();\r
- WCF::getTPL()->assign('message', 'wcf.acp.user.assignToGroup.success');\r
- WCF::getTPL()->display('success');\r
- exit;\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- if (!count($_POST)) {\r
- // get marked user ids\r
- $markedUsers = WCF::getSession()->getVar('markedUsers');\r
- if (is_array($markedUsers)) {\r
- $this->userIDs = $markedUsers;\r
- }\r
- if (empty($this->userIDs)) throw new IllegalLinkException();\r
- }\r
- \r
- $this->users = User::getUsers($this->userIDs);\r
- $this->readGroups();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'users' => $this->users,\r
- 'userIDs' => $this->userIDs,\r
- 'groupIDs' => $this->groupIDs,\r
- 'groups' => $this->groups\r
- ));\r
- }\r
- \r
- /**\r
- * Get a list of available groups.\r
- */\r
- protected function readGroups() {\r
- $this->groups = UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\UserEditor;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\PermissionDeniedException;
+use wcf\system\exception\UserInputException;
+use wcf\system\session\SessionHandler;
+use wcf\system\WCF;
+use wcf\util\ArrayUtil;
+
+/**
+ * Shows the assign user to group form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class UserAssignToGroupForm extends ACPForm {
+ public $templateName = 'userAssignToGroup';
+ public $activeMenuItem = 'wcf.acp.menu.link.user.management';
+ public $neededPermissions = array('admin.user.canEditUser');
+
+ public $userIDs = array();
+ public $groupIDs = array();
+ public $users = array();
+ public $groups = array();
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));
+ if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ parent::validate();
+
+ if (empty($this->userIDs)) throw new IllegalLinkException();
+
+ // groups
+ foreach ($this->groupIDs as $groupID) {
+ $group = new UserGroup($groupID);
+ if (!$group->groupID) throw new UserInputException('groupIDs');
+ if (!$group->isAccessible()) {
+ throw new PermissionDeniedException();
+ }
+ }
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ parent::save();
+
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("userID IN (?)", array($this->userIDs));
+
+ $sql = "SELECT userID, groupID
+ FROM wcf".WCF_N."_user_to_group
+ ".$conditions;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+
+ $groups = array();
+ while ($row = $statement->fetchArray()) {
+ $groups[$row['userID']][] = $row['groupID'];
+ }
+
+ foreach ($this->users as $user) {
+ if (!UserGroup::isAccessibleGroup($groups[$user->userID])) {
+ throw new PermissionDeniedException();
+ }
+
+ $userEditor = new UserEditor($user);
+ $userEditor->addToGroups($groups[$user->userID], false, false);
+ }
+
+ // TODO: Implement unmarkAll()
+ //UserEditor::unmarkAll();
+ SessionHandler::resetSessions($this->userIDs);
+ $this->saved();
+ WCF::getTPL()->assign('message', 'wcf.acp.user.assignToGroup.success');
+ WCF::getTPL()->display('success');
+ exit;
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ if (!count($_POST)) {
+ // get marked user ids
+ $markedUsers = WCF::getSession()->getVar('markedUsers');
+ if (is_array($markedUsers)) {
+ $this->userIDs = $markedUsers;
+ }
+ if (empty($this->userIDs)) throw new IllegalLinkException();
+ }
+
+ $this->users = User::getUsers($this->userIDs);
+ $this->readGroups();
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'users' => $this->users,
+ 'userIDs' => $this->userIDs,
+ 'groupIDs' => $this->groupIDs,
+ 'groups' => $this->groups
+ ));
+ }
+
+ /**
+ * Get a list of available groups.
+ */
+ protected function readGroups() {
+ $this->groups = UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\User;\r
-use wcf\data\user\UserAction;\r
-use wcf\data\user\UserEditor;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\PermissionDeniedException;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the user edit form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class UserEditForm extends UserAddForm {\r
- /**\r
- * @see UserAddForm::$menuItemName\r
- */\r
- public $menuItemName = 'wcf.acp.menu.link.user.management';\r
- \r
- /**\r
- * @see wcf\page\AbstractPage::$neededPermissions\r
- */\r
- public $neededPermissions = array('admin.user.canEditUser');\r
- \r
- /**\r
- * user id\r
- * @var integer\r
- */\r
- public $userID = 0;\r
- \r
- /**\r
- * user editor object\r
- * @var UserEditor\r
- */\r
- public $user = null;\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_REQUEST['userID'])) {\r
- $this->userID = intval($_REQUEST['userID']);\r
- $user = new User($this->userID);\r
- if (!$user->userID) {\r
- throw new IllegalLinkException();\r
- }\r
- \r
- $this->user = new UserEditor($user);\r
- if (!UserGroup::isAccessibleGroup($this->user->getGroupIDs())) {\r
- throw new PermissionDeniedException();\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (!WCF::getSession()->getPermission('admin.user.canEditPassword')) $this->password = $this->confirmPassword = '';\r
- if (!WCF::getSession()->getPermission('admin.user.canEditMailAddress')) $this->email = $this->confirmEmail = $this->user->email;\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- if (!count($_POST)) {\r
- // get visible languages\r
- $this->readVisibleLanguages();\r
- \r
- // default values\r
- $this->readDefaultValues();\r
- }\r
- \r
- parent::readData();\r
- }\r
- \r
- /**\r
- * Gets the selected languages.\r
- */\r
- protected function readVisibleLanguages() {\r
- $this->visibleLanguages = $this->user->getLanguageIDs();\r
- }\r
- \r
- /**\r
- * Gets the default values.\r
- */\r
- protected function readDefaultValues() {\r
- $this->username = $this->user->username;\r
- $this->email = $this->confirmEmail = $this->user->email;\r
- $this->groupIDs = $this->user->getGroupIDs();\r
- $this->languageID = $this->user->languageID;\r
- \r
- foreach ($this->options as $option) {\r
- $value = $this->user->{'userOption'.$option->optionID};\r
- if ($value !== null) {\r
- $this->optionValues[$option->optionName] = $value;\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'userID' => $this->user->userID,\r
- 'action' => 'edit',\r
- 'url' => '',\r
- 'markedUsers' => 0,\r
- 'user' => $this->user\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- AbstractForm::save();\r
- \r
- // add default groups\r
- $defaultGroups = UserGroup::getAccessibleGroups(array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));\r
- $oldGroupIDs = $this->user->getGroupIDs();\r
- foreach ($oldGroupIDs as $oldGroupID) {\r
- if (isset($defaultGroups[$oldGroupID])) {\r
- $this->groupIDs[] = $oldGroupID;\r
- }\r
- }\r
- $this->groupIDs = array_unique($this->groupIDs);\r
- \r
- // save user\r
- $saveOptions = array();\r
- foreach ($this->options as $option) {\r
- $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
- }\r
- $this->additionalFields['languageID'] = $this->languageID;\r
- $data = array(\r
- 'data' => array_merge($this->additionalFields, array(\r
- 'username' => $this->username,\r
- 'email' => $this->email,\r
- 'password' => $this->password,\r
- )),\r
- 'groups' => $this->groupIDs,\r
- 'languages' => $this->visibleLanguages,\r
- 'options' => $saveOptions\r
- );\r
- $userAction = new UserAction(array($this->userID), 'update', $data);\r
- $userAction->executeAction();\r
- \r
- $this->saved();\r
- \r
- // reset password\r
- $this->password = $this->confirmPassword = '';\r
- \r
- // show success message\r
- WCF::getTPL()->assign('success', true);\r
- }\r
- \r
- /**\r
- * @see UserAddForm::validateUsername()\r
- */\r
- protected function validateUsername($username) {\r
- if (StringUtil::toLowerCase($this->user->username) != StringUtil::toLowerCase($username)) {\r
- parent::validateUsername($username);\r
- }\r
- }\r
- \r
- /**\r
- * @see UserAddForm::validateEmail()\r
- */\r
- protected function validateEmail($email, $confirmEmail) {\r
- if (StringUtil::toLowerCase($this->user->email) != StringUtil::toLowerCase($email)) {\r
- parent::validateEmail($email, $this->confirmEmail); \r
- }\r
- }\r
- \r
- /**\r
- * @see UserAddForm::validatePassword()\r
- */\r
- protected function validatePassword($password, $confirmPassword) {\r
- if (!empty($password) || !empty($confirmPassword)) {\r
- parent::validatePassword($password, $confirmPassword);\r
- }\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\User;
+use wcf\data\user\UserAction;
+use wcf\data\user\UserEditor;
+use wcf\data\user\group\UserGroup;
+use wcf\form\AbstractForm;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\PermissionDeniedException;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the user edit form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class UserEditForm extends UserAddForm {
+ /**
+ * @see UserAddForm::$menuItemName
+ */
+ public $menuItemName = 'wcf.acp.menu.link.user.management';
+
+ /**
+ * @see wcf\page\AbstractPage::$neededPermissions
+ */
+ public $neededPermissions = array('admin.user.canEditUser');
+
+ /**
+ * user id
+ * @var integer
+ */
+ public $userID = 0;
+
+ /**
+ * user editor object
+ * @var UserEditor
+ */
+ public $user = null;
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_REQUEST['userID'])) {
+ $this->userID = intval($_REQUEST['userID']);
+ $user = new User($this->userID);
+ if (!$user->userID) {
+ throw new IllegalLinkException();
+ }
+
+ $this->user = new UserEditor($user);
+ if (!UserGroup::isAccessibleGroup($this->user->getGroupIDs())) {
+ throw new PermissionDeniedException();
+ }
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (!WCF::getSession()->getPermission('admin.user.canEditPassword')) $this->password = $this->confirmPassword = '';
+ if (!WCF::getSession()->getPermission('admin.user.canEditMailAddress')) $this->email = $this->confirmEmail = $this->user->email;
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ if (!count($_POST)) {
+ // get visible languages
+ $this->readVisibleLanguages();
+
+ // default values
+ $this->readDefaultValues();
+ }
+
+ parent::readData();
+ }
+
+ /**
+ * Gets the selected languages.
+ */
+ protected function readVisibleLanguages() {
+ $this->visibleLanguages = $this->user->getLanguageIDs();
+ }
+
+ /**
+ * Gets the default values.
+ */
+ protected function readDefaultValues() {
+ $this->username = $this->user->username;
+ $this->email = $this->confirmEmail = $this->user->email;
+ $this->groupIDs = $this->user->getGroupIDs();
+ $this->languageID = $this->user->languageID;
+
+ foreach ($this->options as $option) {
+ $value = $this->user->{'userOption'.$option->optionID};
+ if ($value !== null) {
+ $this->optionValues[$option->optionName] = $value;
+ }
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'userID' => $this->user->userID,
+ 'action' => 'edit',
+ 'url' => '',
+ 'markedUsers' => 0,
+ 'user' => $this->user
+ ));
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ AbstractForm::save();
+
+ // add default groups
+ $defaultGroups = UserGroup::getAccessibleGroups(array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));
+ $oldGroupIDs = $this->user->getGroupIDs();
+ foreach ($oldGroupIDs as $oldGroupID) {
+ if (isset($defaultGroups[$oldGroupID])) {
+ $this->groupIDs[] = $oldGroupID;
+ }
+ }
+ $this->groupIDs = array_unique($this->groupIDs);
+
+ // save user
+ $saveOptions = array();
+ foreach ($this->options as $option) {
+ $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+ }
+ $this->additionalFields['languageID'] = $this->languageID;
+ $data = array(
+ 'data' => array_merge($this->additionalFields, array(
+ 'username' => $this->username,
+ 'email' => $this->email,
+ 'password' => $this->password,
+ )),
+ 'groups' => $this->groupIDs,
+ 'languages' => $this->visibleLanguages,
+ 'options' => $saveOptions
+ );
+ $userAction = new UserAction(array($this->userID), 'update', $data);
+ $userAction->executeAction();
+
+ $this->saved();
+
+ // reset password
+ $this->password = $this->confirmPassword = '';
+
+ // show success message
+ WCF::getTPL()->assign('success', true);
+ }
+
+ /**
+ * @see UserAddForm::validateUsername()
+ */
+ protected function validateUsername($username) {
+ if (StringUtil::toLowerCase($this->user->username) != StringUtil::toLowerCase($username)) {
+ parent::validateUsername($username);
+ }
+ }
+
+ /**
+ * @see UserAddForm::validateEmail()
+ */
+ protected function validateEmail($email, $confirmEmail) {
+ if (StringUtil::toLowerCase($this->user->email) != StringUtil::toLowerCase($email)) {
+ parent::validateEmail($email, $this->confirmEmail);
+ }
+ }
+
+ /**
+ * @see UserAddForm::validatePassword()
+ */
+ protected function validatePassword($password, $confirmPassword) {
+ if (!empty($password) || !empty($confirmPassword)) {
+ parent::validatePassword($password, $confirmPassword);
+ }
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\User;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the export user mail addresses form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class UserEmailAddressExportForm extends ACPForm {\r
- public $templateName = 'userEmailAddressExport';\r
- public $activeMenuItem = 'wcf.acp.menu.link.user.management';\r
- public $neededPermissions = array('admin.user.canMailUser');\r
- \r
- public $fileType = 'csv';\r
- public $userIDs = array();\r
- public $separator = ',';\r
- public $textSeparator = '"'; \r
- public $users = array();\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['fileType']) && $_POST['fileType'] == 'xml') $this->fileType = $_POST['fileType'];\r
- if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));\r
- if (isset($_POST['separator'])) $this->separator = $_POST['separator'];\r
- if (isset($_POST['textSeparator'])) $this->textSeparator = $_POST['textSeparator'];\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- parent::validate();\r
- \r
- if (empty($this->userIDs)) throw new IllegalLinkException();\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- parent::save();\r
- \r
- // send content type\r
- header('Content-Type: text/'.$this->fileType.'; charset=UTF-8');\r
- header('Content-Disposition: attachment; filename="export.'.$this->fileType.'"');\r
- \r
- if ($this->fileType == 'xml') {\r
- echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<addresses>\n";\r
- }\r
- \r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("userID IN (?)", array($this->userIDs));\r
- \r
- // count users\r
- $sql = "SELECT COUNT(*) AS count\r
- FROM wcf".WCF_N."_user\r
- ".$conditions;\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- $count = $statement->fetchArray();\r
- \r
- // get users\r
- $sql = "SELECT email\r
- FROM wcf".WCF_N."_user\r
- ".$conditions."\r
- ORDER BY email";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- \r
- $i = 0;\r
- while ($row = WCF::getDB()->fetchArray($result)) {\r
- if ($this->fileType == 'xml') echo "<address><![CDATA[".StringUtil::escapeCDATA($row['email'])."]]></address>\n";\r
- else echo $this->textSeparator . $row['email'] . $this->textSeparator . ($i < $count['count'] ? $this->separator : '');\r
- $i++;\r
- }\r
- \r
- if ($this->fileType == 'xml') {\r
- echo "</addresses>";\r
- }\r
- \r
- // TODO: Implement unmarkAll()\r
- //UserEditor::unmarkAll();\r
- $this->saved();\r
- exit;\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- if (!count($_POST)) {\r
- // get marked user ids\r
- $markedUsers = WCF::getSession()->getVar('markedUsers');\r
- if (is_array($markedUsers)) $this->userIDs = implode(',', $markedUsers);\r
- if (empty($this->userIDs)) throw new IllegalLinkException();\r
- }\r
- \r
- $this->users = User::getUsers($this->userIDs);\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'users' => $this->users,\r
- 'userIDs' => $this->userIDs,\r
- 'separator' => $this->separator,\r
- 'textSeparator' => $this->textSeparator,\r
- 'fileType' => $this->fileType\r
- ));\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\User;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+use wcf\util\ArrayUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the export user mail addresses form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class UserEmailAddressExportForm extends ACPForm {
+ public $templateName = 'userEmailAddressExport';
+ public $activeMenuItem = 'wcf.acp.menu.link.user.management';
+ public $neededPermissions = array('admin.user.canMailUser');
+
+ public $fileType = 'csv';
+ public $userIDs = array();
+ public $separator = ',';
+ public $textSeparator = '"';
+ public $users = array();
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['fileType']) && $_POST['fileType'] == 'xml') $this->fileType = $_POST['fileType'];
+ if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));
+ if (isset($_POST['separator'])) $this->separator = $_POST['separator'];
+ if (isset($_POST['textSeparator'])) $this->textSeparator = $_POST['textSeparator'];
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ parent::validate();
+
+ if (empty($this->userIDs)) throw new IllegalLinkException();
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ parent::save();
+
+ // send content type
+ header('Content-Type: text/'.$this->fileType.'; charset=UTF-8');
+ header('Content-Disposition: attachment; filename="export.'.$this->fileType.'"');
+
+ if ($this->fileType == 'xml') {
+ echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<addresses>\n";
+ }
+
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("userID IN (?)", array($this->userIDs));
+
+ // count users
+ $sql = "SELECT COUNT(*) AS count
+ FROM wcf".WCF_N."_user
+ ".$conditions;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+ $count = $statement->fetchArray();
+
+ // get users
+ $sql = "SELECT email
+ FROM wcf".WCF_N."_user
+ ".$conditions."
+ ORDER BY email";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+
+ $i = 0;
+ while ($row = WCF::getDB()->fetchArray($result)) {
+ if ($this->fileType == 'xml') echo "<address><![CDATA[".StringUtil::escapeCDATA($row['email'])."]]></address>\n";
+ else echo $this->textSeparator . $row['email'] . $this->textSeparator . ($i < $count['count'] ? $this->separator : '');
+ $i++;
+ }
+
+ if ($this->fileType == 'xml') {
+ echo "</addresses>";
+ }
+
+ // TODO: Implement unmarkAll()
+ //UserEditor::unmarkAll();
+ $this->saved();
+ exit;
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ if (!count($_POST)) {
+ // get marked user ids
+ $markedUsers = WCF::getSession()->getVar('markedUsers');
+ if (is_array($markedUsers)) $this->userIDs = implode(',', $markedUsers);
+ if (empty($this->userIDs)) throw new IllegalLinkException();
+ }
+
+ $this->users = User::getUsers($this->userIDs);
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'users' => $this->users,
+ 'userIDs' => $this->userIDs,
+ 'separator' => $this->separator,
+ 'textSeparator' => $this->textSeparator,
+ 'fileType' => $this->fileType
+ ));
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\group\UserGroupAction;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-use wcf\util\ClassUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the group add form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class UserGroupAddForm extends AbstractOptionListForm {\r
- /**\r
- * @see wcf\page\AbstractPage::$neededPermissions\r
- */\r
- public $neededPermissions = array('admin.user.canAddGroup');\r
- \r
- /**\r
- * @see wcf\page\AbstractPage::$templateName\r
- */\r
- public $templateName = 'userGroupAdd';\r
- \r
- /**\r
- * name of the active acp menu item\r
- * @var string\r
- */\r
- public $menuItemName = 'wcf.acp.menu.link.group.add';\r
- \r
- /**\r
- * @see AbstractOptionListForm::$cacheName\r
- */\r
- public $cacheName = 'user_group-option-';\r
- \r
- /**\r
- * active tab menu item name\r
- * @var string\r
- */\r
- public $activeTabMenuItem = '';\r
- \r
- /**\r
- * active sub tab menu item name\r
- * @var string\r
- */\r
- public $activeSubTabMenuItem = '';\r
- \r
- /**\r
- * the option tree\r
- * @var array\r
- */\r
- public $optionTree = array();\r
- \r
- /**\r
- * group name\r
- * @var string\r
- */\r
- public $groupName = '';\r
- \r
- /**\r
- * additional fields\r
- * @var array\r
- */\r
- public $additionalFields = array();\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['groupName'])) $this->groupName = StringUtil::trim($_POST['groupName']);\r
- if (isset($_POST['activeTabMenuItem'])) $this->activeTabMenuItem = $_POST['activeTabMenuItem'];\r
- if (isset($_POST['activeSubTabMenuItem'])) $this->activeSubTabMenuItem = $_POST['activeSubTabMenuItem'];\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- // validate dynamic options\r
- parent::validate();\r
- \r
- // validate group name\r
- try {\r
- if (empty($this->groupName)) {\r
- throw new UserInputException('groupName');\r
- }\r
- }\r
- catch (UserInputException $e) {\r
- $this->errorType[$e->getField()] = $e->getType();\r
- }\r
- \r
- if (count($this->errorType) > 0) {\r
- throw new UserInputException('groupName', $this->errorType);\r
- } \r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- parent::save();\r
- \r
- // get default group\r
- $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);\r
- $saveOptions = array();\r
- foreach ($this->options as $option) {\r
- if ($this->optionValues[$option->optionName] != $defaultGroup->getGroupOption($option->optionName)) {\r
- $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
- }\r
- }\r
- \r
- $data = array(\r
- 'data' => array_merge($this->additionalFields, array('groupName' => $this->groupName)),\r
- 'options' => $saveOptions\r
- );\r
- $groupAction = new UserGroupAction(array(), 'create', $data);\r
- $groupAction->executeAction();\r
- $this->saved();\r
- \r
- // show success message\r
- WCF::getTPL()->assign(array(\r
- 'success' => true\r
- ));\r
- \r
- // reset values\r
- $this->groupName = '';\r
- $this->optionValues = array();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- AbstractOptionListForm::readData();\r
- \r
- $this->optionTree = $this->getOptionTree();\r
- if (!count($_POST)) {\r
- $this->activeTabMenuItem = $this->optionTree[0]['object']->categoryName;\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'groupName' => $this->groupName,\r
- 'optionTree' => $this->optionTree,\r
- 'action' => 'add',\r
- 'activeTabMenuItem' => $this->activeTabMenuItem,\r
- 'activeSubTabMenuItem' => $this->activeSubTabMenuItem\r
- ));\r
- }\r
-\r
- /**\r
- * @see wcf\form\IForm::show()\r
- */\r
- public function show() {\r
- // set active menu item\r
- ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);\r
- \r
- // check master password\r
- WCFACP::checkMasterPassword();\r
- \r
- // get user options and categories from cache\r
- $this->readCache();\r
- \r
- // show form\r
- parent::show();\r
- }\r
- \r
- /**\r
- * @see AbstractOptionListForm::getTypeObject()\r
- */\r
- protected function getTypeObject($type) {\r
- if (!isset($this->typeObjects[$type])) {\r
- $className = 'wcf\system\option\group\GroupOptionType'.ucfirst($type);\r
- \r
- // create instance\r
- if (!class_exists($className)) {\r
- throw new SystemException("unable to find class '".$className."'", 11001);\r
- }\r
- if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\group\IGroupOptionType')) {\r
- throw new SystemException("'".$className."' should implement wcf\system\option\group\IGroupOptionType", 11001);\r
- }\r
- $this->typeObjects[$type] = new $className();\r
- }\r
- \r
- return $this->typeObjects[$type];\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\group\UserGroupAction;
+use wcf\system\exception\UserInputException;
+use wcf\system\exception\SystemException;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+use wcf\util\ClassUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the group add form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class UserGroupAddForm extends AbstractOptionListForm {
+ /**
+ * @see wcf\page\AbstractPage::$neededPermissions
+ */
+ public $neededPermissions = array('admin.user.canAddGroup');
+
+ /**
+ * @see wcf\page\AbstractPage::$templateName
+ */
+ public $templateName = 'userGroupAdd';
+
+ /**
+ * name of the active acp menu item
+ * @var string
+ */
+ public $menuItemName = 'wcf.acp.menu.link.group.add';
+
+ /**
+ * @see AbstractOptionListForm::$cacheName
+ */
+ public $cacheName = 'user_group-option-';
+
+ /**
+ * active tab menu item name
+ * @var string
+ */
+ public $activeTabMenuItem = '';
+
+ /**
+ * active sub tab menu item name
+ * @var string
+ */
+ public $activeSubTabMenuItem = '';
+
+ /**
+ * the option tree
+ * @var array
+ */
+ public $optionTree = array();
+
+ /**
+ * group name
+ * @var string
+ */
+ public $groupName = '';
+
+ /**
+ * additional fields
+ * @var array
+ */
+ public $additionalFields = array();
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['groupName'])) $this->groupName = StringUtil::trim($_POST['groupName']);
+ if (isset($_POST['activeTabMenuItem'])) $this->activeTabMenuItem = $_POST['activeTabMenuItem'];
+ if (isset($_POST['activeSubTabMenuItem'])) $this->activeSubTabMenuItem = $_POST['activeSubTabMenuItem'];
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ // validate dynamic options
+ parent::validate();
+
+ // validate group name
+ try {
+ if (empty($this->groupName)) {
+ throw new UserInputException('groupName');
+ }
+ }
+ catch (UserInputException $e) {
+ $this->errorType[$e->getField()] = $e->getType();
+ }
+
+ if (count($this->errorType) > 0) {
+ throw new UserInputException('groupName', $this->errorType);
+ }
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ parent::save();
+
+ // get default group
+ $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);
+ $saveOptions = array();
+ foreach ($this->options as $option) {
+ if ($this->optionValues[$option->optionName] != $defaultGroup->getGroupOption($option->optionName)) {
+ $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+ }
+ }
+
+ $data = array(
+ 'data' => array_merge($this->additionalFields, array('groupName' => $this->groupName)),
+ 'options' => $saveOptions
+ );
+ $groupAction = new UserGroupAction(array(), 'create', $data);
+ $groupAction->executeAction();
+ $this->saved();
+
+ // show success message
+ WCF::getTPL()->assign(array(
+ 'success' => true
+ ));
+
+ // reset values
+ $this->groupName = '';
+ $this->optionValues = array();
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ AbstractOptionListForm::readData();
+
+ $this->optionTree = $this->getOptionTree();
+ if (!count($_POST)) {
+ $this->activeTabMenuItem = $this->optionTree[0]['object']->categoryName;
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'groupName' => $this->groupName,
+ 'optionTree' => $this->optionTree,
+ 'action' => 'add',
+ 'activeTabMenuItem' => $this->activeTabMenuItem,
+ 'activeSubTabMenuItem' => $this->activeSubTabMenuItem
+ ));
+ }
+
+ /**
+ * @see wcf\form\IForm::show()
+ */
+ public function show() {
+ // set active menu item
+ ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);
+
+ // check master password
+ WCFACP::checkMasterPassword();
+
+ // get user options and categories from cache
+ $this->readCache();
+
+ // show form
+ parent::show();
+ }
+
+ /**
+ * @see AbstractOptionListForm::getTypeObject()
+ */
+ protected function getTypeObject($type) {
+ if (!isset($this->typeObjects[$type])) {
+ $className = 'wcf\system\option\group\GroupOptionType'.ucfirst($type);
+
+ // create instance
+ if (!class_exists($className)) {
+ throw new SystemException("unable to find class '".$className."'", 11001);
+ }
+ if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\group\IGroupOptionType')) {
+ throw new SystemException("'".$className."' should implement wcf\system\option\group\IGroupOptionType", 11001);
+ }
+ $this->typeObjects[$type] = new $className();
+ }
+
+ return $this->typeObjects[$type];
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\acp\session\ACPSession;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\group\UserGroupAction;\r
-use wcf\data\user\group\UserGroupEditor;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\PermissionDeniedException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows the group edit form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class UserGroupEditForm extends UserGroupAddForm {\r
- /**\r
- * @see UserGroupAddForm::$menuItemName\r
- */\r
- public $menuItemName = 'wcf.acp.menu.link.group';\r
- \r
- /**\r
- * @see wcf\page\AbstractPage::$neededPermissions\r
- */\r
- public $neededPermissions = array('admin.user.canEditGroup');\r
- \r
- /**\r
- * group id\r
- * @var integer\r
- */\r
- public $groupID = 0;\r
- \r
- /**\r
- * group editor object\r
- * @var GroupEditor\r
- */\r
- public $group = null;\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- // get group\r
- if (isset($_REQUEST['groupID'])) $this->groupID = intval($_REQUEST['groupID']);\r
- $group = new UserGroup($this->groupID);\r
- if (!$group->groupID) {\r
- throw new IllegalLinkException();\r
- }\r
- if (!$group->isAccessible()) {\r
- throw new PermissionDeniedException();\r
- }\r
- \r
- $this->group = new UserGroupEditor($group);\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- if (!count($_POST)) {\r
- $this->groupName = $this->group->groupName;\r
- \r
- // get default values\r
- if ($this->group->groupType != UserGroup::EVERYONE) {\r
- $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);\r
- foreach ($this->options as $option) {\r
- $value = $defaultGroup->getGroupOption($option->optionName);\r
- if ($value !== null) {\r
- $this->optionValues[$option->optionName] = $value;\r
- }\r
- }\r
- }\r
- \r
- foreach ($this->options as $option) {\r
- $value = $this->group->getGroupOption($option->optionName);\r
- if ($value !== null) {\r
- $this->optionValues[$option->optionName] = $value;\r
- }\r
- }\r
- }\r
- \r
- parent::readData();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'groupID' => $this->group->groupID,\r
- 'action' => 'edit'\r
- ));\r
- \r
- // add warning when the initiator is in the group\r
- if ($this->group->isMember($this->groupID)) {\r
- WCF::getTPL()->assign('warningSelfEdit', true);\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- AbstractForm::save();\r
- \r
- // save group\r
- $saveOptions = array();\r
- if ($this->group->groupType == UserGroup::EVERYONE) {\r
- foreach ($this->options as $option) {\r
- $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
- }\r
- }\r
- else {\r
- // get default group\r
- $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);\r
- foreach ($this->options as $option) {\r
- if ($this->optionValues[$option->optionName] != $defaultGroup->getGroupOption($option->optionName)) {\r
- $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];\r
- }\r
- }\r
- }\r
- $data = array(\r
- 'data' => array_merge(array('groupName' => $this->groupName), $this->additionalFields),\r
- 'options' => $saveOptions\r
- );\r
- $groupAction = new UserGroupAction(array($this->groupID), 'update', $data);\r
- $groupAction->executeAction();\r
- $this->saved();\r
- \r
- // show success message\r
- WCF::getTPL()->assign('success', true);\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\acp\session\ACPSession;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\group\UserGroupAction;
+use wcf\data\user\group\UserGroupEditor;
+use wcf\form\AbstractForm;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\PermissionDeniedException;
+use wcf\system\WCF;
+
+/**
+ * Shows the group edit form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class UserGroupEditForm extends UserGroupAddForm {
+ /**
+ * @see UserGroupAddForm::$menuItemName
+ */
+ public $menuItemName = 'wcf.acp.menu.link.group';
+
+ /**
+ * @see wcf\page\AbstractPage::$neededPermissions
+ */
+ public $neededPermissions = array('admin.user.canEditGroup');
+
+ /**
+ * group id
+ * @var integer
+ */
+ public $groupID = 0;
+
+ /**
+ * group editor object
+ * @var GroupEditor
+ */
+ public $group = null;
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ // get group
+ if (isset($_REQUEST['groupID'])) $this->groupID = intval($_REQUEST['groupID']);
+ $group = new UserGroup($this->groupID);
+ if (!$group->groupID) {
+ throw new IllegalLinkException();
+ }
+ if (!$group->isAccessible()) {
+ throw new PermissionDeniedException();
+ }
+
+ $this->group = new UserGroupEditor($group);
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ if (!count($_POST)) {
+ $this->groupName = $this->group->groupName;
+
+ // get default values
+ if ($this->group->groupType != UserGroup::EVERYONE) {
+ $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);
+ foreach ($this->options as $option) {
+ $value = $defaultGroup->getGroupOption($option->optionName);
+ if ($value !== null) {
+ $this->optionValues[$option->optionName] = $value;
+ }
+ }
+ }
+
+ foreach ($this->options as $option) {
+ $value = $this->group->getGroupOption($option->optionName);
+ if ($value !== null) {
+ $this->optionValues[$option->optionName] = $value;
+ }
+ }
+ }
+
+ parent::readData();
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'groupID' => $this->group->groupID,
+ 'action' => 'edit'
+ ));
+
+ // add warning when the initiator is in the group
+ if ($this->group->isMember($this->groupID)) {
+ WCF::getTPL()->assign('warningSelfEdit', true);
+ }
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ AbstractForm::save();
+
+ // save group
+ $saveOptions = array();
+ if ($this->group->groupType == UserGroup::EVERYONE) {
+ foreach ($this->options as $option) {
+ $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+ }
+ }
+ else {
+ // get default group
+ $defaultGroup = UserGroup::getGroupByType(UserGroup::EVERYONE);
+ foreach ($this->options as $option) {
+ if ($this->optionValues[$option->optionName] != $defaultGroup->getGroupOption($option->optionName)) {
+ $saveOptions[$option->optionID] = $this->optionValues[$option->optionName];
+ }
+ }
+ }
+ $data = array(
+ 'data' => array_merge(array('groupName' => $this->groupName), $this->additionalFields),
+ 'options' => $saveOptions
+ );
+ $groupAction = new UserGroupAction(array($this->groupID), 'update', $data);
+ $groupAction->executeAction();
+ $this->saved();
+
+ // show success message
+ WCF::getTPL()->assign('success', true);
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\data\user\UserList;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\StringUtil;\r
-use wcf\system\WCF;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\exception\UserInputException;\r
-\r
-/**\r
- * Shows the user mail form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class UserMailForm extends ACPForm {\r
- // system\r
- public $templateName = 'userMail';\r
- public $neededPermissions = array('admin.user.canMailUser');\r
- \r
- // parameters\r
- public $userIDs = array();\r
- public $groupIDs = array();\r
- public $subject = '';\r
- public $text = '';\r
- public $from = '';\r
- public $users = array();\r
- public $groups = array();\r
- public $enableHTML = 0;\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- $this->activeMenuItem = ($this->action == 'all' ? 'wcf.acp.menu.link.user.mail' : ($this->action == 'group' ? 'wcf.acp.menu.link.group.mail' : 'wcf.acp.menu.link.user.management'));\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));\r
- if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);\r
- if (isset($_POST['subject'])) $this->subject = StringUtil::trim($_POST['subject']);\r
- if (isset($_POST['text'])) $this->text = StringUtil::trim($_POST['text']);\r
- if (isset($_POST['from'])) $this->from = StringUtil::trim($_POST['from']);\r
- if (isset($_POST['enableHTML'])) $this->enableHTML = intval($_POST['enableHTML']);\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- parent::validate();\r
- \r
- if ($this->action == 'group') {\r
- if (!count($this->groupIDs)) {\r
- throw new UserInputException('groupIDs');\r
- }\r
- }\r
- if ($this->action == '') {\r
- if (empty($this->userIDs)) throw new IllegalLinkException();\r
- }\r
- \r
- if (empty($this->subject)) {\r
- throw new UserInputException('subject');\r
- }\r
- \r
- if (empty($this->text)) {\r
- throw new UserInputException('text');\r
- }\r
- \r
- if (empty($this->from)) {\r
- throw new UserInputException('from');\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- parent::save();\r
- \r
- // save config in session\r
- $userMailData = WCF::getSession()->getVar('userMailData');\r
- if ($userMailData === null) $userMailData = array();\r
- $mailID = count($userMailData);\r
- $userMailData[$mailID] = array(\r
- 'action' => $this->action,\r
- 'userIDs' => $this->userIDs,\r
- 'groupIDs' => implode(',', $this->groupIDs),\r
- 'subject' => $this->subject,\r
- 'text' => $this->text,\r
- 'from' => $this->from,\r
- 'enableHTML' => $this->enableHTML\r
- );\r
- WCF::getSession()->register('userMailData', $userMailData);\r
- $this->saved();\r
- \r
- // show worker template\r
- WCF::getTPL()->assign(array(\r
- 'pageTitle' => WCF::getLanguage()->get(($this->action == 'all' ? 'wcf.acp.user.sendMail.all' : ($this->action == 'group' ? 'wcf.acp.user.sendMail.group' : 'wcf.acp.user.sendMail'))),\r
- 'url' => 'index.php?action=UserMail&mailID='.$mailID.''.SID_ARG_2ND_NOT_ENCODED\r
- ));\r
- WCF::getTPL()->display('worker');\r
- exit;\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- if (!count($_POST)) {\r
- // get marked user ids\r
- if (empty($this->action)) {\r
- $markedUsers = WCF::getSession()->getVar('markedUsers');\r
- if (is_array($markedUsers)) $this->userIDs = implode(',', $markedUsers);\r
- if (empty($this->userIDs)) throw new IllegalLinkException();\r
- }\r
- \r
- if (MAIL_USE_FORMATTED_ADDRESS) $this->from = MAIL_FROM_NAME . ' <' . MAIL_FROM_ADDRESS . '>';\r
- else $this->from = MAIL_FROM_ADDRESS;\r
- }\r
- \r
- if (!empty($this->userIDs)) {\r
- $userList = new UserList();\r
- $userList->getConditionBuilder()->add("user.userID IN (?)", array($this->userIDs));\r
- $userList->sqlOrderBy = "user.username ASC";\r
- $userList->readObjects();\r
- \r
- $this->users = $userList->getObjects();\r
- }\r
- \r
- $this->groups = UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE));\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'users' => $this->users,\r
- 'groups' => $this->groups,\r
- 'userIDs' => $this->userIDs,\r
- 'groupIDs' => $this->groupIDs,\r
- 'subject' => $this->subject,\r
- 'text' => $this->text,\r
- 'from' => $this->from,\r
- 'enableHTML' => $this->enableHTML\r
- ));\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\user\group\UserGroup;
+use wcf\data\user\UserList;
+use wcf\util\ArrayUtil;
+use wcf\util\StringUtil;
+use wcf\system\WCF;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\UserInputException;
+
+/**
+ * Shows the user mail form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class UserMailForm extends ACPForm {
+ // system
+ public $templateName = 'userMail';
+ public $neededPermissions = array('admin.user.canMailUser');
+
+ // parameters
+ public $userIDs = array();
+ public $groupIDs = array();
+ public $subject = '';
+ public $text = '';
+ public $from = '';
+ public $users = array();
+ public $groups = array();
+ public $enableHTML = 0;
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ $this->activeMenuItem = ($this->action == 'all' ? 'wcf.acp.menu.link.user.mail' : ($this->action == 'group' ? 'wcf.acp.menu.link.group.mail' : 'wcf.acp.menu.link.user.management'));
+ }
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['userIDs'])) $this->userIDs = ArrayUtil::toIntegerArray(explode(',', $_POST['userIDs']));
+ if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);
+ if (isset($_POST['subject'])) $this->subject = StringUtil::trim($_POST['subject']);
+ if (isset($_POST['text'])) $this->text = StringUtil::trim($_POST['text']);
+ if (isset($_POST['from'])) $this->from = StringUtil::trim($_POST['from']);
+ if (isset($_POST['enableHTML'])) $this->enableHTML = intval($_POST['enableHTML']);
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ parent::validate();
+
+ if ($this->action == 'group') {
+ if (!count($this->groupIDs)) {
+ throw new UserInputException('groupIDs');
+ }
+ }
+ if ($this->action == '') {
+ if (empty($this->userIDs)) throw new IllegalLinkException();
+ }
+
+ if (empty($this->subject)) {
+ throw new UserInputException('subject');
+ }
+
+ if (empty($this->text)) {
+ throw new UserInputException('text');
+ }
+
+ if (empty($this->from)) {
+ throw new UserInputException('from');
+ }
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ parent::save();
+
+ // save config in session
+ $userMailData = WCF::getSession()->getVar('userMailData');
+ if ($userMailData === null) $userMailData = array();
+ $mailID = count($userMailData);
+ $userMailData[$mailID] = array(
+ 'action' => $this->action,
+ 'userIDs' => $this->userIDs,
+ 'groupIDs' => implode(',', $this->groupIDs),
+ 'subject' => $this->subject,
+ 'text' => $this->text,
+ 'from' => $this->from,
+ 'enableHTML' => $this->enableHTML
+ );
+ WCF::getSession()->register('userMailData', $userMailData);
+ $this->saved();
+
+ // show worker template
+ WCF::getTPL()->assign(array(
+ 'pageTitle' => WCF::getLanguage()->get(($this->action == 'all' ? 'wcf.acp.user.sendMail.all' : ($this->action == 'group' ? 'wcf.acp.user.sendMail.group' : 'wcf.acp.user.sendMail'))),
+ 'url' => 'index.php?action=UserMail&mailID='.$mailID.''.SID_ARG_2ND_NOT_ENCODED
+ ));
+ WCF::getTPL()->display('worker');
+ exit;
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function readData() {
+ parent::readData();
+
+ if (!count($_POST)) {
+ // get marked user ids
+ if (empty($this->action)) {
+ $markedUsers = WCF::getSession()->getVar('markedUsers');
+ if (is_array($markedUsers)) $this->userIDs = implode(',', $markedUsers);
+ if (empty($this->userIDs)) throw new IllegalLinkException();
+ }
+
+ if (MAIL_USE_FORMATTED_ADDRESS) $this->from = MAIL_FROM_NAME . ' <' . MAIL_FROM_ADDRESS . '>';
+ else $this->from = MAIL_FROM_ADDRESS;
+ }
+
+ if (!empty($this->userIDs)) {
+ $userList = new UserList();
+ $userList->getConditionBuilder()->add("user.userID IN (?)", array($this->userIDs));
+ $userList->sqlOrderBy = "user.username ASC";
+ $userList->readObjects();
+
+ $this->users = $userList->getObjects();
+ }
+
+ $this->groups = UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE));
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'users' => $this->users,
+ 'groups' => $this->groups,
+ 'userIDs' => $this->userIDs,
+ 'groupIDs' => $this->groupIDs,
+ 'subject' => $this->subject,
+ 'text' => $this->text,
+ 'from' => $this->from,
+ 'enableHTML' => $this->enableHTML
+ ));
+ }
+}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\data\option\Option;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\system\WCF;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\language\LanguageFactory;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * This class provides default implementations for a list of dynamic user options.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-abstract class UserOptionListForm extends AbstractOptionListForm {\r
- /**\r
- * @see AbstractOptionListForm::$cacheName\r
- */\r
- public $cacheName = 'user-option-';\r
- \r
- /**\r
- * Returns a list of all available user groups.\r
- * \r
- * @return array\r
- */\r
- protected function getAvailableGroups() {\r
- return UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));\r
- }\r
- \r
- /**\r
- * Returns a list of all available languages.\r
- * \r
- * @return array\r
- */\r
- protected function getAvailableLanguages() {\r
- $availableLanguages = array();\r
- foreach (LanguageFactory::getAvailableLanguages(PACKAGE_ID) as $language) {\r
- $availableLanguages[$language['languageID']] = WCF::getLanguage()->get('wcf.global.language.'.$language['languageCode']); \r
- }\r
- \r
- // sort languages\r
- StringUtil::sort($availableLanguages);\r
- \r
- return $availableLanguages;\r
- }\r
- \r
- /**\r
- * Returns a list of all available content languages.\r
- * \r
- * @return array\r
- */\r
- public static function getAvailableContentLanguages() {\r
- $availableLanguages = array();\r
- foreach (LanguageFactory::getAvailableContentLanguages(PACKAGE_ID) as $language) {\r
- $availableLanguages[$language['languageID']] = WCF::getLanguage()->get('wcf.global.language.'.$language['languageCode']); \r
- }\r
- \r
- // sort languages\r
- StringUtil::sort($availableLanguages);\r
- \r
- return $availableLanguages;\r
- }\r
- \r
- /**\r
- * Returns the default-form language id \r
- * \r
- * @return integer $languageID\r
- */\r
- protected function getDefaultFormLanguageID() {\r
- return LanguageFactory::getDefaultLanguageID();\r
- }\r
- \r
- /**\r
- * @see AbstractOptionListForm::validateOption()\r
- */\r
- protected function validateOption(Option $option) {\r
- parent::validateOption($option);\r
-\r
- if ($option->required && empty($this->optionValues[$option->optionName])) {\r
- throw new UserInputException($option->optionName);\r
- }\r
- }\r
+<?php
+namespace wcf\acp\form;
+use wcf\data\option\Option;
+use wcf\data\user\group\UserGroup;
+use wcf\system\WCF;
+use wcf\system\exception\UserInputException;
+use wcf\system\language\LanguageFactory;
+use wcf\util\StringUtil;
+
+/**
+ * This class provides default implementations for a list of dynamic user options.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+abstract class UserOptionListForm extends AbstractOptionListForm {
+ /**
+ * @see AbstractOptionListForm::$cacheName
+ */
+ public $cacheName = 'user-option-';
+
+ /**
+ * Returns a list of all available user groups.
+ *
+ * @return array
+ */
+ protected function getAvailableGroups() {
+ return UserGroup::getAccessibleGroups(array(), array(UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::USERS));
+ }
+
+ /**
+ * Returns a list of all available languages.
+ *
+ * @return array
+ */
+ protected function getAvailableLanguages() {
+ $availableLanguages = array();
+ foreach (LanguageFactory::getAvailableLanguages(PACKAGE_ID) as $language) {
+ $availableLanguages[$language['languageID']] = WCF::getLanguage()->get('wcf.global.language.'.$language['languageCode']);
+ }
+
+ // sort languages
+ StringUtil::sort($availableLanguages);
+
+ return $availableLanguages;
+ }
+
+ /**
+ * Returns a list of all available content languages.
+ *
+ * @return array
+ */
+ public static function getAvailableContentLanguages() {
+ $availableLanguages = array();
+ foreach (LanguageFactory::getAvailableContentLanguages(PACKAGE_ID) as $language) {
+ $availableLanguages[$language['languageID']] = WCF::getLanguage()->get('wcf.global.language.'.$language['languageCode']);
+ }
+
+ // sort languages
+ StringUtil::sort($availableLanguages);
+
+ return $availableLanguages;
+ }
+
+ /**
+ * Returns the default-form language id
+ *
+ * @return integer $languageID
+ */
+ protected function getDefaultFormLanguageID() {
+ return LanguageFactory::getDefaultLanguageID();
+ }
+
+ /**
+ * @see AbstractOptionListForm::validateOption()
+ */
+ protected function validateOption(Option $option) {
+ parent::validateOption($option);
+
+ if ($option->required && empty($this->optionValues[$option->optionName])) {
+ throw new UserInputException($option->optionName);
+ }
+ }
}
-<?php\r
-namespace wcf\acp\form;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\option\Option;\r
-use wcf\data\search\SearchEditor;\r
-use wcf\form\AbstractForm;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\wcf;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\HeaderUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the user search form.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.form\r
- * @category Community Framework\r
- */\r
-class UserSearchForm extends UserOptionListForm {\r
- /**\r
- * @see wcf\page\AbstractPage::$templateName\r
- */\r
- public $templateName = 'userSearch';\r
- \r
- /**\r
- * active menu item name\r
- * @var string\r
- */\r
- public $menuItemName = 'wcf.acp.menu.link.user.search';\r
- \r
- /**\r
- * @see wcf\page\AbstractPage::$neededPermissions\r
- */\r
- public $neededPermissions = array('admin.user.canSearchUser');\r
- \r
- /**\r
- * username \r
- * @var string\r
- */\r
- public $username = '';\r
- \r
- /**\r
- * email address\r
- * @var string\r
- */\r
- public $email = '';\r
- \r
- /**\r
- * user id\r
- * @var integer\r
- */\r
- public $userID = 0;\r
-\r
- /**\r
- * group ids\r
- * @var array<integer>\r
- */\r
- public $groupIDs = array();\r
- \r
- /**\r
- * true to invert the given group ids\r
- * @var boolean\r
- */\r
- public $invertGroupIDs = 0;\r
- \r
- /**\r
- * language ids\r
- * @var array<integer>\r
- */\r
- public $languageIDs = array();\r
- \r
- /**\r
- * matches\r
- * @var array<integer>\r
- */\r
- public $matches = array();\r
- \r
- /**\r
- * condtion builder object\r
- * @var wcf\system\database\condition\PreparedStatementConditionBuilder\r
- */\r
- public $conditions = null;\r
- \r
- /**\r
- * search id\r
- * @var integer\r
- */\r
- public $searchID = 0;\r
- \r
- /**\r
- * sort field\r
- * @var string\r
- */\r
- public $sortField = 'username';\r
- \r
- /**\r
- * sort order\r
- * @var string\r
- */\r
- public $sortOrder = 'ASC';\r
- \r
- /**\r
- * results per page\r
- * @var integer\r
- */\r
- public $itemsPerPage = 50;\r
- \r
- /**\r
- * shown columns\r
- * @var array<string>\r
- */\r
- public $columns = array('email', 'registrationDate');\r
- \r
- /**\r
- * number of results\r
- * @var integer\r
- */\r
- public $maxResults = 0;\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- parent::readFormParameters();\r
- \r
- if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']);\r
- if (isset($_POST['email'])) $this->email = StringUtil::trim($_POST['email']);\r
- if (isset($_POST['userID'])) $this->userID = intval($_POST['userID']);\r
- if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);\r
- if (isset($_POST['languageIDs']) && is_array($_POST['languageIDs'])) $this->languageIDs = ArrayUtil::toIntegerArray($_POST['languageIDs']);\r
- if (isset($_POST['invertGroupIDs'])) $this->invertGroupIDs = intval($_POST['invertGroupIDs']);\r
- \r
- if (isset($_POST['itemsPerPage'])) $this->itemsPerPage = intval($_POST['itemsPerPage']);\r
- if (isset($_POST['sortField'])) $this->sortField = $_POST['sortField'];\r
- if (isset($_POST['sortOrder'])) $this->sortOrder = $_POST['sortOrder'];\r
- if (isset($_POST['columns']) && is_array($_POST['columns'])) $this->columns = $_POST['columns'];\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- $this->optionTree = $this->getCategoryOptions('profile');\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'username' => $this->username,\r
- 'email' => $this->email,\r
- 'userID' => $this->userID,\r
- 'groupIDs' => $this->groupIDs,\r
- 'languageIDs' => $this->languageIDs,\r
- 'optionTree' => $this->optionTree,\r
- 'availableGroups' => $this->getAvailableGroups(),\r
- 'availableLanguages' => $this->getAvailablelanguages(),\r
- 'invertGroupIDs' => $this->invertGroupIDs,\r
- 'sortField' => $this->sortField,\r
- 'sortOrder' => $this->sortOrder,\r
- 'itemsPerPage' => $this->itemsPerPage,\r
- 'columns' => $this->columns\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::show()\r
- */\r
- public function show() {\r
- // set active menu item\r
- ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);\r
- \r
- // get user options and categories from cache\r
- $this->readCache();\r
- \r
- // show form\r
- parent::show();\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */ \r
- public function save() {\r
- parent::save();\r
- \r
- // store search result in database\r
- $data = serialize(array(\r
- 'matches' => $this->matches,\r
- 'itemsPerPage' => $this->itemsPerPage,\r
- 'columns' => $this->columns\r
- ));\r
- \r
- $search = SearchEditor::create(array(\r
- 'userID' => WCF::getUser()->userID,\r
- 'searchData' => $data,\r
- 'searchTime' => TIME_NOW,\r
- 'searchType' => 'users'\r
- ));\r
- \r
- // get new search id\r
- $this->searchID = $search->searchID;\r
- $this->saved();\r
- \r
- // forward to result page\r
- HeaderUtil::redirect('index.php?page=UserList&searchID='.$this->searchID.'&sortField='.rawurlencode($this->sortField).'&sortOrder='.rawurlencode($this->sortOrder).''.SID_ARG_2ND_NOT_ENCODED);\r
- exit;\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- AbstractForm::validate();\r
- \r
- // do search\r
- $this->search();\r
- \r
- if (count($this->matches) == 0) {\r
- throw new UserInputException('search', 'noMatches');\r
- }\r
- }\r
- \r
- /**\r
- * Search for users which fit to the search values.\r
- */\r
- protected function search() {\r
- $this->matches = array();\r
- $sql = "SELECT user_table.userID\r
- FROM wcf".WCF_N."_user user_table\r
- LEFT JOIN wcf".WCF_N."_user_option_value option_value \r
- ON (option_value.userID = user_table.userID)";\r
- \r
- // build search condition\r
- $this->conditions = new PreparedStatementConditionBuilder(); \r
- \r
- // static fields\r
- $this->buildStaticConditions();\r
- \r
- // dynamic fields\r
- $this->buildDynamicConditions();\r
- \r
- // call buildConditions event\r
- EventHandler::getInstance()->fireAction($this, 'buildConditions');\r
-\r
- // do search\r
- $statement = WCF::getDB()->prepareStatement($sql.$this->conditions, $this->maxResults);\r
- $statement->execute($this->conditions->getParameters());\r
- while ($row = $statement->fetchArray()) {\r
- $this->matches[] = $row['userID']; \r
- }\r
- }\r
- \r
- /**\r
- * Builds the static conditions.\r
- */\r
- protected function buildStaticConditions() {\r
- if (!empty($this->username)) {\r
- $this->conditions->add("user_table.username LIKE ?", array('%'.addcslashes($this->username, '_%').'%'));\r
- }\r
- if (!empty($this->userID)) {\r
- $this->conditions->add("user_table.userID LIKE ?", array('%'.$this->userID.'%'));\r
- }\r
- if (!empty($this->email)) {\r
- $this->conditions->add("user_table.email LIKE ?", array('%'.addcslashes($this->email, '_%').'%'));\r
- }\r
- if (count($this->groupIDs)) {\r
- $this->conditions->add("user_table.userID ".($this->invertGroupIDs == 1 ? 'NOT ' : '')."IN (SELECT userID FROM wcf".WCF_N."_user_to_group WHERE groupID IN (?))", array($this->groupIDs));\r
- }\r
- if (count($this->languageIDs)) {\r
- $this->conditions->add("user_table.languageID IN (?)", array($this->languageIDs));\r
- }\r
- }\r
- \r
- /**\r
- * Builds the dynamic conditions.\r
- */\r
- protected function buildDynamicConditions() {\r
- foreach ($this->options as $option) {\r
- $value = isset($this->values[$option->optionName]) ? $this->values[$option->optionName] : null;\r
- $condition = $this->getTypeObject($option->optionType)->getCondition($option, $value);\r
- if ($condition !== false) $this->conditions->add($condition);\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\SearchableOptionType::getSearchFormElement()\r
- */\r
- protected function getFormElement($type, Option $option) {\r
- return $this->getTypeObject($type)->getSearchFormElement($option);\r
- }\r
- \r
- /**\r
- * @see wcf\acp\form\DynamicOptionListForm::checkOption()\r
- */\r
- protected static function checkOption(Option $option) {\r
- return ($option->searchable == 1 && !$option->disabled && ($option->visible == 3 || $option->visible < 2));\r
- }\r
-}\r
+<?php
+namespace wcf\acp\form;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\option\Option;
+use wcf\data\search\SearchEditor;
+use wcf\form\AbstractForm;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\event\EventHandler;
+use wcf\system\exception\UserInputException;
+use wcf\system\wcf;
+use wcf\util\ArrayUtil;
+use wcf\util\HeaderUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the user search form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.form
+ * @category Community Framework
+ */
+class UserSearchForm extends UserOptionListForm {
+ /**
+ * @see wcf\page\AbstractPage::$templateName
+ */
+ public $templateName = 'userSearch';
+
+ /**
+ * active menu item name
+ * @var string
+ */
+ public $menuItemName = 'wcf.acp.menu.link.user.search';
+
+ /**
+ * @see wcf\page\AbstractPage::$neededPermissions
+ */
+ public $neededPermissions = array('admin.user.canSearchUser');
+
+ /**
+ * username
+ * @var string
+ */
+ public $username = '';
+
+ /**
+ * email address
+ * @var string
+ */
+ public $email = '';
+
+ /**
+ * user id
+ * @var integer
+ */
+ public $userID = 0;
+
+ /**
+ * group ids
+ * @var array<integer>
+ */
+ public $groupIDs = array();
+
+ /**
+ * true to invert the given group ids
+ * @var boolean
+ */
+ public $invertGroupIDs = 0;
+
+ /**
+ * language ids
+ * @var array<integer>
+ */
+ public $languageIDs = array();
+
+ /**
+ * matches
+ * @var array<integer>
+ */
+ public $matches = array();
+
+ /**
+ * condtion builder object
+ * @var wcf\system\database\condition\PreparedStatementConditionBuilder
+ */
+ public $conditions = null;
+
+ /**
+ * search id
+ * @var integer
+ */
+ public $searchID = 0;
+
+ /**
+ * sort field
+ * @var string
+ */
+ public $sortField = 'username';
+
+ /**
+ * sort order
+ * @var string
+ */
+ public $sortOrder = 'ASC';
+
+ /**
+ * results per page
+ * @var integer
+ */
+ public $itemsPerPage = 50;
+
+ /**
+ * shown columns
+ * @var array<string>
+ */
+ public $columns = array('email', 'registrationDate');
+
+ /**
+ * number of results
+ * @var integer
+ */
+ public $maxResults = 0;
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ parent::readFormParameters();
+
+ if (isset($_POST['username'])) $this->username = StringUtil::trim($_POST['username']);
+ if (isset($_POST['email'])) $this->email = StringUtil::trim($_POST['email']);
+ if (isset($_POST['userID'])) $this->userID = intval($_POST['userID']);
+ if (isset($_POST['groupIDs']) && is_array($_POST['groupIDs'])) $this->groupIDs = ArrayUtil::toIntegerArray($_POST['groupIDs']);
+ if (isset($_POST['languageIDs']) && is_array($_POST['languageIDs'])) $this->languageIDs = ArrayUtil::toIntegerArray($_POST['languageIDs']);
+ if (isset($_POST['invertGroupIDs'])) $this->invertGroupIDs = intval($_POST['invertGroupIDs']);
+
+ if (isset($_POST['itemsPerPage'])) $this->itemsPerPage = intval($_POST['itemsPerPage']);
+ if (isset($_POST['sortField'])) $this->sortField = $_POST['sortField'];
+ if (isset($_POST['sortOrder'])) $this->sortOrder = $_POST['sortOrder'];
+ if (isset($_POST['columns']) && is_array($_POST['columns'])) $this->columns = $_POST['columns'];
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ $this->optionTree = $this->getCategoryOptions('profile');
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'username' => $this->username,
+ 'email' => $this->email,
+ 'userID' => $this->userID,
+ 'groupIDs' => $this->groupIDs,
+ 'languageIDs' => $this->languageIDs,
+ 'optionTree' => $this->optionTree,
+ 'availableGroups' => $this->getAvailableGroups(),
+ 'availableLanguages' => $this->getAvailablelanguages(),
+ 'invertGroupIDs' => $this->invertGroupIDs,
+ 'sortField' => $this->sortField,
+ 'sortOrder' => $this->sortOrder,
+ 'itemsPerPage' => $this->itemsPerPage,
+ 'columns' => $this->columns
+ ));
+ }
+
+ /**
+ * @see wcf\form\IForm::show()
+ */
+ public function show() {
+ // set active menu item
+ ACPMenu::getInstance()->setActiveMenuItem($this->menuItemName);
+
+ // get user options and categories from cache
+ $this->readCache();
+
+ // show form
+ parent::show();
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ parent::save();
+
+ // store search result in database
+ $data = serialize(array(
+ 'matches' => $this->matches,
+ 'itemsPerPage' => $this->itemsPerPage,
+ 'columns' => $this->columns
+ ));
+
+ $search = SearchEditor::create(array(
+ 'userID' => WCF::getUser()->userID,
+ 'searchData' => $data,
+ 'searchTime' => TIME_NOW,
+ 'searchType' => 'users'
+ ));
+
+ // get new search id
+ $this->searchID = $search->searchID;
+ $this->saved();
+
+ // forward to result page
+ HeaderUtil::redirect('index.php?page=UserList&searchID='.$this->searchID.'&sortField='.rawurlencode($this->sortField).'&sortOrder='.rawurlencode($this->sortOrder).''.SID_ARG_2ND_NOT_ENCODED);
+ exit;
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ AbstractForm::validate();
+
+ // do search
+ $this->search();
+
+ if (count($this->matches) == 0) {
+ throw new UserInputException('search', 'noMatches');
+ }
+ }
+
+ /**
+ * Search for users which fit to the search values.
+ */
+ protected function search() {
+ $this->matches = array();
+ $sql = "SELECT user_table.userID
+ FROM wcf".WCF_N."_user user_table
+ LEFT JOIN wcf".WCF_N."_user_option_value option_value
+ ON (option_value.userID = user_table.userID)";
+
+ // build search condition
+ $this->conditions = new PreparedStatementConditionBuilder();
+
+ // static fields
+ $this->buildStaticConditions();
+
+ // dynamic fields
+ $this->buildDynamicConditions();
+
+ // call buildConditions event
+ EventHandler::getInstance()->fireAction($this, 'buildConditions');
+
+ // do search
+ $statement = WCF::getDB()->prepareStatement($sql.$this->conditions, $this->maxResults);
+ $statement->execute($this->conditions->getParameters());
+ while ($row = $statement->fetchArray()) {
+ $this->matches[] = $row['userID'];
+ }
+ }
+
+ /**
+ * Builds the static conditions.
+ */
+ protected function buildStaticConditions() {
+ if (!empty($this->username)) {
+ $this->conditions->add("user_table.username LIKE ?", array('%'.addcslashes($this->username, '_%').'%'));
+ }
+ if (!empty($this->userID)) {
+ $this->conditions->add("user_table.userID LIKE ?", array('%'.$this->userID.'%'));
+ }
+ if (!empty($this->email)) {
+ $this->conditions->add("user_table.email LIKE ?", array('%'.addcslashes($this->email, '_%').'%'));
+ }
+ if (count($this->groupIDs)) {
+ $this->conditions->add("user_table.userID ".($this->invertGroupIDs == 1 ? 'NOT ' : '')."IN (SELECT userID FROM wcf".WCF_N."_user_to_group WHERE groupID IN (?))", array($this->groupIDs));
+ }
+ if (count($this->languageIDs)) {
+ $this->conditions->add("user_table.languageID IN (?)", array($this->languageIDs));
+ }
+ }
+
+ /**
+ * Builds the dynamic conditions.
+ */
+ protected function buildDynamicConditions() {
+ foreach ($this->options as $option) {
+ $value = isset($this->values[$option->optionName]) ? $this->values[$option->optionName] : null;
+ $condition = $this->getTypeObject($option->optionType)->getCondition($option, $value);
+ if ($condition !== false) $this->conditions->add($condition);
+ }
+ }
+
+ /**
+ * @see wcf\system\option\SearchableOptionType::getSearchFormElement()
+ */
+ protected function getFormElement($type, Option $option) {
+ return $this->getTypeObject($type)->getSearchFormElement($option);
+ }
+
+ /**
+ * @see wcf\acp\form\DynamicOptionListForm::checkOption()
+ */
+ protected static function checkOption(Option $option) {
+ return ($option->searchable == 1 && !$option->disabled && ($option->visible == 3 || $option->visible < 2));
+ }
+}
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\page\AbstractPage;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-\r
-/**\r
- * Shows the welcome page in admin control panel.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category Community Framework\r
- */\r
-class IndexPage extends AbstractPage {\r
- // system\r
- public $templateName = 'index';\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- $wcfPackageID = WCFACP::getWcfPackageID();\r
- // check package installation queue\r
- if ($wcfPackageID == 0) {\r
- $queueID = PackageInstallationDispatcher::checkPackageInstallationQueue();\r
- \r
- if ($queueID) {\r
- WCF::getTPL()->assign(array(\r
- 'queueID' => $queueID\r
- ));\r
- WCF::getTPL()->display('packageInstallationSetup');\r
- exit;\r
- }\r
- }\r
- \r
- /*\r
- if (WCFACP::getWcfPackageID() == PACKAGE_ID) {\r
- $packages = CacheHandler::getInstance()->get('packages');\r
- foreach ($packages as $packageID => $package) {\r
- break;\r
- }\r
- \r
- if (isset($packageID) && $packageID != PACKAGE_ID) {\r
- HeaderUtil::redirect('../'.$packages[$packageID]['packageDir'].'acp/index.php'.SID_ARG_1ST, false);\r
- exit;\r
- }\r
- }\r
- */\r
- \r
- // show page\r
- parent::show();\r
- }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\page\AbstractPage;
+use wcf\system\cache\CacheHandler;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+
+/**
+ * Shows the welcome page in admin control panel.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.page
+ * @category Community Framework
+ */
+class IndexPage extends AbstractPage {
+ // system
+ public $templateName = 'index';
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ $wcfPackageID = WCFACP::getWcfPackageID();
+ // check package installation queue
+ if ($wcfPackageID == 0) {
+ $queueID = PackageInstallationDispatcher::checkPackageInstallationQueue();
+
+ if ($queueID) {
+ WCF::getTPL()->assign(array(
+ 'queueID' => $queueID
+ ));
+ WCF::getTPL()->display('packageInstallationSetup');
+ exit;
+ }
+ }
+
+ /*
+ if (WCFACP::getWcfPackageID() == PACKAGE_ID) {
+ $packages = CacheHandler::getInstance()->get('packages');
+ foreach ($packages as $packageID => $package) {
+ break;
+ }
+
+ if (isset($packageID) && $packageID != PACKAGE_ID) {
+ HeaderUtil::redirect('../'.$packages[$packageID]['packageDir'].'acp/index.php'.SID_ARG_1ST, false);
+ exit;
+ }
+ }
+ */
+
+ // show page
+ parent::show();
+ }
+}
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\package\PackageList;\r
-use wcf\page\SortablePage;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows a list of all installed packages.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category Community Framework\r
- */\r
-class PackageListPage extends SortablePage {\r
- // system\r
- public $templateName = 'packageList';\r
- public $neededPermissions = array('admin.system.package.canUpdatePackage', 'admin.system.package.canUninstallPackage');\r
- public $itemsPerPage = 50;\r
- public $defaultSortField = 'packageType';\r
- public $defaultSortOrder = 'DESC';\r
- \r
- /**\r
- * list of packages\r
- * \r
- * @var PackageList\r
- */\r
- public $packageList = null;\r
- \r
- /**\r
- * class name for DatabaseObjectList\r
- * \r
- * @var string\r
- */ \r
- public $objectListClassName = 'wcf\data\package\PackageList';\r
- \r
- /**\r
- * @see wcf\page\MuletipleLinkPage::readObjects()\r
- */ \r
- protected function readObjects() {\r
- $this->sqlOrderBy = 'package.'.($this->sortField == 'packageType' ? 'standalone '.$this->sortOrder.', package.parentPackageID '.$this->sortOrder : $this->sortField.' '.$this->sortOrder).($this->sortField != 'packageName' ? ', package.packageName ASC' : '');\r
- \r
- parent::readObjects();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign('packages', $this->objectList->getObjects());\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- // enable menu item\r
- ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package.view');\r
- \r
- parent::show();\r
- }\r
- \r
- /**\r
- * @see wcf\page\SortablePage::validateSortField()\r
- */\r
- public function validateSortField() {\r
- parent::validateSortField();\r
- \r
- switch ($this->sortField) {\r
- case 'packageID':\r
- case 'package':\r
- case 'packageDir':\r
- case 'packageName':\r
- case 'instanceNo':\r
- case 'packageDescription':\r
- case 'packageVersion':\r
- case 'packageDate':\r
- case 'packageURL':\r
- case 'parentPackageID':\r
- case 'isUnique':\r
- case 'standalone':\r
- case 'author':\r
- case 'authorURL':\r
- case 'installDate':\r
- case 'updateDate': break;\r
- default: $this->sortField = $this->defaultSortField;\r
- }\r
- }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\package\PackageList;
+use wcf\page\SortablePage;
+use wcf\system\WCF;
+
+/**
+ * Shows a list of all installed packages.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.page
+ * @category Community Framework
+ */
+class PackageListPage extends SortablePage {
+ // system
+ public $templateName = 'packageList';
+ public $neededPermissions = array('admin.system.package.canUpdatePackage', 'admin.system.package.canUninstallPackage');
+ public $itemsPerPage = 50;
+ public $defaultSortField = 'packageType';
+ public $defaultSortOrder = 'DESC';
+
+ /**
+ * list of packages
+ *
+ * @var PackageList
+ */
+ public $packageList = null;
+
+ /**
+ * class name for DatabaseObjectList
+ *
+ * @var string
+ */
+ public $objectListClassName = 'wcf\data\package\PackageList';
+
+ /**
+ * @see wcf\page\MuletipleLinkPage::readObjects()
+ */
+ protected function readObjects() {
+ $this->sqlOrderBy = 'package.'.($this->sortField == 'packageType' ? 'standalone '.$this->sortOrder.', package.parentPackageID '.$this->sortOrder : $this->sortField.' '.$this->sortOrder).($this->sortField != 'packageName' ? ', package.packageName ASC' : '');
+
+ parent::readObjects();
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign('packages', $this->objectList->getObjects());
+ }
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ // enable menu item
+ ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package.view');
+
+ parent::show();
+ }
+
+ /**
+ * @see wcf\page\SortablePage::validateSortField()
+ */
+ public function validateSortField() {
+ parent::validateSortField();
+
+ switch ($this->sortField) {
+ case 'packageID':
+ case 'package':
+ case 'packageDir':
+ case 'packageName':
+ case 'instanceNo':
+ case 'packageDescription':
+ case 'packageVersion':
+ case 'packageDate':
+ case 'packageURL':
+ case 'parentPackageID':
+ case 'isUnique':
+ case 'standalone':
+ case 'author':
+ case 'authorURL':
+ case 'installDate':
+ case 'updateDate': break;
+ default: $this->sortField = $this->defaultSortField;
+ }
+ }
+}
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\data\package\installation\queue\PackageInstallationQueue;\r
-use wcf\page\AbstractPage;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\system\package\PackageUninstallationDispatcher;\r
-use wcf\system\WCF;\r
-use wcf\system\WCFACP;\r
-\r
-/**\r
- * Handles all request on the package.php script\r
- * and executes the requested action.\r
- * TODO: split this page into separate pages / actions\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category Community Framework\r
- */\r
-class PackagePage extends AbstractPage {\r
- const DO_NOT_LOG = true;\r
- public $parentQueueID = 0;\r
- public $processNo = 0;\r
- public $queueID = 0;\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_REQUEST['parentQueueID'])) $this->parentQueueID = intval($_REQUEST['parentQueueID']);\r
- if (isset($_REQUEST['processNo'])) $this->processNo = intval($_REQUEST['processNo']);\r
- if (isset($_REQUEST['queueID'])) $this->queueID = intval($_REQUEST['queueID']);\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- parent::show();\r
-\r
- // check master password\r
- WCFACP::checkMasterPassword();\r
- \r
- switch ($this->action) {\r
- case 'install':\r
- case 'update':\r
- if ($this->action == 'install') WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));\r
- else WCF::getSession()->checkPermission(array('admin.system.package.canUpdatePackage'));\r
- \r
- $queue = new PackageInstallationQueue($this->queueID);\r
- $dispatcher = new PackageInstallationDispatcher($queue);\r
- $dispatcher->beginInstallation();\r
- break;\r
- \r
- case 'rollback':\r
- die('ROLLBACK');\r
- WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));\r
- require_once(WCF_DIR.'lib/acp/package/PackageInstallationRollback.class.php');\r
- new PackageInstallationRollback($this->queueID);\r
- break;\r
- \r
- case 'openQueue':\r
- PackageInstallationDispatcher::openQueue($this->parentQueueID, $this->processNo);\r
- break;\r
- \r
- case 'startUninstall':\r
- WCF::getSession()->checkPermission(array('admin.system.package.canUninstallPackage'));\r
- PackageUninstallationDispatcher::checkDependencies();\r
- break;\r
- }\r
- }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\data\package\installation\queue\PackageInstallationQueue;
+use wcf\page\AbstractPage;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\system\package\PackageUninstallationDispatcher;
+use wcf\system\WCF;
+use wcf\system\WCFACP;
+
+/**
+ * Handles all request on the package.php script
+ * and executes the requested action.
+ * TODO: split this page into separate pages / actions
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.page
+ * @category Community Framework
+ */
+class PackagePage extends AbstractPage {
+ const DO_NOT_LOG = true;
+ public $parentQueueID = 0;
+ public $processNo = 0;
+ public $queueID = 0;
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_REQUEST['parentQueueID'])) $this->parentQueueID = intval($_REQUEST['parentQueueID']);
+ if (isset($_REQUEST['processNo'])) $this->processNo = intval($_REQUEST['processNo']);
+ if (isset($_REQUEST['queueID'])) $this->queueID = intval($_REQUEST['queueID']);
+ }
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ parent::show();
+
+ // check master password
+ WCFACP::checkMasterPassword();
+
+ switch ($this->action) {
+ case 'install':
+ case 'update':
+ if ($this->action == 'install') WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));
+ else WCF::getSession()->checkPermission(array('admin.system.package.canUpdatePackage'));
+
+ $queue = new PackageInstallationQueue($this->queueID);
+ $dispatcher = new PackageInstallationDispatcher($queue);
+ $dispatcher->beginInstallation();
+ break;
+
+ case 'rollback':
+ die('ROLLBACK');
+ WCF::getSession()->checkPermission(array('admin.system.package.canInstallPackage'));
+ require_once(WCF_DIR.'lib/acp/package/PackageInstallationRollback.class.php');
+ new PackageInstallationRollback($this->queueID);
+ break;
+
+ case 'openQueue':
+ PackageInstallationDispatcher::openQueue($this->parentQueueID, $this->processNo);
+ break;
+
+ case 'startUninstall':
+ WCF::getSession()->checkPermission(array('admin.system.package.canUninstallPackage'));
+ PackageUninstallationDispatcher::checkDependencies();
+ break;
+ }
+ }
+}
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\package\Package;\r
-use wcf\page\AbstractPage;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows all information about an installed package.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category Community Framework\r
- */\r
-class PackageViewPage extends AbstractPage {\r
- public $package;\r
- public $packageID = 0;\r
- public $templateName = 'packageView';\r
- public $neededPermissions = array('admin.system.package.canUpdatePackage', 'admin.system.package.canUninstallPackage');\r
- public $requiredPackages = array();\r
- public $dependentPackages = array();\r
- public $dependencies = array();\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_REQUEST['activePackageID'])) $this->packageID = intval($_REQUEST['activePackageID']);\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- // get package data\r
- try {\r
- $this->package = new Package($this->packageID);\r
- $this->requiredPackages = $this->package->getRequiredPackages();\r
- $this->dependentPackages = $this->package->getDependentPackages();\r
- $this->dependencies = $this->package->getDependencies();\r
- }\r
- catch (SystemException $e) {\r
- throw new IllegalLinkException();\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'requiredPackages' => $this->requiredPackages,\r
- 'dependentPackages' => $this->dependentPackages,\r
- 'dependencies' => $this->dependencies,\r
- 'package' => $this->package\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- // enable menu item\r
- ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package');\r
- \r
- parent::show();\r
- }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\package\Package;
+use wcf\page\AbstractPage;
+use wcf\system\WCF;
+
+/**
+ * Shows all information about an installed package.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.page
+ * @category Community Framework
+ */
+class PackageViewPage extends AbstractPage {
+ public $package;
+ public $packageID = 0;
+ public $templateName = 'packageView';
+ public $neededPermissions = array('admin.system.package.canUpdatePackage', 'admin.system.package.canUninstallPackage');
+ public $requiredPackages = array();
+ public $dependentPackages = array();
+ public $dependencies = array();
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_REQUEST['activePackageID'])) $this->packageID = intval($_REQUEST['activePackageID']);
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ // get package data
+ try {
+ $this->package = new Package($this->packageID);
+ $this->requiredPackages = $this->package->getRequiredPackages();
+ $this->dependentPackages = $this->package->getDependentPackages();
+ $this->dependencies = $this->package->getDependencies();
+ }
+ catch (SystemException $e) {
+ throw new IllegalLinkException();
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'requiredPackages' => $this->requiredPackages,
+ 'dependentPackages' => $this->dependentPackages,
+ 'dependencies' => $this->dependencies,
+ 'package' => $this->package
+ ));
+ }
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ // enable menu item
+ ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package');
+
+ parent::show();
+ }
+}
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\page\SortablePage;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Shows information about available update package servers.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category Community Framework\r
- */\r
-class UpdateServerListPage extends SortablePage {\r
- // system\r
- public $templateName = 'updateServerList';\r
- public $neededPermissions = array('admin.system.package.canEditServer');\r
- public $defaultSortField = 'serverURL';\r
- public $deletedPackageUpdateServerID = 0;\r
- \r
- /**\r
- * @see wcf\page\MultipleLinkPage::$objectListClassName\r
- */ \r
- public $objectListClassName = 'wcf\data\package\update\server\PackageUpdateServerList';\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_REQUEST['deletedPackageUpdateServerID'])) $this->deletedPackageUpdateServerID = intval($_REQUEST['deletedPackageUpdateServerID']);\r
- }\r
- \r
- /**\r
- * @see wcf\page\MultipleLinkPage::readObjects()\r
- */ \r
- public function readObjects() {\r
- $this->sqlOrderBy = ($this->sortField != 'packages' ? 'package_update_server.' : '') . $this->sortField.' '.$this->sortOrder;\r
- \r
- parent::readObjects();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'updateServers' => $this->objectList->getObjects(),\r
- 'deletedPackageUpdateServerID' => $this->deletedPackageUpdateServerID\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- // enable menu item\r
- ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package.server.view');\r
- \r
- parent::show();\r
- }\r
- \r
- /**\r
- * @see wcf\page\SortablePage::validateSortField()\r
- */\r
- public function validateSortField() {\r
- parent::validateSortField();\r
- \r
- switch ($this->sortField) {\r
- case 'packageUpdateServerID':\r
- case 'serverURL':\r
- case 'status':\r
- case 'errorMessage':\r
- case 'lastUpdateTime':\r
- case 'packages': break;\r
- default: $this->sortField = $this->defaultSortField;\r
- }\r
- }\r
+<?php
+namespace wcf\acp\page;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\page\SortablePage;
+use wcf\system\WCF;
+
+/**
+ * Shows information about available update package servers.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.page
+ * @category Community Framework
+ */
+class UpdateServerListPage extends SortablePage {
+ // system
+ public $templateName = 'updateServerList';
+ public $neededPermissions = array('admin.system.package.canEditServer');
+ public $defaultSortField = 'serverURL';
+ public $deletedPackageUpdateServerID = 0;
+
+ /**
+ * @see wcf\page\MultipleLinkPage::$objectListClassName
+ */
+ public $objectListClassName = 'wcf\data\package\update\server\PackageUpdateServerList';
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_REQUEST['deletedPackageUpdateServerID'])) $this->deletedPackageUpdateServerID = intval($_REQUEST['deletedPackageUpdateServerID']);
+ }
+
+ /**
+ * @see wcf\page\MultipleLinkPage::readObjects()
+ */
+ public function readObjects() {
+ $this->sqlOrderBy = ($this->sortField != 'packages' ? 'package_update_server.' : '') . $this->sortField.' '.$this->sortOrder;
+
+ parent::readObjects();
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'updateServers' => $this->objectList->getObjects(),
+ 'deletedPackageUpdateServerID' => $this->deletedPackageUpdateServerID
+ ));
+ }
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ // enable menu item
+ ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.package.server.view');
+
+ parent::show();
+ }
+
+ /**
+ * @see wcf\page\SortablePage::validateSortField()
+ */
+ public function validateSortField() {
+ parent::validateSortField();
+
+ switch ($this->sortField) {
+ case 'packageUpdateServerID':
+ case 'serverURL':
+ case 'status':
+ case 'errorMessage':
+ case 'lastUpdateTime':
+ case 'packages': break;
+ default: $this->sortField = $this->defaultSortField;
+ }
+ }
}
-<?php\r
-namespace wcf\acp\page;\r
-use wcf\system\menu\acp\ACPMenu;\r
-use wcf\data\user\User;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\page\SortablePage;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Shows the result of a user search.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage acp.page\r
- * @category Community Framework\r
- */\r
-class UserListPage extends SortablePage {\r
- // system\r
- public $itemsPerPage = 50;\r
- public $defaultSortField = 'username';\r
- public $templateName = 'userList';\r
- public $neededPermissions = array('admin.user.canSearchUser');\r
- \r
- // parameters\r
- public $searchID = 0;\r
- \r
- // data\r
- public $userIDs = array();\r
- public $markedUsers = array();\r
- public $users = array();\r
- public $url = '';\r
- public $columns = array('email', 'registrationDate');\r
- public $outputObjects = array();\r
- public $options = array();\r
- public $columnValues = array();\r
- public $columnHeads = array();\r
- public $sqlConditions = '';\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- $this->conditions = new PreparedStatementConditionBuilder();\r
- \r
- if (!empty($_REQUEST['searchID'])) {\r
- $this->searchID = intval($_REQUEST['searchID']);\r
- if ($this->searchID) $this->readSearchResult();\r
- if (!count($this->userIDs)) {\r
- throw new IllegalLinkException();\r
- }\r
- $this->conditions->add("user_table.userID IN (?)", array($this->userIDs));\r
- }\r
- \r
- // get user options\r
- $this->readUserOptions();\r
- }\r
- \r
- /**\r
- * @see wcf\page\SortablePage::validateSortField()\r
- */\r
- public function validateSortField() {\r
- parent::validateSortField();\r
- \r
- switch ($this->sortField) {\r
- case 'email':\r
- case 'userID':\r
- case 'registrationDate':\r
- case 'username': break;\r
- default: \r
- if (!isset($this->options[$this->sortField])) {\r
- $this->sortField = $this->defaultSortField;\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- // get marked users\r
- $this->markedUsers = WCF::getSession()->getVar('markedUsers');\r
- if ($this->markedUsers == null || !is_array($this->markedUsers)) $this->markedUsers = array();\r
- \r
- // get columns heads\r
- $this->readColumnsHeads();\r
- \r
- // get users\r
- $this->readUsers();\r
- \r
- // build page url\r
- $this->url = 'index.php?page=UserList&searchID='.$this->searchID.'&action='.rawurlencode($this->action).'&pageNo='.$this->pageNo.'&sortField='.$this->sortField.'&sortOrder='.$this->sortOrder.''.SID_ARG_2ND_NOT_ENCODED;\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- WCF::getTPL()->assign(array(\r
- 'users' => $this->users,\r
- 'searchID' => $this->searchID,\r
- 'markedUsers' => count($this->markedUsers),\r
- 'url' => $this->url,\r
- 'columnHeads' => $this->columnHeads,\r
- 'columnValues' => $this->columnValues\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- // set active menu item\r
- ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.user.'.($this->searchID ? 'search' : 'list'));\r
- \r
- parent::show();\r
- }\r
- \r
- /**\r
- * @see wcf\page\MultipleLinkPage::countItems()\r
- */\r
- public function countItems() {\r
- // call countItems event\r
- EventHandler::getInstance()->fireAction($this, 'countItems');\r
-\r
- $sql = "SELECT COUNT(*) AS count\r
- FROM wcf".WCF_N."_user user_table\r
- ".$this->conditions;\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($this->conditions->getParameters());\r
- $row = $statement->fetchArray();\r
- return $row['count'];\r
- }\r
- \r
- /**\r
- * Gets the list of results.\r
- */\r
- protected function readUsers() {\r
- // get user ids\r
- $userIDs = array();\r
- $sql = "SELECT user_table.userID\r
- FROM wcf".WCF_N."_user user_table\r
- ".(isset($this->options[$this->sortField]) ? "LEFT JOIN wcf".WCF_N."_user_option_value user_option_value ON (user_option_value.userID = user.userID)" : '')."\r
- ".$this->conditions."\r
- ORDER BY ".(($this->sortField != 'email' && isset($this->options[$this->sortField])) ? 'user_option_value.userOption'.$this->options[$this->sortField]['optionID'] : $this->sortField)." ".$this->sortOrder;\r
- $statement = WCF::getDB()->prepareStatement($sql, $this->itemsPerPage, ($this->pageNo - 1) * $this->itemsPerPage);\r
- $statement->execute($this->conditions->getParameters());\r
- while ($row = $statement->fetchArray()) {\r
- $userIDs[] = $row['userID'];\r
- }\r
- \r
- // get user data\r
- if (count($userIDs)) {\r
- $userToGroups = array();\r
- \r
- // get group ids\r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("user_table.userID IN (?)", array($userIDs));\r
- \r
- $sql = "SELECT userID, groupID\r
- FROM wcf".WCF_N."_user_to_group user_table\r
- ".$conditions;\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- while ($row = $statement->fetchArray()) {\r
- $userToGroups[$row['userID']][] = $row['groupID'];\r
- }\r
- \r
- $sql = "SELECT option_value.*, user_table.*\r
- FROM wcf".WCF_N."_user user_table\r
- LEFT JOIN wcf".WCF_N."_user_option_value option_value\r
- ON (option_value.userID = user_table.userID)\r
- ".$conditions."\r
- ORDER BY ".(($this->sortField != 'email' && isset($this->options[$this->sortField])) ? 'option_value.userOption'.$this->options[$this->sortField]['optionID'] : 'user_table.'.$this->sortField)." ".$this->sortOrder;\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- while ($row = $statement->fetchArray()) {\r
- $row['groupIDs'] = implode(',', $userToGroups[$row['userID']]);\r
- $accessible = UserGroup::isAccessibleGroup($userToGroups[$row['userID']]);\r
- $row['accessible'] = $accessible;\r
- $row['deletable'] = ($accessible && WCF::getSession()->getPermission('admin.user.canDeleteUser') && $row['userID'] != WCF::getUser()->userID) ? 1 : 0;\r
- $row['editable'] = ($accessible && WCF::getSession()->getPermission('admin.user.canEditUser')) ? 1 : 0;\r
- $row['isMarked'] = intval(in_array($row['userID'], $this->markedUsers));\r
- \r
- $this->users[] = new User(null, $row);\r
- }\r
- \r
- // get special columns\r
- foreach ($this->users as $key => $user) {\r
- foreach ($this->columns as $column) {\r
- if (isset($this->options[$column])) {\r
- if ($this->options[$column]['outputClass']) {\r
- $outputObj = $this->getOutputObject($this->options[$column]['outputClass']);\r
- $this->columnValues[$user->userID][$column] = $outputObj->getOutput($user, $this->options[$column], $user->{$column});\r
- }\r
- else {\r
- $this->columnValues[$user->userID][$column] = StringUtil::encodeHTML($user->{$column});\r
- }\r
- }\r
- else {\r
- switch ($column) {\r
- case 'email':\r
- $this->columnValues[$user->userID][$column] = '<a href="mailto:'.StringUtil::encodeHTML($user->email).'">'.StringUtil::encodeHTML($user->email).'</a>';\r
- break;\r
- case 'registrationDate':\r
- $this->columnValues[$user->userID][$column] = DateUtil::format(DateUtil::getDateTimeByTimestamp($user->{$column}), DateUtil::DATE_FORMAT);\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Gets the result of the search with the given search id.\r
- */\r
- protected function readSearchResult() {\r
- // get user search from database\r
- $sql = "SELECT searchData\r
- FROM wcf".WCF_N."_search\r
- WHERE searchID = ?\r
- AND userID = ?\r
- AND searchType = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array(\r
- $this->searchID,\r
- WCF::getUser()->userID,\r
- 'users'\r
- ));\r
- $search = $statement->fetchArray();\r
- if (!isset($search['searchData'])) {\r
- throw new IllegalLinkException();\r
- }\r
- \r
- $data = unserialize($search['searchData']);\r
- $this->userIDs = $data['matches'];\r
- $this->itemsPerPage = $data['itemsPerPage'];\r
- $this->columns = $data['columns'];\r
- unset($data);\r
- }\r
- \r
- /**\r
- * Gets the user options from cache.\r
- */\r
- protected function readUserOptions() {\r
- // add cache resource\r
- $cacheName = 'user-option-'.PACKAGE_ID;\r
- CacheHandler::getInstance()->addResource($cacheName, WCF_DIR.'cache/cache.'.$cacheName.'.php', 'wcf\system\cache\builder\CacheBuilderOption');\r
- \r
- // get options\r
- $this->options = CacheHandler::getInstance()->get($cacheName, 'options');\r
- }\r
- \r
- /**\r
- * Reads the column heads.\r
- */\r
- protected function readColumnsHeads() {\r
- foreach ($this->columns as $column) {\r
- if (isset($this->options[$column])) {\r
- $this->columnHeads[$column] = 'wcf.user.option.'.$column;\r
- }\r
- else {\r
- $this->columnHeads[$column] = 'wcf.user.'.$column;\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Returns an object of the requested option output type.\r
- * \r
- * @param string $type\r
- * @return UserOptionOutput\r
- */\r
- protected function getOutputObject($className) {\r
- if (!isset($this->outputObjects[$className])) {\r
- // include class file\r
- $classPath = WCF_DIR.'lib/data/user/option/'.$className.'.class.php';\r
- if (!file_exists($classPath)) {\r
- throw new SystemException("unable to find class file '".$classPath."'", 11000);\r
- }\r
- require_once($classPath);\r
- \r
- // create instance\r
- if (!class_exists($className)) {\r
- throw new SystemException("unable to find class '".$className."'", 11001);\r
- }\r
- $this->outputObjects[$className] = new $className();\r
- }\r
- \r
- return $this->outputObjects[$className];\r
- }\r
-\r
- /**\r
- * @see wcf\page\MultipleLinkPage::initObjectList()\r
- */ \r
- protected function initObjectList() { }\r
- \r
- /**\r
- * @see wcf\page\MultipleLinkPage::readObjects()\r
- */ \r
- protected function readObjects() { }\r
-}\r
+<?php
+namespace wcf\acp\page;
+use wcf\system\menu\acp\ACPMenu;
+use wcf\data\user\User;
+use wcf\data\user\group\UserGroup;
+use wcf\page\SortablePage;
+use wcf\system\cache\CacheHandler;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\event\EventHandler;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Shows the result of a user search.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage acp.page
+ * @category Community Framework
+ */
+class UserListPage extends SortablePage {
+ // system
+ public $itemsPerPage = 50;
+ public $defaultSortField = 'username';
+ public $templateName = 'userList';
+ public $neededPermissions = array('admin.user.canSearchUser');
+
+ // parameters
+ public $searchID = 0;
+
+ // data
+ public $userIDs = array();
+ public $markedUsers = array();
+ public $users = array();
+ public $url = '';
+ public $columns = array('email', 'registrationDate');
+ public $outputObjects = array();
+ public $options = array();
+ public $columnValues = array();
+ public $columnHeads = array();
+ public $sqlConditions = '';
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ $this->conditions = new PreparedStatementConditionBuilder();
+
+ if (!empty($_REQUEST['searchID'])) {
+ $this->searchID = intval($_REQUEST['searchID']);
+ if ($this->searchID) $this->readSearchResult();
+ if (!count($this->userIDs)) {
+ throw new IllegalLinkException();
+ }
+ $this->conditions->add("user_table.userID IN (?)", array($this->userIDs));
+ }
+
+ // get user options
+ $this->readUserOptions();
+ }
+
+ /**
+ * @see wcf\page\SortablePage::validateSortField()
+ */
+ public function validateSortField() {
+ parent::validateSortField();
+
+ switch ($this->sortField) {
+ case 'email':
+ case 'userID':
+ case 'registrationDate':
+ case 'username': break;
+ default:
+ if (!isset($this->options[$this->sortField])) {
+ $this->sortField = $this->defaultSortField;
+ }
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ // get marked users
+ $this->markedUsers = WCF::getSession()->getVar('markedUsers');
+ if ($this->markedUsers == null || !is_array($this->markedUsers)) $this->markedUsers = array();
+
+ // get columns heads
+ $this->readColumnsHeads();
+
+ // get users
+ $this->readUsers();
+
+ // build page url
+ $this->url = 'index.php?page=UserList&searchID='.$this->searchID.'&action='.rawurlencode($this->action).'&pageNo='.$this->pageNo.'&sortField='.$this->sortField.'&sortOrder='.$this->sortOrder.''.SID_ARG_2ND_NOT_ENCODED;
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ WCF::getTPL()->assign(array(
+ 'users' => $this->users,
+ 'searchID' => $this->searchID,
+ 'markedUsers' => count($this->markedUsers),
+ 'url' => $this->url,
+ 'columnHeads' => $this->columnHeads,
+ 'columnValues' => $this->columnValues
+ ));
+ }
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ // set active menu item
+ ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.user.'.($this->searchID ? 'search' : 'list'));
+
+ parent::show();
+ }
+
+ /**
+ * @see wcf\page\MultipleLinkPage::countItems()
+ */
+ public function countItems() {
+ // call countItems event
+ EventHandler::getInstance()->fireAction($this, 'countItems');
+
+ $sql = "SELECT COUNT(*) AS count
+ FROM wcf".WCF_N."_user user_table
+ ".$this->conditions;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($this->conditions->getParameters());
+ $row = $statement->fetchArray();
+ return $row['count'];
+ }
+
+ /**
+ * Gets the list of results.
+ */
+ protected function readUsers() {
+ // get user ids
+ $userIDs = array();
+ $sql = "SELECT user_table.userID
+ FROM wcf".WCF_N."_user user_table
+ ".(isset($this->options[$this->sortField]) ? "LEFT JOIN wcf".WCF_N."_user_option_value user_option_value ON (user_option_value.userID = user.userID)" : '')."
+ ".$this->conditions."
+ ORDER BY ".(($this->sortField != 'email' && isset($this->options[$this->sortField])) ? 'user_option_value.userOption'.$this->options[$this->sortField]['optionID'] : $this->sortField)." ".$this->sortOrder;
+ $statement = WCF::getDB()->prepareStatement($sql, $this->itemsPerPage, ($this->pageNo - 1) * $this->itemsPerPage);
+ $statement->execute($this->conditions->getParameters());
+ while ($row = $statement->fetchArray()) {
+ $userIDs[] = $row['userID'];
+ }
+
+ // get user data
+ if (count($userIDs)) {
+ $userToGroups = array();
+
+ // get group ids
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("user_table.userID IN (?)", array($userIDs));
+
+ $sql = "SELECT userID, groupID
+ FROM wcf".WCF_N."_user_to_group user_table
+ ".$conditions;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+ while ($row = $statement->fetchArray()) {
+ $userToGroups[$row['userID']][] = $row['groupID'];
+ }
+
+ $sql = "SELECT option_value.*, user_table.*
+ FROM wcf".WCF_N."_user user_table
+ LEFT JOIN wcf".WCF_N."_user_option_value option_value
+ ON (option_value.userID = user_table.userID)
+ ".$conditions."
+ ORDER BY ".(($this->sortField != 'email' && isset($this->options[$this->sortField])) ? 'option_value.userOption'.$this->options[$this->sortField]['optionID'] : 'user_table.'.$this->sortField)." ".$this->sortOrder;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+ while ($row = $statement->fetchArray()) {
+ $row['groupIDs'] = implode(',', $userToGroups[$row['userID']]);
+ $accessible = UserGroup::isAccessibleGroup($userToGroups[$row['userID']]);
+ $row['accessible'] = $accessible;
+ $row['deletable'] = ($accessible && WCF::getSession()->getPermission('admin.user.canDeleteUser') && $row['userID'] != WCF::getUser()->userID) ? 1 : 0;
+ $row['editable'] = ($accessible && WCF::getSession()->getPermission('admin.user.canEditUser')) ? 1 : 0;
+ $row['isMarked'] = intval(in_array($row['userID'], $this->markedUsers));
+
+ $this->users[] = new User(null, $row);
+ }
+
+ // get special columns
+ foreach ($this->users as $key => $user) {
+ foreach ($this->columns as $column) {
+ if (isset($this->options[$column])) {
+ if ($this->options[$column]['outputClass']) {
+ $outputObj = $this->getOutputObject($this->options[$column]['outputClass']);
+ $this->columnValues[$user->userID][$column] = $outputObj->getOutput($user, $this->options[$column], $user->{$column});
+ }
+ else {
+ $this->columnValues[$user->userID][$column] = StringUtil::encodeHTML($user->{$column});
+ }
+ }
+ else {
+ switch ($column) {
+ case 'email':
+ $this->columnValues[$user->userID][$column] = '<a href="mailto:'.StringUtil::encodeHTML($user->email).'">'.StringUtil::encodeHTML($user->email).'</a>';
+ break;
+ case 'registrationDate':
+ $this->columnValues[$user->userID][$column] = DateUtil::format(DateUtil::getDateTimeByTimestamp($user->{$column}), DateUtil::DATE_FORMAT);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets the result of the search with the given search id.
+ */
+ protected function readSearchResult() {
+ // get user search from database
+ $sql = "SELECT searchData
+ FROM wcf".WCF_N."_search
+ WHERE searchID = ?
+ AND userID = ?
+ AND searchType = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array(
+ $this->searchID,
+ WCF::getUser()->userID,
+ 'users'
+ ));
+ $search = $statement->fetchArray();
+ if (!isset($search['searchData'])) {
+ throw new IllegalLinkException();
+ }
+
+ $data = unserialize($search['searchData']);
+ $this->userIDs = $data['matches'];
+ $this->itemsPerPage = $data['itemsPerPage'];
+ $this->columns = $data['columns'];
+ unset($data);
+ }
+
+ /**
+ * Gets the user options from cache.
+ */
+ protected function readUserOptions() {
+ // add cache resource
+ $cacheName = 'user-option-'.PACKAGE_ID;
+ CacheHandler::getInstance()->addResource($cacheName, WCF_DIR.'cache/cache.'.$cacheName.'.php', 'wcf\system\cache\builder\CacheBuilderOption');
+
+ // get options
+ $this->options = CacheHandler::getInstance()->get($cacheName, 'options');
+ }
+
+ /**
+ * Reads the column heads.
+ */
+ protected function readColumnsHeads() {
+ foreach ($this->columns as $column) {
+ if (isset($this->options[$column])) {
+ $this->columnHeads[$column] = 'wcf.user.option.'.$column;
+ }
+ else {
+ $this->columnHeads[$column] = 'wcf.user.'.$column;
+ }
+ }
+ }
+
+ /**
+ * Returns an object of the requested option output type.
+ *
+ * @param string $type
+ * @return UserOptionOutput
+ */
+ protected function getOutputObject($className) {
+ if (!isset($this->outputObjects[$className])) {
+ // include class file
+ $classPath = WCF_DIR.'lib/data/user/option/'.$className.'.class.php';
+ if (!file_exists($classPath)) {
+ throw new SystemException("unable to find class file '".$classPath."'", 11000);
+ }
+ require_once($classPath);
+
+ // create instance
+ if (!class_exists($className)) {
+ throw new SystemException("unable to find class '".$className."'", 11001);
+ }
+ $this->outputObjects[$className] = new $className();
+ }
+
+ return $this->outputObjects[$className];
+ }
+
+ /**
+ * @see wcf\page\MultipleLinkPage::initObjectList()
+ */
+ protected function initObjectList() { }
+
+ /**
+ * @see wcf\page\MultipleLinkPage::readObjects()
+ */
+ protected function readObjects() { }
+}
<?php
-namespace wcf\action;\r
-use wcf\system\exception\AJAXException;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\ClassUtil;\r
-use wcf\util\JSON;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Default implementation for object-actions using the AJAX-API.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage action\r
- * @category Community Framework\r
- */\r
-class AJAXProxyAction extends AbstractSecureAction {\r
- /**\r
- * class name\r
- * @var string\r
- */\r
- protected $className = '';\r
- \r
- /**\r
- * action name\r
- * @var string\r
- */\r
- protected $actionName = '';\r
- \r
- /**\r
- * list of object ids\r
- * @var array<integer>\r
- */\r
- protected $objectIDs = array();\r
- \r
- /**\r
- * additional parameters\r
- * @var array<mixed>\r
- */\r
- protected $parameters = array();\r
- \r
- /**\r
- * object action\r
- * @var wcf\data\IDatabaseObjectAction\r
- */\r
- protected $objectAction = null;\r
- \r
- /**\r
- * results of the executed action\r
- * @var mixed\r
- */\r
- protected $response = null;\r
- \r
- /**\r
- * @see AbstractAction::_construct()\r
- */\r
- public function __construct() {\r
- try {\r
- parent::__construct();\r
- }\r
- catch (\Exception $e) {\r
- if ($e instanceof AJAXException) {\r
- throw $e;\r
- }\r
- else {\r
- throw new AJAXException($e->getMessage());\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see Action::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_POST['className'])) {\r
- $this->className = StringUtil::trim($_POST['className']);\r
- }\r
- if (isset($_POST['actionName'])) {\r
- $this->actionName = StringUtil::trim($_POST['actionName']);\r
- }\r
- if (isset($_POST['objectIDs'])) {\r
- if (is_array($_POST['objectIDs'])) $this->objectIDs = ArrayUtil::toIntegerArray($_POST['objectIDs']);\r
- }\r
- if (isset($_POST['parameters'])) {\r
- if (is_array($_POST['parameters'])) $this->parameters = $parameters;\r
- }\r
- }\r
- \r
- /**\r
- * @see Action::execute()\r
- */\r
- public function execute() {\r
- parent::execute();\r
- \r
- // validate class name\r
- if (!class_exists($this->className)) {\r
- throw new AJAXException("unknown class '".$this->className."'");\r
- }\r
- if (!ClassUtil::isInstanceOf($this->className, 'wcf\data\IDatabaseObjectAction')) {\r
- throw new AJAXException("'".$this->className."' should implement wcf\system\IDatabaseObjectAction");\r
- }\r
- \r
- // create object action instance\r
- $this->objectAction = new $this->className($this->objectIDs, $this->actionName, $this->parameters);\r
- \r
- // validate action\r
- try {\r
- $this->objectAction->validateAction();\r
- }\r
- catch (ValidateActionException $e) {\r
- throw new AJAXException("validation failed: ".$e->getMessage());\r
- }\r
- \r
- // execute action\r
- try {\r
- $this->response = $this->objectAction->executeAction();\r
- }\r
- catch (\Exception $e) {\r
- throw new AJAXException('unknown exception caught: '.$e->getMessage());\r
- }\r
- $this->executed();\r
- \r
- // send JSON-encoded response\r
- header('Content-type: application/json');\r
- echo JSON::encode($this->response);\r
- exit;\r
- }\r
+namespace wcf\action;
+use wcf\system\exception\AJAXException;
+use wcf\system\exception\ValidateActionException;
+use wcf\util\ArrayUtil;
+use wcf\util\ClassUtil;
+use wcf\util\JSON;
+use wcf\util\StringUtil;
+
+/**
+ * Default implementation for object-actions using the AJAX-API.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage action
+ * @category Community Framework
+ */
+class AJAXProxyAction extends AbstractSecureAction {
+ /**
+ * class name
+ * @var string
+ */
+ protected $className = '';
+
+ /**
+ * action name
+ * @var string
+ */
+ protected $actionName = '';
+
+ /**
+ * list of object ids
+ * @var array<integer>
+ */
+ protected $objectIDs = array();
+
+ /**
+ * additional parameters
+ * @var array<mixed>
+ */
+ protected $parameters = array();
+
+ /**
+ * object action
+ * @var wcf\data\IDatabaseObjectAction
+ */
+ protected $objectAction = null;
+
+ /**
+ * results of the executed action
+ * @var mixed
+ */
+ protected $response = null;
+
+ /**
+ * @see AbstractAction::_construct()
+ */
+ public function __construct() {
+ try {
+ parent::__construct();
+ }
+ catch (\Exception $e) {
+ if ($e instanceof AJAXException) {
+ throw $e;
+ }
+ else {
+ throw new AJAXException($e->getMessage());
+ }
+ }
+ }
+
+ /**
+ * @see Action::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_POST['className'])) {
+ $this->className = StringUtil::trim($_POST['className']);
+ }
+ if (isset($_POST['actionName'])) {
+ $this->actionName = StringUtil::trim($_POST['actionName']);
+ }
+ if (isset($_POST['objectIDs'])) {
+ if (is_array($_POST['objectIDs'])) $this->objectIDs = ArrayUtil::toIntegerArray($_POST['objectIDs']);
+ }
+ if (isset($_POST['parameters'])) {
+ if (is_array($_POST['parameters'])) $this->parameters = $parameters;
+ }
+ }
+
+ /**
+ * @see Action::execute()
+ */
+ public function execute() {
+ parent::execute();
+
+ // validate class name
+ if (!class_exists($this->className)) {
+ throw new AJAXException("unknown class '".$this->className."'");
+ }
+ if (!ClassUtil::isInstanceOf($this->className, 'wcf\data\IDatabaseObjectAction')) {
+ throw new AJAXException("'".$this->className."' should implement wcf\system\IDatabaseObjectAction");
+ }
+
+ // create object action instance
+ $this->objectAction = new $this->className($this->objectIDs, $this->actionName, $this->parameters);
+
+ // validate action
+ try {
+ $this->objectAction->validateAction();
+ }
+ catch (ValidateActionException $e) {
+ throw new AJAXException("validation failed: ".$e->getMessage());
+ }
+
+ // execute action
+ try {
+ $this->response = $this->objectAction->executeAction();
+ }
+ catch (\Exception $e) {
+ throw new AJAXException('unknown exception caught: '.$e->getMessage());
+ }
+ $this->executed();
+
+ // send JSON-encoded response
+ header('Content-type: application/json');
+ echo JSON::encode($this->response);
+ exit;
+ }
}
-<?php\r
-namespace wcf\action;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * This class provides default implementations for the Action interface.\r
- * This includes the call of the default event listeners for an action: readParameters and execute.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage action\r
- * @category Community Framework\r
- */\r
-abstract class AbstractAction implements IAction {\r
- /**\r
- * Needed modules to execute this action.\r
- * \r
- * @var array<string>\r
- */\r
- public $neededModules = array();\r
- \r
- /**\r
- * Needed permissions to execute this action.\r
- * \r
- * @var array<string>\r
- */\r
- public $neededPermissions = array();\r
- \r
- /**\r
- * Creates a new AbstractAction object.\r
- * Calls the methods readParameters() and execute() automatically.\r
- */\r
- public function __construct() {\r
- // call default methods\r
- $this->readParameters();\r
- $this->execute();\r
- }\r
- \r
- /**\r
- * @see wcf\action\IAction::readParameters()\r
- */\r
- public function readParameters() {\r
- // call readParameters event\r
- EventHandler::getInstance()->fireAction($this, 'readParameters');\r
- }\r
- \r
- /**\r
- * @see wcf\action\IAction::execute()\r
- */\r
- public function execute() {\r
- // check modules\r
- if (count($this->neededModules)) {\r
- foreach ($this->neededModules as $module) {\r
- if (!defined($module) || !constant($module)) throw new IllegalLinkException();\r
- }\r
- }\r
- \r
- // check permission\r
- if (count($this->neededPermissions)) {\r
- WCF::getSession()->checkPermission($this->neededPermissions);\r
- }\r
- \r
- // call execute event\r
- EventHandler::getInstance()->fireAction($this, 'execute');\r
- }\r
- \r
- /**\r
- * Calls the 'executed' event after the successful execution of this action.\r
- * This functions won't called automatically. You must do this manually, if you inherit AbstractAction.\r
- */\r
- protected function executed() {\r
- EventHandler::getInstance()->fireAction($this, 'executed');\r
- }\r
+<?php
+namespace wcf\action;
+use wcf\system\event\EventHandler;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\WCF;
+
+/**
+ * This class provides default implementations for the Action interface.
+ * This includes the call of the default event listeners for an action: readParameters and execute.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage action
+ * @category Community Framework
+ */
+abstract class AbstractAction implements IAction {
+ /**
+ * Needed modules to execute this action.
+ *
+ * @var array<string>
+ */
+ public $neededModules = array();
+
+ /**
+ * Needed permissions to execute this action.
+ *
+ * @var array<string>
+ */
+ public $neededPermissions = array();
+
+ /**
+ * Creates a new AbstractAction object.
+ * Calls the methods readParameters() and execute() automatically.
+ */
+ public function __construct() {
+ // call default methods
+ $this->readParameters();
+ $this->execute();
+ }
+
+ /**
+ * @see wcf\action\IAction::readParameters()
+ */
+ public function readParameters() {
+ // call readParameters event
+ EventHandler::getInstance()->fireAction($this, 'readParameters');
+ }
+
+ /**
+ * @see wcf\action\IAction::execute()
+ */
+ public function execute() {
+ // check modules
+ if (count($this->neededModules)) {
+ foreach ($this->neededModules as $module) {
+ if (!defined($module) || !constant($module)) throw new IllegalLinkException();
+ }
+ }
+
+ // check permission
+ if (count($this->neededPermissions)) {
+ WCF::getSession()->checkPermission($this->neededPermissions);
+ }
+
+ // call execute event
+ EventHandler::getInstance()->fireAction($this, 'execute');
+ }
+
+ /**
+ * Calls the 'executed' event after the successful execution of this action.
+ * This functions won't called automatically. You must do this manually, if you inherit AbstractAction.
+ */
+ protected function executed() {
+ EventHandler::getInstance()->fireAction($this, 'executed');
+ }
}
-<?php\r
-namespace wcf\action;\r
-\r
-/**\r
- * Provides method to send JSON-encoded responses.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage action\r
- * @category Community Framework\r
- */\r
-class AbstractAjaxAction extends AbstractAction {\r
- /**\r
- * Sends a JSON-encoded response.\r
- * \r
- * @param array $data\r
- */\r
- protected function sendJsonResponse(array $data) {\r
- $json = JSON::encode($data);\r
- \r
- // send JSON response\r
- header('Content-type: application/json');\r
- echo $json;\r
- exit;\r
- }\r
+<?php
+namespace wcf\action;
+
+/**
+ * Provides method to send JSON-encoded responses.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage action
+ * @category Community Framework
+ */
+class AbstractAjaxAction extends AbstractAction {
+ /**
+ * Sends a JSON-encoded response.
+ *
+ * @param array $data
+ */
+ protected function sendJsonResponse(array $data) {
+ $json = JSON::encode($data);
+
+ // send JSON response
+ header('Content-type: application/json');
+ echo $json;
+ exit;
+ }
}
-<?php\r
-namespace wcf\action;\r
-use wcf\system\exception\AJAXException;\r
-use wcf\util\JSON;\r
-use wcf\util\StringUtil;\r
-\r
-abstract class AbstractDialogAction extends AbstractSecureAction {\r
- /**\r
- * current step\r
- *\r
- * @var string\r
- */\r
- public $step = '';\r
- \r
- /**\r
- * template name\r
- *\r
- * @var string\r
- */\r
- public $templateName = '';\r
- \r
- /**\r
- * response data\r
- *\r
- * @var array\r
- */\r
- public $data = array();\r
- \r
- /**\r
- * @see Action::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (empty($this->templateName)) {\r
- throw new IllegalLinkException();\r
- }\r
- \r
- if (isset($_REQUEST['step'])) {\r
- $this->step = StringUtil::trim($_REQUEST['step']);\r
- \r
- // append step as part of template name\r
- $this->templateName .= StringUtil::firstCharToUpperCase($this->step);\r
- }\r
- \r
- $this->validateStep();\r
- }\r
- \r
- public final function execute() {\r
- parent::execute();\r
- \r
- $methodName = 'step' . StringUtil::firstCharToUpperCase($this->step);\r
- if (!method_exists($this, $methodName)) {\r
- throw new AJAXException("Class '".get_class($this)."' does not implement the required method '".$methodName."'");\r
- }\r
- \r
- // execute step\r
- $this->{$methodName}();\r
- \r
- $this->executed();\r
- \r
- // send JSON-encoded response\r
- header('Content-type: application/json');\r
- echo JSON::encode($this->data);\r
- exit;\r
- }\r
- \r
- /**\r
- * Validates current dialog step.\r
- */\r
- abstract protected function validateStep();\r
+<?php
+namespace wcf\action;
+use wcf\system\exception\AJAXException;
+use wcf\util\JSON;
+use wcf\util\StringUtil;
+
+abstract class AbstractDialogAction extends AbstractSecureAction {
+ /**
+ * current step
+ *
+ * @var string
+ */
+ public $step = '';
+
+ /**
+ * template name
+ *
+ * @var string
+ */
+ public $templateName = '';
+
+ /**
+ * response data
+ *
+ * @var array
+ */
+ public $data = array();
+
+ /**
+ * @see Action::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (empty($this->templateName)) {
+ throw new IllegalLinkException();
+ }
+
+ if (isset($_REQUEST['step'])) {
+ $this->step = StringUtil::trim($_REQUEST['step']);
+
+ // append step as part of template name
+ $this->templateName .= StringUtil::firstCharToUpperCase($this->step);
+ }
+
+ $this->validateStep();
+ }
+
+ public final function execute() {
+ parent::execute();
+
+ $methodName = 'step' . StringUtil::firstCharToUpperCase($this->step);
+ if (!method_exists($this, $methodName)) {
+ throw new AJAXException("Class '".get_class($this)."' does not implement the required method '".$methodName."'");
+ }
+
+ // execute step
+ $this->{$methodName}();
+
+ $this->executed();
+
+ // send JSON-encoded response
+ header('Content-type: application/json');
+ echo JSON::encode($this->data);
+ exit;
+ }
+
+ /**
+ * Validates current dialog step.
+ */
+ abstract protected function validateStep();
}
-<?php\r
-namespace wcf\action;\r
-\r
-/**\r
- * Abstract handler for object-actions using the AJAX-API.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage action\r
- * @category Community Framework\r
- */\r
-abstract class AbstractSecureObjectAction extends AbstractAction {\r
- protected $action = '';\r
- protected $actionClass = '';\r
- protected $actionData = array();\r
- protected $data = array();\r
- protected $objectAction = null;\r
- protected $objectIDs = array();\r
- \r
- /**\r
- * @see Action::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- if (isset($_POST['actionClass'])) {\r
- $this->actionClass = StringUtil::trim($_POST['actionClass']);\r
- }\r
- if (isset($_POST['data'])) {\r
- $data = json_decode($_POST['data'], true);\r
- if (is_array($data)) $this->data = $data;\r
- }\r
- if (isset($_POST['objectIDs'])) {\r
- $objectIDs = json_decode($_POST['objectIDs']);\r
- if (is_array($objectIDs)) $this->objectIDs = ArrayUtil::toIntegerArray($objectIDs);\r
- }\r
- }\r
- \r
- /**\r
- * @see Action::execute()\r
- * @todo Add validation for $actionClass, $data and $objectIDs,\r
- * possibly with some kind of derived exception maintaining\r
- * a js-readable output (do not use printable exception!)\r
- */\r
- public function execute() {\r
- parent::execute();\r
- \r
- $className = $this->actionClass.'Action';\r
- $classPath = $this->getClassPath().$this->actionClass.'Action.class.php';\r
- \r
- require_once($classPath);\r
- $this->objectAction = new $className($this->objectIDs, $this->action, $this->actionData);\r
- }\r
- \r
- /**\r
- * Executes chosen action. This method is not called automatically,\r
- * you must call this method in any derived class.\r
- */\r
- protected function executeAction() {\r
- $this->objectAction->validateAction();\r
- $this->objectAction->executeAction();\r
- \r
- $this->handleResult();\r
- }\r
- \r
- /**\r
- * Returns class path based upon object action's name (excluding Action-suffix)\r
- * \r
- * @return string\r
- */\r
- protected function getClassPath() {\r
- $directories = array();\r
- $components = preg_split('~(?<=[a-z])(?=[A-Z])~', $this->actionClass);\r
- \r
- foreach ($components as $part) {\r
- $directories[] = StringUtil::toLowerCase($part);\r
- }\r
- \r
- $path = WCF_DIR . 'lib/data/' . implode('/', $directories);\r
- return FileUtil::addTrailingSlash($path);\r
- }\r
- \r
- /**\r
- * Handles action result, derived classes must implement this but leave it empty.\r
- */\r
- abstract protected function handleResult();\r
+<?php
+namespace wcf\action;
+
+/**
+ * Abstract handler for object-actions using the AJAX-API.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage action
+ * @category Community Framework
+ */
+abstract class AbstractSecureObjectAction extends AbstractAction {
+ protected $action = '';
+ protected $actionClass = '';
+ protected $actionData = array();
+ protected $data = array();
+ protected $objectAction = null;
+ protected $objectIDs = array();
+
+ /**
+ * @see Action::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ if (isset($_POST['actionClass'])) {
+ $this->actionClass = StringUtil::trim($_POST['actionClass']);
+ }
+ if (isset($_POST['data'])) {
+ $data = json_decode($_POST['data'], true);
+ if (is_array($data)) $this->data = $data;
+ }
+ if (isset($_POST['objectIDs'])) {
+ $objectIDs = json_decode($_POST['objectIDs']);
+ if (is_array($objectIDs)) $this->objectIDs = ArrayUtil::toIntegerArray($objectIDs);
+ }
+ }
+
+ /**
+ * @see Action::execute()
+ * @todo Add validation for $actionClass, $data and $objectIDs,
+ * possibly with some kind of derived exception maintaining
+ * a js-readable output (do not use printable exception!)
+ */
+ public function execute() {
+ parent::execute();
+
+ $className = $this->actionClass.'Action';
+ $classPath = $this->getClassPath().$this->actionClass.'Action.class.php';
+
+ require_once($classPath);
+ $this->objectAction = new $className($this->objectIDs, $this->action, $this->actionData);
+ }
+
+ /**
+ * Executes chosen action. This method is not called automatically,
+ * you must call this method in any derived class.
+ */
+ protected function executeAction() {
+ $this->objectAction->validateAction();
+ $this->objectAction->executeAction();
+
+ $this->handleResult();
+ }
+
+ /**
+ * Returns class path based upon object action's name (excluding Action-suffix)
+ *
+ * @return string
+ */
+ protected function getClassPath() {
+ $directories = array();
+ $components = preg_split('~(?<=[a-z])(?=[A-Z])~', $this->actionClass);
+
+ foreach ($components as $part) {
+ $directories[] = StringUtil::toLowerCase($part);
+ }
+
+ $path = WCF_DIR . 'lib/data/' . implode('/', $directories);
+ return FileUtil::addTrailingSlash($path);
+ }
+
+ /**
+ * Handles action result, derived classes must implement this but leave it empty.
+ */
+ abstract protected function handleResult();
}
-<?php\r
-namespace wcf\action;\r
-\r
-/**\r
- * All action classes should implement this interface.\r
- * An action executes a user input without showing a result page or a form. \r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage action\r
- * @category Community Framework\r
- */\r
-interface IAction {\r
- /**\r
- * Reads the given parameters.\r
- */\r
- public function readParameters();\r
- \r
- /**\r
- * Executes this action.\r
- */\r
- public function execute();\r
+<?php
+namespace wcf\action;
+
+/**
+ * All action classes should implement this interface.
+ * An action executes a user input without showing a result page or a form.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage action
+ * @category Community Framework
+ */
+interface IAction {
+ /**
+ * Reads the given parameters.
+ */
+ public function readParameters();
+
+ /**
+ * Executes this action.
+ */
+ public function execute();
}
-<?php\r
-/**\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @category Community Framework\r
- */\r
-// set exception handler\r
-set_exception_handler(array('wcf\system\WCF', 'handleException'));\r
-\r
-// set php error handler\r
-set_error_handler(array('wcf\system\WCF', 'handleError'), E_ALL);\r
-\r
-// set shutdown function\r
-register_shutdown_function(array('wcf\system\WCF', 'destruct'));\r
-\r
-// set autoload function\r
-spl_autoload_register(array('wcf\system\WCF', 'autoload'));\r
-\r
-// define escape string shortcut\r
-function escapeString($string) {\r
- return wcf\system\WCF::getDB()->escapeString($string);\r
+<?php
+/**
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @category Community Framework
+ */
+// set exception handler
+set_exception_handler(array('wcf\system\WCF', 'handleException'));
+
+// set php error handler
+set_error_handler(array('wcf\system\WCF', 'handleError'), E_ALL);
+
+// set shutdown function
+register_shutdown_function(array('wcf\system\WCF', 'destruct'));
+
+// set autoload function
+spl_autoload_register(array('wcf\system\WCF', 'autoload'));
+
+// define escape string shortcut
+function escapeString($string) {
+ return wcf\system\WCF::getDB()->escapeString($string);
}
-<?php\r
-namespace wcf\data;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Abstract class for all data holder classes.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data\r
- * @category Community Framework\r
- */\r
-abstract class DatabaseObject implements IStorableObject {\r
- /**\r
- * database table for this object\r
- * @var string\r
- */\r
- protected static $databaseTableName = '';\r
- \r
- /**\r
- * indicates if database table index is an identity column\r
- * @var boolean \r
- */ \r
- protected static $databaseTableIndexIsIdentity = true;\r
- \r
- /**\r
- * name of the primary index column\r
- * @var string\r
- */\r
- protected static $databaseTableIndexName = '';\r
- \r
- /**\r
- * sort field\r
- * @var mixed\r
- */\r
- protected static $sortBy = null;\r
- \r
- /**\r
- * sort order\r
- * @var mixed\r
- */\r
- protected static $sortOrder = null;\r
- \r
- /**\r
- * object data\r
- * @var array\r
- */\r
- protected $data = null;\r
- \r
- /**\r
- * Creates a new instance of the DatabaseObject class.\r
- * Stores object data.\r
- * \r
- * @param mixed $id\r
- * @param array $row\r
- * @param DatabaseObject $object\r
- */\r
- public function __construct($id, array $row = null, DatabaseObject $object = null) {\r
- if ($id !== null) {\r
- $sql = "SELECT *\r
- FROM ".static::getDatabaseTableName()."\r
- WHERE ".static::getDatabaseTableIndexName()." = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($id));\r
- $row = $statement->fetchArray();\r
- \r
- // enforce data type 'array'\r
- if ($row === false) $row = array();\r
- }\r
- else if ($object !== null) {\r
- $row = $object->data;\r
- }\r
- \r
- $this->handleData($row);\r
- }\r
- \r
- /**\r
- * Stores the data of a database row.\r
- * \r
- * @param array $data\r
- */\r
- protected function handleData($data) {\r
- // provide a logical false value for - assumed numeric - primary index\r
- if (!isset($data[static::getDatabaseTableIndexName()])) {\r
- $data[static::getDatabaseTableIndexName()] = 0;\r
- }\r
- \r
- $this->data = $data;\r
- }\r
-\r
- /**\r
- * @see wcf\data\IStorableObject::__get()\r
- */\r
- public function __get($name) {\r
- if (isset($this->data[$name])) {\r
- return $this->data[$name];\r
- }\r
- else {\r
- return null;\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\data\IStorableObject::__isset()\r
- */\r
- public function __isset($name) {\r
- return isset($this->data[$name]);\r
- }\r
- \r
- /**\r
- * @see wcf\data\IStorableObject::getDatabaseTableName()\r
- */\r
- public static function getDatabaseTableName() {\r
- return 'wcf'.WCF_N.'_'.static::$databaseTableName;\r
- }\r
- \r
- /**\r
- * @see wcf\data\IStorableObject::getDatabaseTableAlias()\r
- */\r
- public static function getDatabaseTableAlias() {\r
- return static::$databaseTableName;\r
- }\r
- \r
- /**\r
- * @see wcf\data\IStorableObject::getDatabaseTableIndexIsIdentity()\r
- */ \r
- public static function getDatabaseTableIndexIsIdentity() {\r
- return static::$databaseTableIndexIsIdentity;\r
- }\r
- \r
- /**\r
- * @see wcf\data\IStorableObject::getDatabaseTableIndexName()\r
- */\r
- public static function getDatabaseTableIndexName() {\r
- return static::$databaseTableIndexName;\r
- }\r
- \r
- /**\r
- * Sorts a list of database objects.\r
- *\r
- * @param array<DatabaseObject> $objects\r
- * @param mixed $sortBy\r
- * @param string $sortOrder\r
- * @return boolean\r
- */\r
- public static function sort(&$objects, $sortBy, $sortOrder = 'ASC', $maintainIndexAssociation = true) {\r
- static::$sortBy = (!is_array($sortBy) ? array($sortBy) : $sortBy);\r
- static::$sortOrder = (!is_array($sortOrder) ? array($sortOrder) : $sortOrder);\r
-\r
- if ($maintainIndexAssociation) {\r
- return uasort($objects, array('static', 'compareObjects'));\r
- }\r
- else {\r
- return usort($objects, array('static', 'compareObjects'));\r
- }\r
- }\r
- \r
- /**\r
- * Compares to database objects.\r
- *\r
- * @param DatabaseObject $objectA\r
- * @param DatabaseObject $objectB\r
- * @return float\r
- */\r
- protected static function compareObjects($objectA, $objectB) {\r
- foreach (static::$sortBy as $key => $sortBy) {\r
- $sortOrder = (isset(static::$sortOrder[$key]) ? static::$sortOrder[$key] : 'ASC');\r
- if (is_numeric($objectA->$sortBy) && is_numeric($objectB->$sortBy)) {\r
- if ($objectA->$sortBy > $objectB->$sortBy) {\r
- return ($sortOrder == 'ASC' ? 1 : 0);\r
- }\r
- else if ($objectA->$sortBy < $objectB->$sortBy) {\r
- return ($sortOrder == 'ASC' ? 0 : 1);\r
- }\r
- }\r
- else {\r
- if ($sortOrder == 'ASC') {\r
- $result = strcoll($objectA->$sortBy, $objectB->$sortBy);\r
- }\r
- else {\r
- $result = strcoll($objectB->$sortBy, $objectA->$sortBy);\r
- }\r
- \r
- if ($result != 0.0) {\r
- return $result;\r
- }\r
- }\r
- }\r
- \r
- return 0;\r
- }\r
+<?php
+namespace wcf\data;
+use wcf\system\WCF;
+
+/**
+ * Abstract class for all data holder classes.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data
+ * @category Community Framework
+ */
+abstract class DatabaseObject implements IStorableObject {
+ /**
+ * database table for this object
+ * @var string
+ */
+ protected static $databaseTableName = '';
+
+ /**
+ * indicates if database table index is an identity column
+ * @var boolean
+ */
+ protected static $databaseTableIndexIsIdentity = true;
+
+ /**
+ * name of the primary index column
+ * @var string
+ */
+ protected static $databaseTableIndexName = '';
+
+ /**
+ * sort field
+ * @var mixed
+ */
+ protected static $sortBy = null;
+
+ /**
+ * sort order
+ * @var mixed
+ */
+ protected static $sortOrder = null;
+
+ /**
+ * object data
+ * @var array
+ */
+ protected $data = null;
+
+ /**
+ * Creates a new instance of the DatabaseObject class.
+ * Stores object data.
+ *
+ * @param mixed $id
+ * @param array $row
+ * @param DatabaseObject $object
+ */
+ public function __construct($id, array $row = null, DatabaseObject $object = null) {
+ if ($id !== null) {
+ $sql = "SELECT *
+ FROM ".static::getDatabaseTableName()."
+ WHERE ".static::getDatabaseTableIndexName()." = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($id));
+ $row = $statement->fetchArray();
+
+ // enforce data type 'array'
+ if ($row === false) $row = array();
+ }
+ else if ($object !== null) {
+ $row = $object->data;
+ }
+
+ $this->handleData($row);
+ }
+
+ /**
+ * Stores the data of a database row.
+ *
+ * @param array $data
+ */
+ protected function handleData($data) {
+ // provide a logical false value for - assumed numeric - primary index
+ if (!isset($data[static::getDatabaseTableIndexName()])) {
+ $data[static::getDatabaseTableIndexName()] = 0;
+ }
+
+ $this->data = $data;
+ }
+
+ /**
+ * @see wcf\data\IStorableObject::__get()
+ */
+ public function __get($name) {
+ if (isset($this->data[$name])) {
+ return $this->data[$name];
+ }
+ else {
+ return null;
+ }
+ }
+
+ /**
+ * @see wcf\data\IStorableObject::__isset()
+ */
+ public function __isset($name) {
+ return isset($this->data[$name]);
+ }
+
+ /**
+ * @see wcf\data\IStorableObject::getDatabaseTableName()
+ */
+ public static function getDatabaseTableName() {
+ return 'wcf'.WCF_N.'_'.static::$databaseTableName;
+ }
+
+ /**
+ * @see wcf\data\IStorableObject::getDatabaseTableAlias()
+ */
+ public static function getDatabaseTableAlias() {
+ return static::$databaseTableName;
+ }
+
+ /**
+ * @see wcf\data\IStorableObject::getDatabaseTableIndexIsIdentity()
+ */
+ public static function getDatabaseTableIndexIsIdentity() {
+ return static::$databaseTableIndexIsIdentity;
+ }
+
+ /**
+ * @see wcf\data\IStorableObject::getDatabaseTableIndexName()
+ */
+ public static function getDatabaseTableIndexName() {
+ return static::$databaseTableIndexName;
+ }
+
+ /**
+ * Sorts a list of database objects.
+ *
+ * @param array<DatabaseObject> $objects
+ * @param mixed $sortBy
+ * @param string $sortOrder
+ * @return boolean
+ */
+ public static function sort(&$objects, $sortBy, $sortOrder = 'ASC', $maintainIndexAssociation = true) {
+ static::$sortBy = (!is_array($sortBy) ? array($sortBy) : $sortBy);
+ static::$sortOrder = (!is_array($sortOrder) ? array($sortOrder) : $sortOrder);
+
+ if ($maintainIndexAssociation) {
+ return uasort($objects, array('static', 'compareObjects'));
+ }
+ else {
+ return usort($objects, array('static', 'compareObjects'));
+ }
+ }
+
+ /**
+ * Compares to database objects.
+ *
+ * @param DatabaseObject $objectA
+ * @param DatabaseObject $objectB
+ * @return float
+ */
+ protected static function compareObjects($objectA, $objectB) {
+ foreach (static::$sortBy as $key => $sortBy) {
+ $sortOrder = (isset(static::$sortOrder[$key]) ? static::$sortOrder[$key] : 'ASC');
+ if (is_numeric($objectA->$sortBy) && is_numeric($objectB->$sortBy)) {
+ if ($objectA->$sortBy > $objectB->$sortBy) {
+ return ($sortOrder == 'ASC' ? 1 : 0);
+ }
+ else if ($objectA->$sortBy < $objectB->$sortBy) {
+ return ($sortOrder == 'ASC' ? 0 : 1);
+ }
+ }
+ else {
+ if ($sortOrder == 'ASC') {
+ $result = strcoll($objectA->$sortBy, $objectB->$sortBy);
+ }
+ else {
+ $result = strcoll($objectB->$sortBy, $objectA->$sortBy);
+ }
+
+ if ($result != 0.0) {
+ return $result;
+ }
+ }
+ }
+
+ return 0;
+ }
}
-<?php\r
-namespace wcf\data\acp\menu\item;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP menu item-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.menu.item\r
- * @category Community Framework\r
- */\r
-class ACPMenuItemAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\acp\menu\item\ACPMenuItemEditor';\r
+<?php
+namespace wcf\data\acp\menu\item;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP menu item-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.menu.item
+ * @category Community Framework
+ */
+class ACPMenuItemAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\acp\menu\item\ACPMenuItemEditor';
}
-<?php\r
-namespace wcf\data\acp\menu\item;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of ACP menu items.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.menu.item\r
- * @category Community Framework\r
- */\r
-class ACPMenuItemList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\acp\menu\item\ACPMenuItem';\r
+<?php
+namespace wcf\data\acp\menu\item;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of ACP menu items.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.menu.item
+ * @category Community Framework
+ */
+class ACPMenuItemList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\acp\menu\item\ACPMenuItem';
}
-<?php\r
-namespace wcf\data\acp\session;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP session-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.session\r
- * @category Community Framework\r
- */\r
-class ACPSessionAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\acp\session\ACPSessionEditor';\r
+<?php
+namespace wcf\data\acp\session;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP session-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.session
+ * @category Community Framework
+ */
+class ACPSessionAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\acp\session\ACPSessionEditor';
}
-<?php\r
-namespace wcf\data\acp\session;\r
-\r
-/**\r
- * Represents a list of ACP sessions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.session\r
- * @category Community Framework\r
- */\r
-class ACPSessionList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\acp\session\ACPSession';\r
+<?php
+namespace wcf\data\acp\session;
+
+/**
+ * Represents a list of ACP sessions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.session
+ * @category Community Framework
+ */
+class ACPSessionList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\acp\session\ACPSession';
}
-<?php\r
-namespace wcf\data\acp\session\access\log;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP session access log-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.session.access.log\r
- * @category Community Framework\r
- */\r
-class ACPSessionAccessLogAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\acp\session\access\log\ACPSessionAccessLogEditor';\r
+<?php
+namespace wcf\data\acp\session\access\log;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP session access log-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.session.access.log
+ * @category Community Framework
+ */
+class ACPSessionAccessLogAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\acp\session\access\log\ACPSessionAccessLogEditor';
}
-<?php\r
-namespace wcf\data\acp\session\data;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP session data-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.session.data\r
- * @category Community Framework\r
- */\r
-class ACPSessionDataAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\acp\session\data\ACPSessionDataEditor';\r
+<?php
+namespace wcf\data\acp\session\data;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP session data-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.session.data
+ * @category Community Framework
+ */
+class ACPSessionDataAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\acp\session\data\ACPSessionDataEditor';
}
-<?php\r
-namespace wcf\data\acp\session\data;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of ACP session data.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.session.data\r
- * @category Community Framework\r
- */\r
-class ACPSessionDataList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\acp\session\data\ACPSessionData';\r
+<?php
+namespace wcf\data\acp\session\data;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of ACP session data.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.session.data
+ * @category Community Framework
+ */
+class ACPSessionDataList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\acp\session\data\ACPSessionData';
}
-<?php\r
-namespace wcf\data\acp\session\log;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes ACP session log-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.session.log\r
- * @category Community Framework\r
- */\r
-class ACPSessionLogAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\acp\session\log\ACPSessionLogEditor';\r
+<?php
+namespace wcf\data\acp\session\log;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes ACP session log-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.session.log
+ * @category Community Framework
+ */
+class ACPSessionLogAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\acp\session\log\ACPSessionLogEditor';
}
-<?php\r
-namespace wcf\data\acp\template;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes ACP templates-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.template\r
- * @category Community Framework\r
- */\r
-class ACPTemplateAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\acp\template\ACPTemplateEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.template.canAddTemplate');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.template.canDeleteTemplate');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.template.canUpdateTemplate');\r
+<?php
+namespace wcf\data\acp\template;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes ACP templates-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.template
+ * @category Community Framework
+ */
+class ACPTemplateAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\acp\template\ACPTemplateEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.template.canAddTemplate');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.template.canDeleteTemplate');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.template.canUpdateTemplate');
}
-<?php\r
-namespace wcf\data\acp\template;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of ACP templates.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.template\r
- * @category Community Framework\r
- */\r
-class ACPTemplateList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\acp\template\ACPTemplate';\r
+<?php
+namespace wcf\data\acp\template;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of ACP templates.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.template
+ * @category Community Framework
+ */
+class ACPTemplateList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\acp\template\ACPTemplate';
}
-<?php\r
-namespace wcf\data\cleanup\listener;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes cleanup listener-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.cleanup.listener\r
- * @category Community Framework\r
- */\r
-class CleanupListenerAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\cleanup\listener\CleanupListenerEditor';\r
+<?php
+namespace wcf\data\cleanup\listener;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes cleanup listener-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.cleanup.listener
+ * @category Community Framework
+ */
+class CleanupListenerAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\cleanup\listener\CleanupListenerEditor';
}
-<?php\r
-namespace wcf\data\cleanup\listener;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of cleanup listener.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.cleanup.listener\r
- * @category Community Framework\r
- */\r
-class CleanupListenerList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\cleanup\listener\CleanupListener';\r
+<?php
+namespace wcf\data\cleanup\listener;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of cleanup listener.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.cleanup.listener
+ * @category Community Framework
+ */
+class CleanupListenerList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\cleanup\listener\CleanupListener';
}
-<?php\r
-namespace wcf\data\core\object;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes core object-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.core.object\r
- * @category Community Framework\r
- */\r
-class CoreObjectAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\core\object\CoreObjectEditor';\r
+<?php
+namespace wcf\data\core\object;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes core object-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.core.object
+ * @category Community Framework
+ */
+class CoreObjectAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\core\object\CoreObjectEditor';
}
-<?php\r
-namespace wcf\data\core\object;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of core objects.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.event\r
- * @category Community Framework\r
- */\r
-class CoreObjectList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\core\object\CoreObject';\r
+<?php
+namespace wcf\data\core\object;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of core objects.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.event
+ * @category Community Framework
+ */
+class CoreObjectList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\core\object\CoreObject';
}
-<?php\r
-namespace wcf\data\cronjob;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes cronjob-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.cronjob\r
- * @category Community Framework\r
- */\r
-class CronjobAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\cronjob\CronjobEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.system.cronjobs.canAddCronjob');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.system.cronjobs.canDeleteCronjob');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.system.cronjobs.canEditCronjob');\r
- \r
- /**\r
- * Validates permissions and parameters\r
- */\r
- public function validateDelete() {\r
- parent::validateDelete();\r
- \r
- foreach ($this->objects as $cronjob) {\r
- if (!$cronjob->isDeletable()) {\r
- throw new ValidateActionException('Insufficient permissions');\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Validates permissions and parameters\r
- */\r
- public function validateUpdate() {\r
- parent::validateUpdate();\r
- \r
- foreach ($this->objects as $cronjob) {\r
- if (!$cronjob->isEditable()) {\r
- throw new ValidateActionException('Insufficient permissions');\r
- } \r
- }\r
- }\r
- \r
- /**\r
- * Validates permissions and parameters\r
- */\r
- public function validateToggle() {\r
- parent::validateUpdate();\r
- \r
- foreach ($this->objects as $cronjob) {\r
- if (!$cronjob->canBeDisabled()) {\r
- throw new ValidateActionException('Insufficient permissions');\r
- } \r
- }\r
- }\r
- \r
- /**\r
- * Toggles status.\r
- */\r
- public function toggle() {\r
- foreach ($this->objects as $cronjob) {\r
- $newStatus = ($cronjob->active) ? 0 : 1;\r
- $cronjob->update(array('active' => $newStatus));\r
- }\r
- }\r
- \r
- /**\r
- * Validates permissions and parameters\r
- */\r
- public function validateExecute() {\r
- parent::validateUpdate();\r
- }\r
- \r
- /**\r
- * Executes cronjobs.\r
- */\r
- public function execute() {\r
- // TODO: implement me\r
- foreach ($this->objects as $cronjob) {\r
- \r
- }\r
- }\r
+<?php
+namespace wcf\data\cronjob;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\WCF;
+
+/**
+ * Executes cronjob-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.cronjob
+ * @category Community Framework
+ */
+class CronjobAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\cronjob\CronjobEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.system.cronjobs.canAddCronjob');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.system.cronjobs.canDeleteCronjob');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.system.cronjobs.canEditCronjob');
+
+ /**
+ * Validates permissions and parameters
+ */
+ public function validateDelete() {
+ parent::validateDelete();
+
+ foreach ($this->objects as $cronjob) {
+ if (!$cronjob->isDeletable()) {
+ throw new ValidateActionException('Insufficient permissions');
+ }
+ }
+ }
+
+ /**
+ * Validates permissions and parameters
+ */
+ public function validateUpdate() {
+ parent::validateUpdate();
+
+ foreach ($this->objects as $cronjob) {
+ if (!$cronjob->isEditable()) {
+ throw new ValidateActionException('Insufficient permissions');
+ }
+ }
+ }
+
+ /**
+ * Validates permissions and parameters
+ */
+ public function validateToggle() {
+ parent::validateUpdate();
+
+ foreach ($this->objects as $cronjob) {
+ if (!$cronjob->canBeDisabled()) {
+ throw new ValidateActionException('Insufficient permissions');
+ }
+ }
+ }
+
+ /**
+ * Toggles status.
+ */
+ public function toggle() {
+ foreach ($this->objects as $cronjob) {
+ $newStatus = ($cronjob->active) ? 0 : 1;
+ $cronjob->update(array('active' => $newStatus));
+ }
+ }
+
+ /**
+ * Validates permissions and parameters
+ */
+ public function validateExecute() {
+ parent::validateUpdate();
+ }
+
+ /**
+ * Executes cronjobs.
+ */
+ public function execute() {
+ // TODO: implement me
+ foreach ($this->objects as $cronjob) {
+
+ }
+ }
}
-<?php\r
-namespace wcf\data\cronjob;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of cronjobs.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.cronjob\r
- * @category Community Framework\r
- */\r
-class CronjobList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\cronjob\Cronjob';\r
+<?php
+namespace wcf\data\cronjob;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of cronjobs.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.cronjob
+ * @category Community Framework
+ */
+class CronjobList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\cronjob\Cronjob';
}
-<?php\r
-namespace wcf\data\cronjob\log;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of cronjob log entries.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.acp.menu.item\r
- * @category Community Framework\r
- */\r
-class CronjobLogList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\cronjob\log\CronjobLog';\r
+<?php
+namespace wcf\data\cronjob\log;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of cronjob log entries.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.acp.menu.item
+ * @category Community Framework
+ */
+class CronjobLogList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\cronjob\log\CronjobLog';
}
-<?php\r
-namespace wcf\data\event\listener;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes event listener-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.event\r
- * @category Community Framework\r
- */\r
-class EventListenerAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\event\listener\EventListenerEditor';\r
+<?php
+namespace wcf\data\event\listener;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes event listener-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.event
+ * @category Community Framework
+ */
+class EventListenerAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\event\listener\EventListenerEditor';
}
-<?php\r
-namespace wcf\data\event\listener;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of event listener.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.event\r
- * @category Community Framework\r
- */\r
-class EventListenerList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\event\listener\EventListener';\r
+<?php
+namespace wcf\data\event\listener;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of event listener.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.event
+ * @category Community Framework
+ */
+class EventListenerList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\event\listener\EventListener';
}
-<?php\r
-namespace wcf\data\language;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of languages.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.language\r
- * @category Community Framework\r
- */\r
-class LanguageList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\language\Language';\r
+<?php
+namespace wcf\data\language;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of languages.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.language
+ * @category Community Framework
+ */
+class LanguageList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\language\Language';
}
-<?php\r
-namespace wcf\data\language\category;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes language category-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.language.category\r
- * @category Community Framework\r
- */\r
-class LanguageCategoryAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\language\category\LanguageCategoryEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.language.canAddLanguage');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.language.canDeleteLanguage');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.language.canEditLanguage');\r
+<?php
+namespace wcf\data\language\category;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes language category-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.language.category
+ * @category Community Framework
+ */
+class LanguageCategoryAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\language\category\LanguageCategoryEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.language.canAddLanguage');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.language.canDeleteLanguage');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.language.canEditLanguage');
}
-<?php\r
-namespace wcf\data\language\category;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of language categories.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.language.category\r
- * @category Community Framework\r
- */\r
-class LanguageCategoryList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\language\category\LanguageCategory';\r
+<?php
+namespace wcf\data\language\category;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of language categories.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.language.category
+ * @category Community Framework
+ */
+class LanguageCategoryList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\language\category\LanguageCategory';
}
-<?php\r
-namespace wcf\data\language\item;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes language item-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.language.item\r
- * @category Community Framework\r
- */\r
-class LanguageItemAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\language\item\LanguageItemEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.language.canAddLanguage');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.language.canDeleteLanguage');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.language.canEditLanguage');\r
+<?php
+namespace wcf\data\language\item;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes language item-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.language.item
+ * @category Community Framework
+ */
+class LanguageItemAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\language\item\LanguageItemEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.language.canAddLanguage');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.language.canDeleteLanguage');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.language.canEditLanguage');
}
-<?php\r
-namespace wcf\data\language\item;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of language items.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.language.item\r
- * @category Community Framework\r
- */\r
-class LanguageItemList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\language\item\LanguageItem';\r
+<?php
+namespace wcf\data\language\item;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of language items.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.language.item
+ * @category Community Framework
+ */
+class LanguageItemList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\language\item\LanguageItem';
}
-<?php\r
-namespace wcf\data\option;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes option-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.\r
- * @category Community Framework\r
- */\r
-class OptionAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\option\OptionEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.system.canEditOption');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.system.canEditOption');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.system.canEditOption');\r
- \r
- /**\r
- * Validates permissions and parameters.\r
- */\r
- public function validateImport() {\r
- parent::validateCreate(); \r
- }\r
- \r
- /**\r
- * Validates permissions and parameters.\r
- */\r
- public function validateUpdateAll() {\r
- parent::validateCreate(); \r
- }\r
- \r
- /**\r
- * Imports options.\r
- */\r
- public function import() {\r
- // create data\r
- call_user_func(array($this->className, 'import'), $this->parameters['data']);\r
- }\r
- \r
- /**\r
- * Updates the value of all given options.\r
- */\r
- public function updateAll() {\r
- // create data\r
- call_user_func(array($this->className, 'updateAll'), $this->parameters['data']);\r
- }\r
+<?php
+namespace wcf\data\option;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes option-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.
+ * @category Community Framework
+ */
+class OptionAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\option\OptionEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.system.canEditOption');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.system.canEditOption');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.system.canEditOption');
+
+ /**
+ * Validates permissions and parameters.
+ */
+ public function validateImport() {
+ parent::validateCreate();
+ }
+
+ /**
+ * Validates permissions and parameters.
+ */
+ public function validateUpdateAll() {
+ parent::validateCreate();
+ }
+
+ /**
+ * Imports options.
+ */
+ public function import() {
+ // create data
+ call_user_func(array($this->className, 'import'), $this->parameters['data']);
+ }
+
+ /**
+ * Updates the value of all given options.
+ */
+ public function updateAll() {
+ // create data
+ call_user_func(array($this->className, 'updateAll'), $this->parameters['data']);
+ }
}
-<?php\r
-namespace wcf\data\option;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of options.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.option\r
- * @category Community Framework\r
- */\r
-class OptionList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\option\Option';\r
+<?php
+namespace wcf\data\option;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of options.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.option
+ * @category Community Framework
+ */
+class OptionList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\option\Option';
}
-<?php\r
-namespace wcf\data\option\category;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes option categories-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.option.category\r
- * @category Community Framework\r
- */\r
-class OptionCategoryAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\option\category\OptionCategoryEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.system.canEditOption');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.system.canEditOption');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.system.canEditOption');\r
+<?php
+namespace wcf\data\option\category;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes option categories-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.option.category
+ * @category Community Framework
+ */
+class OptionCategoryAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\option\category\OptionCategoryEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.system.canEditOption');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.system.canEditOption');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.system.canEditOption');
}
-<?php\r
-namespace wcf\data\option\category;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of option categories.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.option.category\r
- * @category Community Framework\r
- */\r
-class OptionCategoryList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\option\category\OptionCategory';\r
+<?php
+namespace wcf\data\option\category;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of option categories.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.option.category
+ * @category Community Framework
+ */
+class OptionCategoryList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\option\category\OptionCategory';
}
-<?php\r
-namespace wcf\data\package;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes package-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package\r
- * @category Community Framework\r
- */\r
-class PackageAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\package\PackageEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.system.package.canInstallPackage');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.system.package.canUninstallPackage');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.system.package.canUpdatePackage');\r
+<?php
+namespace wcf\data\package;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes package-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package
+ * @category Community Framework
+ */
+class PackageAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\package\PackageEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.system.package.canInstallPackage');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.system.package.canUninstallPackage');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.system.package.canUpdatePackage');
}
-<?php\r
-namespace wcf\data\package;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of packages.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package\r
- * @category Community Framework\r
- */\r
-class PackageList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\package\Package';\r
+<?php
+namespace wcf\data\package;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of packages.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package
+ * @category Community Framework
+ */
+class PackageList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\package\Package';
}
-<?php\r
-namespace wcf\data\package\installation\plugin;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes package installation plugin-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.installation.plugin\r
- * @category Community Framework\r
- */\r
-class PackageInstallationPluginAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\package\installation\plugin\PackageInstallationPluginEditor';\r
+<?php
+namespace wcf\data\package\installation\plugin;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes package installation plugin-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.installation.plugin
+ * @category Community Framework
+ */
+class PackageInstallationPluginAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\package\installation\plugin\PackageInstallationPluginEditor';
}
-<?php\r
-namespace wcf\data\package\installation\plugin;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package installation plugins.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.installation.plugin\r
- * @category Community Framework\r
- */\r
-class PackageInstallationPluginList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\package\installation\plugin\PackageInstallationPluginObj';\r
+<?php
+namespace wcf\data\package\installation\plugin;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package installation plugins.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.installation.plugin
+ * @category Community Framework
+ */
+class PackageInstallationPluginList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\package\installation\plugin\PackageInstallationPluginObj';
}
-<?php\r
-namespace wcf\data\package\installation\queue;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\data\package\Package;\r
-use wcf\system\exception\ValidateActionException;\r
-\r
-/**\r
- * Executes package installation queue-related actions.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.installation.queue\r
- * @category Community Framework\r
- */\r
-class PackageInstallationQueueAction extends AbstractDatabaseObjectAction {\r
- protected $package = null;\r
- protected $packageID = 0;\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\package\installation\queue\PackageInstallationQueueEditor';\r
- \r
- public function validatePrepareQueue() {\r
- if (isset($this->parameters['packageID'])) $this->packageID = intval($this->parameters['packageID']);\r
- \r
- $this->package = new Package($packageID);\r
- if (!$this->package->packageID) {\r
- throw new ValidateActionException('Invalid package id');\r
- }\r
- \r
- if (!isset($this->parameters['action']) || !in_array($this->parameters['action'], array('install', 'update', 'uninstall', 'rollback'))) {\r
- throw new ValidateActionException('Invalid or missing action');\r
- }\r
- }\r
- \r
- public function prepareQueue() {\r
- $processNo = PackageInstallationQueue::getNewProcessNo();\r
- \r
- $queue = PackageInstallationQueueEditor::create(array(\r
- 'processNo' => $processNo,\r
- 'userID' => WCF::getUser()->userID,\r
- 'package' => $this->package->package,\r
- 'packageName' => $this->package->packageName,\r
- 'packageID' => $this->package->packageID,\r
- 'action' => $this->parameters['action'],\r
- 'installationType' => 'other'\r
- ));\r
- \r
- return array(\r
- 'queueID' => $queue->queueID\r
- );\r
- }\r
+<?php
+namespace wcf\data\package\installation\queue;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\data\package\Package;
+use wcf\system\exception\ValidateActionException;
+
+/**
+ * Executes package installation queue-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.installation.queue
+ * @category Community Framework
+ */
+class PackageInstallationQueueAction extends AbstractDatabaseObjectAction {
+ protected $package = null;
+ protected $packageID = 0;
+
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\package\installation\queue\PackageInstallationQueueEditor';
+
+ public function validatePrepareQueue() {
+ if (isset($this->parameters['packageID'])) $this->packageID = intval($this->parameters['packageID']);
+
+ $this->package = new Package($packageID);
+ if (!$this->package->packageID) {
+ throw new ValidateActionException('Invalid package id');
+ }
+
+ if (!isset($this->parameters['action']) || !in_array($this->parameters['action'], array('install', 'update', 'uninstall', 'rollback'))) {
+ throw new ValidateActionException('Invalid or missing action');
+ }
+ }
+
+ public function prepareQueue() {
+ $processNo = PackageInstallationQueue::getNewProcessNo();
+
+ $queue = PackageInstallationQueueEditor::create(array(
+ 'processNo' => $processNo,
+ 'userID' => WCF::getUser()->userID,
+ 'package' => $this->package->package,
+ 'packageName' => $this->package->packageName,
+ 'packageID' => $this->package->packageID,
+ 'action' => $this->parameters['action'],
+ 'installationType' => 'other'
+ ));
+
+ return array(
+ 'queueID' => $queue->queueID
+ );
+ }
}
-<?php\r
-namespace wcf\data\package\installation\queue;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package installation queues.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.installation.queue\r
- * @category Community Framework\r
- */\r
-class PackageInstallationQueueList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\package\installation\queue\PackageInstallationQueue';\r
+<?php
+namespace wcf\data\package\installation\queue;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package installation queues.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.installation.queue
+ * @category Community Framework
+ */
+class PackageInstallationQueueList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\package\installation\queue\PackageInstallationQueue';
}
-<?php\r
-namespace wcf\data\package\update;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes package update-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.update\r
- * @category Community Framework\r
- */\r
-class PackageUpdateAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\package\update\PackageUpdateEditor';\r
+<?php
+namespace wcf\data\package\update;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes package update-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.update
+ * @category Community Framework
+ */
+class PackageUpdateAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\package\update\PackageUpdateEditor';
}
-<?php\r
-namespace wcf\data\package\update;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package updates.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.update\r
- * @category Community Framework\r
- */\r
-class PackageUpdateList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\package\update\PackageUpdate';\r
+<?php
+namespace wcf\data\package\update;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package updates.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.update
+ * @category Community Framework
+ */
+class PackageUpdateList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\package\update\PackageUpdate';
}
-<?php\r
-namespace wcf\data\package\update\server;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes package update server-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.update.server\r
- * @category Community Framework\r
- */\r
-class PackageUpdateServerAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\package\update\server\PackageUpdateServerEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.system.package.canEditServer');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.system.package.canEditServer');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.system.package.canEditServer');\r
- \r
- /**\r
- * Validates permissions and parameters\r
- */\r
- public function validateToggle() {\r
- parent::validateUpdate();\r
- }\r
- \r
- /**\r
- * Toggles status.\r
- */\r
- public function toggle() {\r
- foreach ($this->objects as $server) {\r
- $server->update(array('disabled' => ($server->disabled) ? 0 : 1));\r
- }\r
- }\r
+<?php
+namespace wcf\data\package\update\server;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes package update server-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.update.server
+ * @category Community Framework
+ */
+class PackageUpdateServerAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\package\update\server\PackageUpdateServerEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.system.package.canEditServer');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.system.package.canEditServer');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.system.package.canEditServer');
+
+ /**
+ * Validates permissions and parameters
+ */
+ public function validateToggle() {
+ parent::validateUpdate();
+ }
+
+ /**
+ * Toggles status.
+ */
+ public function toggle() {
+ foreach ($this->objects as $server) {
+ $server->update(array('disabled' => ($server->disabled) ? 0 : 1));
+ }
+ }
}
-<?php\r
-namespace wcf\data\package\update\server;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package update servers.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.update.server\r
- * @category Community Framework\r
- */\r
-class PackageUpdateServerList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\package\update\server\PackageUpdateServer';\r
- \r
- /**\r
- * @see DatabaseObjectList::readObjects()\r
- */\r
- public function readObjects() {\r
- if (!empty($this->sqlSelects)) $this->sqlSelects .= ',';\r
- $this->sqlSelects .= "(SELECT COUNT(*) FROM wcf".WCF_N."_package_update WHERE packageUpdateServerID = ".$this->getDatabaseTableAlias().".packageUpdateServerID) AS packages";\r
- \r
- parent::readObjects();\r
- }\r
+<?php
+namespace wcf\data\package\update\server;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package update servers.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.update.server
+ * @category Community Framework
+ */
+class PackageUpdateServerList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\package\update\server\PackageUpdateServer';
+
+ /**
+ * @see DatabaseObjectList::readObjects()
+ */
+ public function readObjects() {
+ if (!empty($this->sqlSelects)) $this->sqlSelects .= ',';
+ $this->sqlSelects .= "(SELECT COUNT(*) FROM wcf".WCF_N."_package_update WHERE packageUpdateServerID = ".$this->getDatabaseTableAlias().".packageUpdateServerID) AS packages";
+
+ parent::readObjects();
+ }
}
-<?php\r
-namespace wcf\data\package\update\version;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes package update version-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.update.version\r
- * @category Community Framework\r
- */\r
-class PackageUpdateVersionAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\package\update\version\PackageUpdateVersionEditor';\r
+<?php
+namespace wcf\data\package\update\version;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes package update version-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.update.version
+ * @category Community Framework
+ */
+class PackageUpdateVersionAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\package\update\version\PackageUpdateVersionEditor';
}
-<?php\r
-namespace wcf\data\package\update\version;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of package update versions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.package.update.version\r
- * @category Community Framework\r
- */\r
-class PackageUpdateVersionList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\package\update\version\PackageUpdateVersion';\r
+<?php
+namespace wcf\data\package\update\version;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of package update versions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.package.update.version
+ * @category Community Framework
+ */
+class PackageUpdateVersionList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\package\update\version\PackageUpdateVersion';
}
-<?php\r
-namespace wcf\data\page\location;\r
-use wcf\data\IDatabaseObjectProcessor;\r
-\r
-/**\r
- * Any page location class should implement this interface.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.page.location\r
- * @category Community Framework\r
- */\r
-interface ILocation extends IDatabaseObjectProcessor {\r
- /**\r
- * Caches the information of a page location.\r
- * \r
- * @param array $location\r
- * @param string $requestURI\r
- * @param string $requestMethod\r
- * @param array $match\r
- */\r
- public function cache($location, $requestURI, $requestMethod, $match);\r
- \r
- /**\r
- * Returns the information of a page location.\r
- * \r
- * @param array $location\r
- * @param string $requestURI\r
- * @param string $requestMethod\r
- * @param array $match\r
- * @return string\r
- */\r
- public function get($location, $requestURI, $requestMethod, $match);\r
+<?php
+namespace wcf\data\page\location;
+use wcf\data\IDatabaseObjectProcessor;
+
+/**
+ * Any page location class should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.page.location
+ * @category Community Framework
+ */
+interface ILocation extends IDatabaseObjectProcessor {
+ /**
+ * Caches the information of a page location.
+ *
+ * @param array $location
+ * @param string $requestURI
+ * @param string $requestMethod
+ * @param array $match
+ */
+ public function cache($location, $requestURI, $requestMethod, $match);
+
+ /**
+ * Returns the information of a page location.
+ *
+ * @param array $location
+ * @param string $requestURI
+ * @param string $requestMethod
+ * @param array $match
+ * @return string
+ */
+ public function get($location, $requestURI, $requestMethod, $match);
}
-<?php\r
-namespace wcf\data\page\location;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes page location-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.page.location\r
- * @category Community Framework\r
- */\r
-class PageLocationAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\page\location\PageLocationEditor';\r
+<?php
+namespace wcf\data\page\location;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes page location-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.page.location
+ * @category Community Framework
+ */
+class PageLocationAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\page\location\PageLocationEditor';
}
-<?php\r
-namespace wcf\data\page\location;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of page locations.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.page.location\r
- * @category Community Framework\r
- */\r
-class PageLocationList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\page\location\PageLocation';\r
+<?php
+namespace wcf\data\page\location;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of page locations.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.page.location
+ * @category Community Framework
+ */
+class PageLocationList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\page\location\PageLocation';
}
-<?php\r
-namespace wcf\data\page\menu\item;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes page menu item-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.page.menu.item\r
- * @category Community Framework\r
- */\r
-class PageMenuItemAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\page\menu\item\PageMenuItemEditor';\r
+<?php
+namespace wcf\data\page\menu\item;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes page menu item-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.page.menu.item
+ * @category Community Framework
+ */
+class PageMenuItemAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\page\menu\item\PageMenuItemEditor';
}
-<?php\r
-namespace wcf\data\page\menu\item;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of page menu items.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.page.menu.item\r
- * @category Community Framework\r
- */\r
-class PageMenuItemList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\page\menu\item\PageMenuItem';\r
+<?php
+namespace wcf\data\page\menu\item;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of page menu items.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.page.menu.item
+ * @category Community Framework
+ */
+class PageMenuItemList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\page\menu\item\PageMenuItem';
}
-<?php\r
-namespace wcf\data\search;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes search-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2010 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.search\r
- * @category Community Framework\r
- */\r
-class SearchAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\search\SearchEditor';\r
+<?php
+namespace wcf\data\search;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes search-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2010 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.search
+ * @category Community Framework
+ */
+class SearchAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\search\SearchEditor';
}
-<?php\r
-namespace wcf\data\search;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of searches.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.search\r
- * @category Community Framework\r
- */\r
-class SearchList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\search\Search';\r
+<?php
+namespace wcf\data\search;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of searches.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.search
+ * @category Community Framework
+ */
+class SearchList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\search\Search';
}
-<?php\r
-namespace wcf\data\session;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes session-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2010 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.session\r
- * @category Community Framework\r
- */\r
-class SessionAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\session\SessionEditor';\r
+<?php
+namespace wcf\data\session;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes session-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2010 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.session
+ * @category Community Framework
+ */
+class SessionAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\session\SessionEditor';
}
-<?php\r
-namespace wcf\data\session;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of sessions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.session\r
- * @category Community Framework\r
- */\r
-class SessionList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\session\Session';\r
+<?php
+namespace wcf\data\session;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of sessions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.session
+ * @category Community Framework
+ */
+class SessionList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\session\Session';
}
-<?php\r
-namespace wcf\data\session\data;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes session data-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2010 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.session.data\r
- * @category Community Framework\r
- */\r
-class SessionDataAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\session\data\SessionDataEditor';\r
+<?php
+namespace wcf\data\session\data;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes session data-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2010 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.session.data
+ * @category Community Framework
+ */
+class SessionDataAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\session\data\SessionDataEditor';
}
-<?php\r
-namespace wcf\data\session\data;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of session data.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.session.data\r
- * @category Community Framework\r
- */\r
-class SessionDataList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\session\data\SessionData';\r
+<?php
+namespace wcf\data\session\data;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of session data.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.session.data
+ * @category Community Framework
+ */
+class SessionDataList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\session\data\SessionData';
}
-<?php\r
-namespace wcf\data\spider;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes spider-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2010 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.spider\r
- * @category Community Framework\r
- */\r
-class SpiderAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\spider\SpiderEditor';\r
+<?php
+namespace wcf\data\spider;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes spider-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2010 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.spider
+ * @category Community Framework
+ */
+class SpiderAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\spider\SpiderEditor';
}
-<?php\r
-namespace wcf\data\spider;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of spiders.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.spider\r
- * @category Community Framework\r
- */\r
-class SpiderList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\spider\Spider';\r
+<?php
+namespace wcf\data\spider;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of spiders.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.spider
+ * @category Community Framework
+ */
+class SpiderList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\spider\Spider';
}
-<?php\r
-namespace wcf\data\style;\r
-use wcf\data\DatabaseObject;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Represents a style.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.style\r
- * @category Community Framework\r
- */\r
-class Style extends DatabaseObject {\r
- /**\r
- * @see DatabaseObject::$databaseTableName\r
- */\r
- protected static $databaseTableName = 'style';\r
- \r
- /**\r
- * @see DatabaseObject::$databaseTableIndexName\r
- */\r
- protected static $databaseTableIndexName = 'styleID';\r
- \r
- /**\r
- * Returns the name of this style.\r
- * \r
- * @return string\r
- */\r
- public function __toString() {\r
- return $this->styleName;\r
- }\r
- \r
- /**\r
- * Returns the styles variables of this style.\r
- * \r
- * @return array\r
- */\r
- public function getVariables() {\r
- $variables = array();\r
- $sql = "SELECT variableName, variableValue\r
- FROM wcf".WCF_N."_style_variable\r
- WHERE styleID = ?\r
- ORDER BY variableName ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($this->styleID));\r
- while ($row = $statement->fetchArray()) {\r
- $variables[$row['variableName']] = $row['variableValue'];\r
- }\r
- \r
- return $variables;\r
- }\r
+<?php
+namespace wcf\data\style;
+use wcf\data\DatabaseObject;
+use wcf\system\WCF;
+
+/**
+ * Represents a style.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.style
+ * @category Community Framework
+ */
+class Style extends DatabaseObject {
+ /**
+ * @see DatabaseObject::$databaseTableName
+ */
+ protected static $databaseTableName = 'style';
+
+ /**
+ * @see DatabaseObject::$databaseTableIndexName
+ */
+ protected static $databaseTableIndexName = 'styleID';
+
+ /**
+ * Returns the name of this style.
+ *
+ * @return string
+ */
+ public function __toString() {
+ return $this->styleName;
+ }
+
+ /**
+ * Returns the styles variables of this style.
+ *
+ * @return array
+ */
+ public function getVariables() {
+ $variables = array();
+ $sql = "SELECT variableName, variableValue
+ FROM wcf".WCF_N."_style_variable
+ WHERE styleID = ?
+ ORDER BY variableName ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($this->styleID));
+ while ($row = $statement->fetchArray()) {
+ $variables[$row['variableName']] = $row['variableValue'];
+ }
+
+ return $variables;
+ }
}
-<?php\r
-namespace wcf\data\style;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes style-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2010 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.style\r
- * @category Community Framework\r
- */\r
-class StyleAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\style\StyleEditor';\r
+<?php
+namespace wcf\data\style;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes style-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2010 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.style
+ * @category Community Framework
+ */
+class StyleAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\style\StyleEditor';
}
-<?php\r
-namespace wcf\data\style;\r
-use wcf\data\template\group\TemplateGroupEditor;\r
-use wcf\data\template\TemplateEditor;\r
-use wcf\data\DatabaseObjectEditor;\r
-use wcf\data\IEditableCachedObject;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\image\Thumbnail;\r
-use wcf\system\io\File;\r
-use wcf\system\io\Tar;\r
-use wcf\system\io\TarWriter;\r
-use wcf\system\WCF;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-use wcf\util\XML;\r
-\r
-/**\r
- * Provides functions to edit, import, export and delete a style.\r
- * \r
- * @todo Fix usage of XML-class (API-changes)!\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.style\r
- * @category Community Framework\r
- */\r
-class StyleEditor extends DatabaseObjectEditor implements IEditableCachedObject {\r
- const INFO_FILE = 'style.xml';\r
- const STYLE_PREVIEW_IMAGE_MAX_WIDTH = 185;\r
- const STYLE_PREVIEW_IMAGE_MAX_HEIGHT = 140;\r
- \r
- /**\r
- * @see DatabaseObjectDecorator::$baseClass\r
- */\r
- protected static $baseClass = 'wcf\data\style\Style';\r
- \r
- /**\r
- * @see wcf\data\IEditableObject::update()\r
- */\r
- public function update(array $parameters = array()) {\r
- $variables = null;\r
- if (isset($parameters['variables'])) {\r
- $variables = $parameters['variables'];\r
- unset($parameters['variables']);\r
- }\r
-\r
- // update style data\r
- parent::update($parameters);\r
- \r
- // update variables\r
- if ($variables !== null) {\r
- $this->setVariables($variables);\r
- }\r
- \r
- // scale preview image\r
- if (!empty($parameters['image']) && $parameters['image'] != $this->image) {\r
- self::scalePreviewImage(WCF_DIR.$parameters['image']);\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\data\IEditableObject::delete()\r
- */\r
- public function delete() {\r
- parent::delete();\r
- \r
- // delete variables\r
- $sql = "DELETE FROM wcf".WCF_N."_style_variable\r
- WHERE styleID = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($this->styleID));\r
- \r
- // delete style to package\r
- $sql = "DELETE FROM wcf".WCF_N."_style_to_package\r
- WHERE styleID = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($this->styleID));\r
- \r
- // delete style files\r
- @unlink(WCF_DIR.'style/style-'.$this->styleID.'.css');\r
- @unlink(WCF_DIR.'style/style-'.$this->styleID.'-rtl.css');\r
- \r
- // delete preview image\r
- if ($this->image) {\r
- @unlink(WCF_DIR.$this->image);\r
- }\r
- }\r
- \r
- /**\r
- * Sets this style as default style.\r
- */\r
- public function setAsDefault() {\r
- // remove old default\r
- $sql = "UPDATE wcf".WCF_N."_style\r
- SET isDefault = ?\r
- WHERE isDefault = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array(0, 1));\r
- \r
- // set new default\r
- $this->update(array(\r
- 'isDefault' => 1,\r
- 'disabled' => 0\r
- ));\r
- }\r
- \r
- /**\r
- * Reads the data of a style exchange format file.\r
- * \r
- * @param Tar $tar\r
- * @return array data\r
- */\r
- public static function readStyleData(Tar $tar) {\r
- // search style.xml\r
- $i = $tar->getIndexByFilename(self::INFO_FILE);\r
- if ($i === false) {\r
- throw new SystemException("unable to find required file '".self::INFO_FILE."' in style archive", 100001);\r
- }\r
- \r
- // open style.xml\r
- $styleXML = new XML();\r
- $styleXML->loadString($tar->extractToString($i));\r
- $xmlContent = $styleXML->getElementTree('style');\r
- $data = array(\r
- 'name' => '', 'description' => '', 'version' => '', 'image' => '', 'copyright' => '',\r
- 'license' => '', 'authorName' => '', 'authorURL' => '', 'templates' => '', 'images' => '',\r
- 'variables' => '', 'date' => '0000-00-00', 'icons' => ''\r
- );\r
- \r
- foreach ($xmlContent['children'] as $child) {\r
- switch ($child['name']) {\r
- case 'general': \r
- foreach ($child['children'] as $general) {\r
- switch ($general['name']) {\r
- case 'stylename': $data['name'] = $general['cdata']; break;\r
- case 'description': case 'version': case 'date': \r
- case 'image': case 'copyright': case 'license': $data[$general['name']] = $general['cdata']; break;\r
- }\r
- }\r
- break;\r
- \r
- case 'author':\r
- foreach ($child['children'] as $author) {\r
- switch ($author['name']) {\r
- case 'authorname': $data['authorName'] = $author['cdata']; break;\r
- case 'authorurl': $data['authorURL'] = $author['cdata']; break;\r
- }\r
- }\r
- break;\r
- \r
- case 'files':\r
- foreach ($child['children'] as $files) {\r
- switch ($files['name']) {\r
- case 'templates': case 'images': case 'variables': case 'icons': $data[$files['name']] = $files['cdata']; break;\r
- }\r
- }\r
- break;\r
- }\r
- }\r
- \r
- if (empty($data['name'])) {\r
- throw new SystemException("required tag 'stylename' is missing in '".self::INFO_FILE."'", 100002);\r
- }\r
- if (empty($data['variables'])) {\r
- throw new SystemException("required tag 'variables' is missing in '".self::INFO_FILE."'", 100002);\r
- }\r
- \r
- // search variables.xml\r
- $i = $tar->getIndexByFilename($data['variables']);\r
- if ($i === false) {\r
- throw new SystemException("unable to find required file '".$data['variables']."' in style archive", 100001);\r
- }\r
- \r
- // open variables.xml\r
- $data['variables'] = self::readVariablesData($tar->extractToString($i));\r
- \r
- return $data;\r
- }\r
- \r
- /**\r
- * Reads the data of a variables.xml file.\r
- * \r
- * @param string $string contents of a variable.xml file\r
- * @return array data\r
- */\r
- public static function readVariablesData($string) {\r
- // open variables.xml\r
- $variablesXML = new XML();\r
- $variablesXML->loadString($string);\r
- $variablesXMLContent = $variablesXML->getElementTree('variables');\r
- \r
- // get variables\r
- $variables = array();\r
- foreach ($variablesXMLContent['children'] as $variable) {\r
- if (isset($variable['attrs']['name'])) {\r
- $variables[$variable['attrs']['name']] = $variable['cdata'];\r
- }\r
- }\r
- \r
- return $variables;\r
- }\r
- \r
- /**\r
- * Gets the data of a style exchange format file.\r
- * \r
- * @param string $filename\r
- * @return array data\r
- */\r
- public static function getStyleData($filename) {\r
- // open file\r
- $tar = new Tar($filename);\r
- \r
- // get style data\r
- $data = self::readStyleData($tar);\r
- \r
- // export preview image to temporary location\r
- if (!empty($data['image'])) {\r
- $i = $tar->getIndexByFilename($data['image']);\r
- if ($i !== false) {\r
- $path = FileUtil::getTemporaryFilename('stylePreview_', $data['image'], WCF_DIR.'tmp/');\r
- $data['image'] = basename($path);\r
- $tar->extract($i, $path);\r
- }\r
- }\r
- \r
- $tar->close();\r
- \r
- return $data;\r
- }\r
- \r
- /**\r
- * Imports a style.\r
- * \r
- * @param string $filename\r
- * @param integer $packageID\r
- * @param StyleEditor $style\r
- * @return StyleEditor\r
- */\r
- public static function import($filename, $packageID = PACKAGE_ID, StyleEditor $style = null) {\r
- // open file\r
- $tar = new Tar($filename);\r
- \r
- // get style data\r
- $data = self::readStyleData($tar);\r
- \r
- // get image locations\r
- $iconsLocation = FileUtil::addTrailingSlash($data['variables']['global.icons.location']);\r
- $imagesLocation = $data['variables']['global.images.location'];\r
- \r
- // create template group\r
- $templateGroupID = 0;\r
- if (!empty($data['templates'])) {\r
- $originalTemplateGroupName = $templateGroupName = $data['name'];\r
- $templateGroupFolderName = preg_replace('/[^a-z0-9_-]/i', '', $templateGroupName);\r
- if (empty($templateGroupFolderName)) $templateGroupFolderName = 'generic'.StringUtil::substring(StringUtil::getRandomID(), 0, 8);\r
- $originalTemplatePackFolderName = $templateGroupFolderName;\r
- \r
- // get unique template pack name\r
- $i = 1;\r
- do {\r
- $sql = "SELECT COUNT(*) AS count\r
- FROM wcf".WCF_N."_template_group\r
- WHERE templateGroupName = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($templateGroupName));\r
- $row = $statement->fetchArray();\r
- if (!$row['count']) break;\r
- $templateGroupName = $originalTemplatePackName . '_' . $i;\r
- $i++;\r
- }\r
- while (true);\r
- // get unique folder name\r
- $i = 1;\r
- do {\r
- $sql = "SELECT COUNT(*) AS count\r
- FROM wcf".WCF_N."_template_group\r
- WHERE templateGroupFolderName = ?\r
- AND parentTemplatePackID = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array(\r
- FileUtil::addTrailingSlash($templateGroupFolderName),\r
- 0\r
- ));\r
- $row = $statement->fetchArray();\r
- if (!$row['count']) break;\r
- $templateGroupFolderName = $originalTemplatePackFolderName . '_' . $i;\r
- $i++;\r
- }\r
- while (true);\r
- \r
- $templateGroup = TemplateGroupEditor::create(array(\r
- 'templateGroupName' => $templateGroupName,\r
- 'templateGroupFolderName' => FileUtil::addTrailingSlash($templateGroupFolderName)\r
- ));\r
- $templateGroupID = $templateGroup->templateGroupID;\r
- }\r
- \r
- // save style\r
- $styleData = array(\r
- 'styleName' => $data['name'],\r
- 'variables' => $data['variables'],\r
- 'templateGroupID' => $templateGroupID,\r
- 'styleDescription' => $data['description'],\r
- 'styleVersion' => $data['version'],\r
- 'styleDate' => $data['date'],\r
- 'image' => ($data['image'] ? 'images/' : '').$data['image'],\r
- 'copyright' => $data['copyright'],\r
- 'license' => $data['license'],\r
- 'authorName' => $data['authorName'],\r
- 'authorURL' => $data['authorURL']\r
- );\r
- if ($style !== null) {\r
- $style->update($styleData);\r
- }\r
- else {\r
- $styleData['packageID'] = $packageID;\r
- $style = self::create($styleData);\r
- }\r
- \r
- // import preview image\r
- if (!empty($data['image'])) {\r
- $i = $tar->getIndexByFilename($data['image']);\r
- if ($i !== false) {\r
- $tar->extract($i, WCF_DIR.'images/'.$data['image']);\r
- @chmod(WCF_DIR.'images/'.$data['image'], 0777);\r
- }\r
- }\r
- \r
- // import images\r
- if (!empty($data['images'])) {\r
- // create images folder if necessary\r
- if (!file_exists(WCF_DIR.$imagesLocation)) {\r
- @mkdir(WCF_DIR.$data['variables']['global.images.location'], 0777);\r
- @chmod(WCF_DIR.$data['variables']['global.images.location'], 0777);\r
- }\r
- \r
- $i = $tar->getIndexByFilename($data['images']);\r
- if ($i !== false) {\r
- // extract images tar\r
- $destination = FileUtil::getTemporaryFilename('images_');\r
- $tar->extract($i, $destination);\r
- \r
- // open images tar\r
- $imagesTar = new Tar($destination);\r
- $contentList = $imagesTar->getContentList();\r
- foreach ($contentList as $key => $val) {\r
- if ($val['type'] == 'file') {\r
- $imagesTar->extract($key, WCF_DIR.$imagesLocation.basename($val['filename']));\r
- @chmod(WCF_DIR.$imagesLocation.basename($val['filename']), 0666);\r
- }\r
- }\r
-\r
- // delete tmp file\r
- $imagesTar->close();\r
- @unlink($destination);\r
- }\r
- }\r
- \r
- // import icons\r
- if (!empty($data['icons']) && $iconsLocation != 'icon/') {\r
- $i = $tar->getIndexByFilename($data['icons']);\r
- if ($i !== false) {\r
- // extract icons tar\r
- $destination = FileUtil::getTemporaryFilename('icons_');\r
- $tar->extract($i, $destination);\r
- \r
- // open icons tar and group icons by package\r
- $iconsTar = new Tar($destination);\r
- $contentList = $iconsTar->getContentList();\r
- $packageToIcons = array();\r
- foreach ($contentList as $key => $val) {\r
- if ($val['type'] == 'file') {\r
- $folders = explode('/', $val['filename']);\r
- $packageName = array_shift($folders);\r
- if (!isset($packageToIcons[$packageName])) {\r
- $packageToIcons[$packageName] = array();\r
- }\r
- $packageToIcons[$packageName][] = array('index' => $val['index'], 'filename' => implode('/', $folders));\r
- }\r
- }\r
- \r
- // copy icons\r
- foreach ($packageToIcons as $package => $icons) {\r
- // try to find package\r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_package\r
- WHERE package = ?\r
- AND standalone = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array(\r
- $package,\r
- 1\r
- ));\r
- while ($row = $statement->fetchArray()) {\r
- // get icon path\r
- $iconDir = FileUtil::getRealPath(WCF_DIR.$row['packageDir']).$iconsLocation;\r
- \r
- // create icon path\r
- if (!file_exists($iconDir)) {\r
- @mkdir($iconDir, 0777);\r
- @chmod($iconDir, 0777);\r
- }\r
- \r
- // copy icons\r
- foreach ($icons as $icon) {\r
- $iconsTar->extract($icon['index'], $iconDir.$icon['filename']);\r
- }\r
- }\r
- }\r
- \r
- // delete tmp file\r
- $iconsTar->close();\r
- @unlink($destination);\r
- }\r
- }\r
- \r
- // import templates\r
- if (!empty($data['templates'])) {\r
- $i = $tar->getIndexByFilename($data['templates']);\r
- if ($i !== false) {\r
- // extract templates tar\r
- $destination = FileUtil::getTemporaryFilename('templates_');\r
- $tar->extract($i, $destination);\r
- \r
- // open templates tar and group templates by package\r
- $templatesTar = new Tar($destination);\r
- $contentList = $templatesTar->getContentList();\r
- $packageToTemplates = array();\r
- foreach ($contentList as $key => $val) {\r
- if ($val['type'] == 'file') {\r
- $folders = explode('/', $val['filename']);\r
- $packageName = array_shift($folders);\r
- if (!isset($packageToTemplates[$packageName])) {\r
- $packageToTemplates[$packageName] = array();\r
- }\r
- $packageToTemplates[$packageName][] = array('index' => $val['index'], 'filename' => implode('/', $folders));\r
- }\r
- }\r
- \r
- // copy templates\r
- foreach ($packageToTemplates as $package => $templates) {\r
- // try to find package\r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_package\r
- WHERE package = ?\r
- AND standalone = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array(\r
- $package,\r
- 1\r
- ));\r
- while ($row = $statement->fetchArray()) {\r
- // get icon path\r
- $templatesDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR.$row['packageDir']).'templates/'.$templateGroupFolderName);\r
- \r
- // create template path\r
- if (!file_exists($templatesDir)) {\r
- @mkdir($templatesDir, 0777);\r
- @chmod($templatesDir, 0777);\r
- }\r
- \r
- // copy templates\r
- foreach ($templates as $template) {\r
- $templatesTar->extract($template['index'], $templatesDir.$template['filename']);\r
- \r
- TemplateEditor::create(array(\r
- 'packageID' => $row['packageID'],\r
- 'templateName' => StringUtil::replace('.tpl', '', $template['filename']),\r
- 'templateGroupID' => $templateGroupID\r
- ));\r
- }\r
- }\r
- }\r
- \r
- // delete tmp file\r
- $templatesTar->close();\r
- @unlink($destination);\r
- }\r
- }\r
-\r
- $tar->close();\r
- \r
- return $style;\r
- }\r
- \r
- /**\r
- * Exports this style.\r
- * \r
- * @param boolean $templates\r
- * @param boolean $images\r
- * @param boolean $icons\r
- */\r
- public function export($templates = false, $images = false, $icons = false) {\r
- // create style tar\r
- $styleTarName = FileUtil::getTemporaryFilename('style_', '.tgz');\r
- $styleTar = new TarWriter($styleTarName, true);\r
- \r
- // append style preview image\r
- if ($this->image && @file_exists(WCF_DIR.$this->image)) {\r
- $styleTar->add(WCF_DIR.$this->image, '', FileUtil::addTrailingSlash(dirname(WCF_DIR.$this->image)));\r
- }\r
- \r
- // create style info file\r
- $string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE style SYSTEM \"http://www.woltlab.com/DTDs/SXF/style.dtd\">\n<style>\n";\r
- \r
- // general block\r
- $string .= "\t<general>\n";\r
- $string .= "\t\t<stylename><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleName) : $this->styleName))."]]></stylename>\n"; // style name\r
- if ($this->styleDescription) $string .= "\t\t<description><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleDescription) : $this->styleDescription))."]]></description>\n"; // style description\r
- if ($this->styleVersion) $string .= "\t\t<version><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleVersion) : $this->styleVersion))."]]></version>\n"; // style version\r
- if ($this->styleDate) $string .= "\t\t<date><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleDate) : $this->styleDate))."]]></date>\n"; // style date\r
- if ($this->image) $string .= "\t\t<image><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', basename($this->image)) : basename($this->image)))."]]></image>\n"; // style preview image\r
- if ($this->copyright) $string .= "\t\t<copyright><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->copyright) : $this->copyright))."]]></copyright>\n"; // copyright\r
- if ($this->license) $string .= "\t\t<license><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->license) : $this->license))."]]></license>\n"; // license\r
- $string .= "\t</general>\n";\r
- \r
- // author block\r
- $string .= "\t<author>\n";\r
- if ($this->authorName) $string .= "\t\t<authorname><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->authorName) : $this->authorName))."]]></authorname>\n"; // author name\r
- if ($this->authorURL) $string .= "\t\t<authorurl><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->authorURL) : $this->authorURL))."]]></authorurl>\n"; // author URL\r
- $string .= "\t</author>\n";\r
- \r
- // files block\r
- $string .= "\t<files>\n";\r
- $string .= "\t\t<variables>variables.xml</variables>\n"; // variables\r
- if ($templates && $this->templateGroupID) $string .= "\t\t<templates>templates.tar</templates>\n"; // templates\r
- if ($images) $string .= "\t\t<images>images.tar</images>\n"; // images\r
- if ($icons) $string .= "\t\t<icons>icons.tar</icons>\n"; // icons\r
- $string .= "\t</files>\n";\r
- \r
- $string .= "</style>";\r
- // append style info file to style tar\r
- $styleTar->addString(self::INFO_FILE, $string);\r
- unset($string);\r
- \r
- // create variable list\r
- $string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE variables SYSTEM \"http://www.woltlab.com/DTDs/SXF/variables.dtd\">\n<variables>\n";\r
- // get variables\r
- $variables = $this->getVariables();\r
- $exportImages = array();\r
- foreach ($variables as $name => $value) {\r
- // search images\r
- if ($images && $value) {\r
- if (preg_match_all('~([^/\s\$]+\.(?:gif|jpg|jpeg|png))~i', $value, $matches)) {\r
- $exportImages = array_merge($exportImages, $matches[1]);\r
- }\r
- }\r
- $string .= "\t<variable name=\"".StringUtil::encodeHTML($name)."\"><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $value) : $value))."]]></variable>\n";\r
- }\r
- \r
- $string .= "</variables>";\r
- // append variable list to style tar\r
- $styleTar->addString('variables.xml', $string);\r
- unset($string);\r
-\r
- if ($templates && $this->templateGroupID) {\r
- $templateGroup = new TemplateGroup($this->templateGroupID);\r
- \r
- // create templates tar\r
- $templatesTarName = FileUtil::getTemporaryFilename('templates', '.tar');\r
- $templatesTar = new TarWriter($templatesTarName);\r
- @chmod($templatesTarName, 0777);\r
- \r
- // append templates to tar\r
- // get templates\r
- $sql = "SELECT template.*, package.package, package.packageDir,\r
- parent_package.package AS parentPackage, parent_package.packageDir AS parentPackageDir\r
- FROM wcf".WCF_N."_template template\r
- LEFT JOIN wcf".WCF_N."_package package\r
- ON (package.packageID = template.packageID)\r
- LEFT JOIN wcf".WCF_N."_package parent_package\r
- ON (parent_package.packageID = package.parentPackageID)\r
- WHERE template.templateGroupID = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($this->templateGroupID));\r
- while ($row = $statement->fetchArray()) {\r
- $packageDir = 'com.woltlab.wcf';\r
- if (!empty($row['parentPackageDir'])) $packageDir = $row['parentPackage'];\r
- else if (!empty($row['packageDir'])) $packageDir = $row['package'];\r
- \r
- $filename = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR . $row['packageDir'] . 'templates/' . $templateGroup->templateGroupFolderName)) . $row['templateName'] . '.tpl';\r
- $templatesTar->add($filename, $packageDir, dirname($filename));\r
- }\r
- \r
- // append templates tar to style tar\r
- $templatesTar->create();\r
- $styleTar->add($templatesTarName, 'templates.tar', $templatesTarName);\r
- @unlink($templatesTarName);\r
- }\r
-\r
- if ($images) {\r
- // create images tar\r
- $imagesTarName = FileUtil::getTemporaryFilename('images_', '.tar');\r
- $imagesTar = new TarWriter($imagesTarName);\r
- @chmod($imagesTarName, 0777);\r
- \r
- // cache rtl versions\r
- foreach ($exportImages as $exportImage) {\r
- if (strpos($exportImage, '-ltr')) $exportImages[] = str_replace('-ltr', '-rtl', $exportImage);\r
- }\r
- \r
- // append images to tar\r
- $path = WCF_DIR.$variables['global.images.location'];\r
- if (file_exists($path) && is_dir($path)) {\r
- $handle = opendir($path);\r
- \r
- while (($file = readdir($handle)) !== false) {\r
- if (is_file($path.$file) && in_array($file, $exportImages)) {\r
- $imagesTar->add($path.$file, '', $path);\r
- }\r
- }\r
- }\r
- \r
- // append images tar to style tar\r
- $imagesTar->create();\r
- $styleTar->add($imagesTarName, 'images.tar', $imagesTarName);\r
- @unlink($imagesTarName);\r
- }\r
- \r
- // export icons\r
- $iconsLocation = FileUtil::addTrailingSlash($variables['global.icons.location']);\r
- if ($icons && $iconsLocation != 'icon/') {\r
- // create icons tar\r
- $iconsTarName = FileUtil::getTemporaryFilename('icons_', '.tar');\r
- $iconsTar = new TarWriter($iconsTarName);\r
- @chmod($iconsTar, 0777);\r
- \r
- // get package dirs\r
- $sql = "SELECT package, packageDir\r
- FROM wcf".WCF_N."_package\r
- WHERE standalone = 1\r
- AND (packageDir <> '' OR package = 'com.woltlab.wcf')";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- while ($row = $statement->fetchArray()) {\r
- $iconsDir = FileUtil::getRealPath(WCF_DIR.$row['packageDir']).$iconsLocation;\r
- $packageIcons = array();\r
- if (file_exists($iconsDir)) {\r
- $icons = glob($iconsDir.'*.png');\r
- if (is_array($icons)) {\r
- foreach ($icons as $icon) {\r
- $packageIcons[] = $icon;\r
- }\r
- }\r
- }\r
- \r
- if (count($packageIcons)) {\r
- $iconsTar->add($packageIcons, $row['package'].'/', $iconsDir);\r
- }\r
- }\r
- \r
- $iconsTar->create();\r
- $styleTar->add($iconsTarName, 'icons.tar', $iconsTarName);\r
- @unlink($iconsTarName);\r
- }\r
- \r
- // output file content\r
- $styleTar->create();\r
- readfile($styleTarName);\r
- @unlink($styleTarName);\r
- }\r
- \r
- /**\r
- * Sets the variables of a style.\r
- */\r
- public function setVariables($variables) {\r
- // delete old variables\r
- $sql = "DELETE FROM wcf".WCF_N."_style_variable\r
- WHERE styleID = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($this->styleID));\r
- \r
- // insert new variables\r
- $statementParameters = array();\r
- foreach ($variables as $name => $value) {\r
- $statementParameters[] = array(\r
- 'name' => $name,\r
- 'value' => $value\r
- );\r
- }\r
- \r
- if (count($statementParameters)) {\r
- $sql = "INSERT INTO wcf".WCF_N."_style_variable\r
- (styleID, variableName, variableValue)\r
- VALUES (?, ?, ?)";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- \r
- foreach ($statementParameters as $parameter) {\r
- $statement->execute(array(\r
- $this->styleID,\r
- $parameter['name'],\r
- $parameter['value']\r
- ));\r
- }\r
- }\r
- \r
- $this->writeStyleFile();\r
- }\r
- \r
- /**\r
- * Writes the style-*.css file.\r
- */\r
- public function writeStyleFile() {\r
- // get variables\r
- $variables = $this->getVariables();\r
- \r
- // parse additional styles\r
- self::parseAdditionalStyles($variables);\r
- \r
- // get file handle\r
- $file = new File(WCF_DIR . 'style/style-'.$this->styleID.'.css', 'wb');\r
- \r
- // include static styles\r
- $staticStyles = glob(WCF_DIR.'style/*.css');\r
- if ($staticStyles) {\r
- foreach ($staticStyles as $staticStyle) {\r
- if (!preg_match('/style-\d+(?:-rtl)?\.css/', $staticStyle)) {\r
- $contents = file_get_contents($staticStyle);\r
- $contents = StyleUtil::compressCSS($contents);\r
- $file->write("/* static: ".basename($staticStyle)." */\n");\r
- $file->write(StringUtil::trim($contents)."\n");\r
- }\r
- }\r
- }\r
- \r
- // get attributes\r
- $file->write("/* dynamic style attributes */\n");\r
- $sortedAttributes = array();\r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_style_variable_to_attribute\r
- ORDER BY variableName, attributeName, cssSelector";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- while ($row = $statement->fetchArray()) {\r
- if (!empty($variables[$row['variableName']])) {\r
- if (!isset($sortedAttributes[$row['variableName']])) $sortedAttributes[$row['variableName']] = array();\r
- if (!isset($sortedAttributes[$row['variableName']][$row['attributeName']])) $sortedAttributes[$row['variableName']][$row['attributeName']] = array();\r
- $sortedAttributes[$row['variableName']][$row['attributeName']][] = $row['cssSelector'];\r
- }\r
- }\r
- \r
- foreach ($sortedAttributes as $variableName => $attributes) {\r
- foreach ($attributes as $attributeName => $cssSelectors) {\r
- $count = 0;\r
- \r
- // write selectors\r
- $css1Selectors = $css2Selectors = array();\r
- foreach ($cssSelectors as $cssSelector) {\r
- if (empty($cssSelector)) {\r
- $file->write("/* ".$variableName." */\n");\r
- $file->write(StyleUtil::compressCSS($variables[$variableName]));\r
- $file->write("\n");\r
- }\r
- else {\r
- if (preg_match('/^[a-z0-9.#:_\s-*]+$/i', $cssSelector)) {\r
- $css1Selectors[] = $cssSelector;\r
- }\r
- else {\r
- $css2Selectors[] = $cssSelector;\r
- }\r
- }\r
- }\r
- \r
- if (count($css1Selectors)) {\r
- $file->write(implode(',', $css1Selectors));\r
- \r
- $file->write("{");\r
- \r
- // write attribute\r
- if (!empty($attributeName)) $file->write($attributeName .":");\r
- \r
- // write value\r
- $file->write($variables[$variableName]);\r
- \r
- $file->write("}\n");\r
- }\r
- \r
- if (count($css2Selectors)) {\r
- $file->write(implode(',', $css2Selectors));\r
- \r
- $file->write("{");\r
- \r
- // write attribute\r
- if (!empty($attributeName)) $file->write($attributeName .":");\r
- \r
- // write value\r
- $file->write($variables[$variableName]);\r
- \r
- $file->write("}\n");\r
- }\r
- }\r
- }\r
- \r
- // close file\r
- $file->close();\r
- @chmod(WCF_DIR . 'style/style-'.$this->styleID.'.css', 0777);\r
- $this->writeStyleFileRTL();\r
- }\r
- \r
- /**\r
- * Converts the file of this style to a RTL ("right-to-left") version. \r
- */\r
- public function writeStyleFileRTL() {\r
- // get contents of LTR version\r
- $contents = file_get_contents(WCF_DIR . 'style/style-'.$this->styleID.'.css');\r
- \r
- // convert ltr to rtl\r
- $contents = StyleUtil::convertCSSToRTL($contents);\r
- \r
- // write file\r
- $file = new File(WCF_DIR . 'style/style-'.$this->styleID.'-rtl.css');\r
- $file->write($contents);\r
- $file->close();\r
- @chmod(WCF_DIR . 'style/style-'.$this->styleID.'-rtl.css', 0777);\r
- }\r
- \r
- /**\r
- * @see wcf\data\IEditableObject::create()\r
- */\r
- public static function create(array $parameters = array()) {\r
- $variables = null;\r
- if (isset($parameters['variables'])) {\r
- $variables = $parameters['variables'];\r
- unset($parameters['variables']);\r
- }\r
- \r
- // default values\r
- if (!isset($parameters['packageID'])) $parameters['packageID'] = PACKAGE_ID;\r
- if (!isset($parameters['styleDate'])) $parameters['styleDate'] = gmdate('Y-m-d', TIME_NOW);\r
- \r
- // save style\r
- $style = parent::create($parameters); \r
- $styleEditor = new StyleEditor($style);\r
- \r
- // save variables\r
- if ($variables !== null) {\r
- $styleEditor->setVariables($variables);\r
- }\r
- \r
- // scale preview image\r
- if (!empty($parameters['image'])) {\r
- self::scalePreviewImage(WCF_DIR.$parameters['image']);\r
- }\r
- \r
- return $style;\r
- }\r
- \r
- /**\r
- * @see IEditableCachedObject::resetCache()\r
- */\r
- public static function resetCache() {\r
- WCF::getCache()->clear(WCF_DIR.'cache', 'cache.icon-*-'.$this->styleID.'.php');\r
- }\r
- \r
- /**\r
- * Scales the style preview image.\r
- * \r
- * @param string $filename\r
- * @return boolean\r
- */\r
- public static function scalePreviewImage($filename) {\r
- $thumbnail = new Thumbnail($filename, self::STYLE_PREVIEW_IMAGE_MAX_WIDTH, self::STYLE_PREVIEW_IMAGE_MAX_HEIGHT);\r
- if (($source = $thumbnail->makeThumbnail())) {\r
- $file = new File($filename);\r
- $file->write($source);\r
- $file->close();\r
- \r
- return true;\r
- }\r
- \r
- return false;\r
- }\r
- \r
- private static $variables = array();\r
- private static function parseAdditionalStyles(&$variables) {\r
- self::$variables = $variables;\r
- // fix images location\r
- if (!empty(self::$variables['global.images.location']) && !FileUtil::isURL(self::$variables['global.images.location']) && substr(self::$variables['global.images.location'], 0, 1) != '/') {\r
- self::$variables['global.images.location'] = '../'.self::$variables['global.images.location'];\r
- }\r
- // fix images location\r
- if (!empty(self::$variables['global.icons.location']) && !FileUtil::isURL(self::$variables['global.icons.location']) && substr(self::$variables['global.icons.location'], 0, 1) != '/') {\r
- self::$variables['global.icons.location'] = '../'.self::$variables['global.icons.location'];\r
- }\r
- \r
- // parse additional styles\r
- if (!empty($variables['user.additional.style.input1.use'])) {\r
- $variables['user.additional.style.input1.use'] = preg_replace_callback('/\$([a-z0-9_\-\.]+)\$/', array('self', 'parseAdditionalStylesCallback'), $variables['user.additional.style.input1.use']);\r
- }\r
- if (!empty($variables['user.additional.style.input2.use'])) {\r
- $variables['user.additional.style.input2.use'] = preg_replace_callback('/\$([a-z0-9_\-\.]+)\$/', array('self', 'parseAdditionalStylesCallback'), $variables['user.additional.style.input2.use']);\r
- }\r
- }\r
- \r
- private static function parseAdditionalStylesCallback($match) {\r
- if (isset(self::$variables[$match[1]])) {\r
- return self::$variables[$match[1]];\r
- }\r
- else {\r
- return $match[0];\r
- }\r
- }\r
+<?php
+namespace wcf\data\style;
+use wcf\data\template\group\TemplateGroupEditor;
+use wcf\data\template\TemplateEditor;
+use wcf\data\DatabaseObjectEditor;
+use wcf\data\IEditableCachedObject;
+use wcf\system\exception\SystemException;
+use wcf\system\image\Thumbnail;
+use wcf\system\io\File;
+use wcf\system\io\Tar;
+use wcf\system\io\TarWriter;
+use wcf\system\WCF;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+use wcf\util\XML;
+
+/**
+ * Provides functions to edit, import, export and delete a style.
+ *
+ * @todo Fix usage of XML-class (API-changes)!
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.style
+ * @category Community Framework
+ */
+class StyleEditor extends DatabaseObjectEditor implements IEditableCachedObject {
+ const INFO_FILE = 'style.xml';
+ const STYLE_PREVIEW_IMAGE_MAX_WIDTH = 185;
+ const STYLE_PREVIEW_IMAGE_MAX_HEIGHT = 140;
+
+ /**
+ * @see DatabaseObjectDecorator::$baseClass
+ */
+ protected static $baseClass = 'wcf\data\style\Style';
+
+ /**
+ * @see wcf\data\IEditableObject::update()
+ */
+ public function update(array $parameters = array()) {
+ $variables = null;
+ if (isset($parameters['variables'])) {
+ $variables = $parameters['variables'];
+ unset($parameters['variables']);
+ }
+
+ // update style data
+ parent::update($parameters);
+
+ // update variables
+ if ($variables !== null) {
+ $this->setVariables($variables);
+ }
+
+ // scale preview image
+ if (!empty($parameters['image']) && $parameters['image'] != $this->image) {
+ self::scalePreviewImage(WCF_DIR.$parameters['image']);
+ }
+ }
+
+ /**
+ * @see wcf\data\IEditableObject::delete()
+ */
+ public function delete() {
+ parent::delete();
+
+ // delete variables
+ $sql = "DELETE FROM wcf".WCF_N."_style_variable
+ WHERE styleID = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($this->styleID));
+
+ // delete style to package
+ $sql = "DELETE FROM wcf".WCF_N."_style_to_package
+ WHERE styleID = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($this->styleID));
+
+ // delete style files
+ @unlink(WCF_DIR.'style/style-'.$this->styleID.'.css');
+ @unlink(WCF_DIR.'style/style-'.$this->styleID.'-rtl.css');
+
+ // delete preview image
+ if ($this->image) {
+ @unlink(WCF_DIR.$this->image);
+ }
+ }
+
+ /**
+ * Sets this style as default style.
+ */
+ public function setAsDefault() {
+ // remove old default
+ $sql = "UPDATE wcf".WCF_N."_style
+ SET isDefault = ?
+ WHERE isDefault = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array(0, 1));
+
+ // set new default
+ $this->update(array(
+ 'isDefault' => 1,
+ 'disabled' => 0
+ ));
+ }
+
+ /**
+ * Reads the data of a style exchange format file.
+ *
+ * @param Tar $tar
+ * @return array data
+ */
+ public static function readStyleData(Tar $tar) {
+ // search style.xml
+ $i = $tar->getIndexByFilename(self::INFO_FILE);
+ if ($i === false) {
+ throw new SystemException("unable to find required file '".self::INFO_FILE."' in style archive", 100001);
+ }
+
+ // open style.xml
+ $styleXML = new XML();
+ $styleXML->loadString($tar->extractToString($i));
+ $xmlContent = $styleXML->getElementTree('style');
+ $data = array(
+ 'name' => '', 'description' => '', 'version' => '', 'image' => '', 'copyright' => '',
+ 'license' => '', 'authorName' => '', 'authorURL' => '', 'templates' => '', 'images' => '',
+ 'variables' => '', 'date' => '0000-00-00', 'icons' => ''
+ );
+
+ foreach ($xmlContent['children'] as $child) {
+ switch ($child['name']) {
+ case 'general':
+ foreach ($child['children'] as $general) {
+ switch ($general['name']) {
+ case 'stylename': $data['name'] = $general['cdata']; break;
+ case 'description': case 'version': case 'date':
+ case 'image': case 'copyright': case 'license': $data[$general['name']] = $general['cdata']; break;
+ }
+ }
+ break;
+
+ case 'author':
+ foreach ($child['children'] as $author) {
+ switch ($author['name']) {
+ case 'authorname': $data['authorName'] = $author['cdata']; break;
+ case 'authorurl': $data['authorURL'] = $author['cdata']; break;
+ }
+ }
+ break;
+
+ case 'files':
+ foreach ($child['children'] as $files) {
+ switch ($files['name']) {
+ case 'templates': case 'images': case 'variables': case 'icons': $data[$files['name']] = $files['cdata']; break;
+ }
+ }
+ break;
+ }
+ }
+
+ if (empty($data['name'])) {
+ throw new SystemException("required tag 'stylename' is missing in '".self::INFO_FILE."'", 100002);
+ }
+ if (empty($data['variables'])) {
+ throw new SystemException("required tag 'variables' is missing in '".self::INFO_FILE."'", 100002);
+ }
+
+ // search variables.xml
+ $i = $tar->getIndexByFilename($data['variables']);
+ if ($i === false) {
+ throw new SystemException("unable to find required file '".$data['variables']."' in style archive", 100001);
+ }
+
+ // open variables.xml
+ $data['variables'] = self::readVariablesData($tar->extractToString($i));
+
+ return $data;
+ }
+
+ /**
+ * Reads the data of a variables.xml file.
+ *
+ * @param string $string contents of a variable.xml file
+ * @return array data
+ */
+ public static function readVariablesData($string) {
+ // open variables.xml
+ $variablesXML = new XML();
+ $variablesXML->loadString($string);
+ $variablesXMLContent = $variablesXML->getElementTree('variables');
+
+ // get variables
+ $variables = array();
+ foreach ($variablesXMLContent['children'] as $variable) {
+ if (isset($variable['attrs']['name'])) {
+ $variables[$variable['attrs']['name']] = $variable['cdata'];
+ }
+ }
+
+ return $variables;
+ }
+
+ /**
+ * Gets the data of a style exchange format file.
+ *
+ * @param string $filename
+ * @return array data
+ */
+ public static function getStyleData($filename) {
+ // open file
+ $tar = new Tar($filename);
+
+ // get style data
+ $data = self::readStyleData($tar);
+
+ // export preview image to temporary location
+ if (!empty($data['image'])) {
+ $i = $tar->getIndexByFilename($data['image']);
+ if ($i !== false) {
+ $path = FileUtil::getTemporaryFilename('stylePreview_', $data['image'], WCF_DIR.'tmp/');
+ $data['image'] = basename($path);
+ $tar->extract($i, $path);
+ }
+ }
+
+ $tar->close();
+
+ return $data;
+ }
+
+ /**
+ * Imports a style.
+ *
+ * @param string $filename
+ * @param integer $packageID
+ * @param StyleEditor $style
+ * @return StyleEditor
+ */
+ public static function import($filename, $packageID = PACKAGE_ID, StyleEditor $style = null) {
+ // open file
+ $tar = new Tar($filename);
+
+ // get style data
+ $data = self::readStyleData($tar);
+
+ // get image locations
+ $iconsLocation = FileUtil::addTrailingSlash($data['variables']['global.icons.location']);
+ $imagesLocation = $data['variables']['global.images.location'];
+
+ // create template group
+ $templateGroupID = 0;
+ if (!empty($data['templates'])) {
+ $originalTemplateGroupName = $templateGroupName = $data['name'];
+ $templateGroupFolderName = preg_replace('/[^a-z0-9_-]/i', '', $templateGroupName);
+ if (empty($templateGroupFolderName)) $templateGroupFolderName = 'generic'.StringUtil::substring(StringUtil::getRandomID(), 0, 8);
+ $originalTemplatePackFolderName = $templateGroupFolderName;
+
+ // get unique template pack name
+ $i = 1;
+ do {
+ $sql = "SELECT COUNT(*) AS count
+ FROM wcf".WCF_N."_template_group
+ WHERE templateGroupName = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($templateGroupName));
+ $row = $statement->fetchArray();
+ if (!$row['count']) break;
+ $templateGroupName = $originalTemplatePackName . '_' . $i;
+ $i++;
+ }
+ while (true);
+ // get unique folder name
+ $i = 1;
+ do {
+ $sql = "SELECT COUNT(*) AS count
+ FROM wcf".WCF_N."_template_group
+ WHERE templateGroupFolderName = ?
+ AND parentTemplatePackID = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array(
+ FileUtil::addTrailingSlash($templateGroupFolderName),
+ 0
+ ));
+ $row = $statement->fetchArray();
+ if (!$row['count']) break;
+ $templateGroupFolderName = $originalTemplatePackFolderName . '_' . $i;
+ $i++;
+ }
+ while (true);
+
+ $templateGroup = TemplateGroupEditor::create(array(
+ 'templateGroupName' => $templateGroupName,
+ 'templateGroupFolderName' => FileUtil::addTrailingSlash($templateGroupFolderName)
+ ));
+ $templateGroupID = $templateGroup->templateGroupID;
+ }
+
+ // save style
+ $styleData = array(
+ 'styleName' => $data['name'],
+ 'variables' => $data['variables'],
+ 'templateGroupID' => $templateGroupID,
+ 'styleDescription' => $data['description'],
+ 'styleVersion' => $data['version'],
+ 'styleDate' => $data['date'],
+ 'image' => ($data['image'] ? 'images/' : '').$data['image'],
+ 'copyright' => $data['copyright'],
+ 'license' => $data['license'],
+ 'authorName' => $data['authorName'],
+ 'authorURL' => $data['authorURL']
+ );
+ if ($style !== null) {
+ $style->update($styleData);
+ }
+ else {
+ $styleData['packageID'] = $packageID;
+ $style = self::create($styleData);
+ }
+
+ // import preview image
+ if (!empty($data['image'])) {
+ $i = $tar->getIndexByFilename($data['image']);
+ if ($i !== false) {
+ $tar->extract($i, WCF_DIR.'images/'.$data['image']);
+ @chmod(WCF_DIR.'images/'.$data['image'], 0777);
+ }
+ }
+
+ // import images
+ if (!empty($data['images'])) {
+ // create images folder if necessary
+ if (!file_exists(WCF_DIR.$imagesLocation)) {
+ @mkdir(WCF_DIR.$data['variables']['global.images.location'], 0777);
+ @chmod(WCF_DIR.$data['variables']['global.images.location'], 0777);
+ }
+
+ $i = $tar->getIndexByFilename($data['images']);
+ if ($i !== false) {
+ // extract images tar
+ $destination = FileUtil::getTemporaryFilename('images_');
+ $tar->extract($i, $destination);
+
+ // open images tar
+ $imagesTar = new Tar($destination);
+ $contentList = $imagesTar->getContentList();
+ foreach ($contentList as $key => $val) {
+ if ($val['type'] == 'file') {
+ $imagesTar->extract($key, WCF_DIR.$imagesLocation.basename($val['filename']));
+ @chmod(WCF_DIR.$imagesLocation.basename($val['filename']), 0666);
+ }
+ }
+
+ // delete tmp file
+ $imagesTar->close();
+ @unlink($destination);
+ }
+ }
+
+ // import icons
+ if (!empty($data['icons']) && $iconsLocation != 'icon/') {
+ $i = $tar->getIndexByFilename($data['icons']);
+ if ($i !== false) {
+ // extract icons tar
+ $destination = FileUtil::getTemporaryFilename('icons_');
+ $tar->extract($i, $destination);
+
+ // open icons tar and group icons by package
+ $iconsTar = new Tar($destination);
+ $contentList = $iconsTar->getContentList();
+ $packageToIcons = array();
+ foreach ($contentList as $key => $val) {
+ if ($val['type'] == 'file') {
+ $folders = explode('/', $val['filename']);
+ $packageName = array_shift($folders);
+ if (!isset($packageToIcons[$packageName])) {
+ $packageToIcons[$packageName] = array();
+ }
+ $packageToIcons[$packageName][] = array('index' => $val['index'], 'filename' => implode('/', $folders));
+ }
+ }
+
+ // copy icons
+ foreach ($packageToIcons as $package => $icons) {
+ // try to find package
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_package
+ WHERE package = ?
+ AND standalone = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array(
+ $package,
+ 1
+ ));
+ while ($row = $statement->fetchArray()) {
+ // get icon path
+ $iconDir = FileUtil::getRealPath(WCF_DIR.$row['packageDir']).$iconsLocation;
+
+ // create icon path
+ if (!file_exists($iconDir)) {
+ @mkdir($iconDir, 0777);
+ @chmod($iconDir, 0777);
+ }
+
+ // copy icons
+ foreach ($icons as $icon) {
+ $iconsTar->extract($icon['index'], $iconDir.$icon['filename']);
+ }
+ }
+ }
+
+ // delete tmp file
+ $iconsTar->close();
+ @unlink($destination);
+ }
+ }
+
+ // import templates
+ if (!empty($data['templates'])) {
+ $i = $tar->getIndexByFilename($data['templates']);
+ if ($i !== false) {
+ // extract templates tar
+ $destination = FileUtil::getTemporaryFilename('templates_');
+ $tar->extract($i, $destination);
+
+ // open templates tar and group templates by package
+ $templatesTar = new Tar($destination);
+ $contentList = $templatesTar->getContentList();
+ $packageToTemplates = array();
+ foreach ($contentList as $key => $val) {
+ if ($val['type'] == 'file') {
+ $folders = explode('/', $val['filename']);
+ $packageName = array_shift($folders);
+ if (!isset($packageToTemplates[$packageName])) {
+ $packageToTemplates[$packageName] = array();
+ }
+ $packageToTemplates[$packageName][] = array('index' => $val['index'], 'filename' => implode('/', $folders));
+ }
+ }
+
+ // copy templates
+ foreach ($packageToTemplates as $package => $templates) {
+ // try to find package
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_package
+ WHERE package = ?
+ AND standalone = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array(
+ $package,
+ 1
+ ));
+ while ($row = $statement->fetchArray()) {
+ // get icon path
+ $templatesDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR.$row['packageDir']).'templates/'.$templateGroupFolderName);
+
+ // create template path
+ if (!file_exists($templatesDir)) {
+ @mkdir($templatesDir, 0777);
+ @chmod($templatesDir, 0777);
+ }
+
+ // copy templates
+ foreach ($templates as $template) {
+ $templatesTar->extract($template['index'], $templatesDir.$template['filename']);
+
+ TemplateEditor::create(array(
+ 'packageID' => $row['packageID'],
+ 'templateName' => StringUtil::replace('.tpl', '', $template['filename']),
+ 'templateGroupID' => $templateGroupID
+ ));
+ }
+ }
+ }
+
+ // delete tmp file
+ $templatesTar->close();
+ @unlink($destination);
+ }
+ }
+
+ $tar->close();
+
+ return $style;
+ }
+
+ /**
+ * Exports this style.
+ *
+ * @param boolean $templates
+ * @param boolean $images
+ * @param boolean $icons
+ */
+ public function export($templates = false, $images = false, $icons = false) {
+ // create style tar
+ $styleTarName = FileUtil::getTemporaryFilename('style_', '.tgz');
+ $styleTar = new TarWriter($styleTarName, true);
+
+ // append style preview image
+ if ($this->image && @file_exists(WCF_DIR.$this->image)) {
+ $styleTar->add(WCF_DIR.$this->image, '', FileUtil::addTrailingSlash(dirname(WCF_DIR.$this->image)));
+ }
+
+ // create style info file
+ $string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE style SYSTEM \"http://www.woltlab.com/DTDs/SXF/style.dtd\">\n<style>\n";
+
+ // general block
+ $string .= "\t<general>\n";
+ $string .= "\t\t<stylename><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleName) : $this->styleName))."]]></stylename>\n"; // style name
+ if ($this->styleDescription) $string .= "\t\t<description><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleDescription) : $this->styleDescription))."]]></description>\n"; // style description
+ if ($this->styleVersion) $string .= "\t\t<version><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleVersion) : $this->styleVersion))."]]></version>\n"; // style version
+ if ($this->styleDate) $string .= "\t\t<date><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->styleDate) : $this->styleDate))."]]></date>\n"; // style date
+ if ($this->image) $string .= "\t\t<image><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', basename($this->image)) : basename($this->image)))."]]></image>\n"; // style preview image
+ if ($this->copyright) $string .= "\t\t<copyright><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->copyright) : $this->copyright))."]]></copyright>\n"; // copyright
+ if ($this->license) $string .= "\t\t<license><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->license) : $this->license))."]]></license>\n"; // license
+ $string .= "\t</general>\n";
+
+ // author block
+ $string .= "\t<author>\n";
+ if ($this->authorName) $string .= "\t\t<authorname><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->authorName) : $this->authorName))."]]></authorname>\n"; // author name
+ if ($this->authorURL) $string .= "\t\t<authorurl><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $this->authorURL) : $this->authorURL))."]]></authorurl>\n"; // author URL
+ $string .= "\t</author>\n";
+
+ // files block
+ $string .= "\t<files>\n";
+ $string .= "\t\t<variables>variables.xml</variables>\n"; // variables
+ if ($templates && $this->templateGroupID) $string .= "\t\t<templates>templates.tar</templates>\n"; // templates
+ if ($images) $string .= "\t\t<images>images.tar</images>\n"; // images
+ if ($icons) $string .= "\t\t<icons>icons.tar</icons>\n"; // icons
+ $string .= "\t</files>\n";
+
+ $string .= "</style>";
+ // append style info file to style tar
+ $styleTar->addString(self::INFO_FILE, $string);
+ unset($string);
+
+ // create variable list
+ $string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE variables SYSTEM \"http://www.woltlab.com/DTDs/SXF/variables.dtd\">\n<variables>\n";
+ // get variables
+ $variables = $this->getVariables();
+ $exportImages = array();
+ foreach ($variables as $name => $value) {
+ // search images
+ if ($images && $value) {
+ if (preg_match_all('~([^/\s\$]+\.(?:gif|jpg|jpeg|png))~i', $value, $matches)) {
+ $exportImages = array_merge($exportImages, $matches[1]);
+ }
+ }
+ $string .= "\t<variable name=\"".StringUtil::encodeHTML($name)."\"><![CDATA[".StringUtil::escapeCDATA((CHARSET != 'UTF-8' ? StringUtil::convertEncoding(CHARSET, 'UTF-8', $value) : $value))."]]></variable>\n";
+ }
+
+ $string .= "</variables>";
+ // append variable list to style tar
+ $styleTar->addString('variables.xml', $string);
+ unset($string);
+
+ if ($templates && $this->templateGroupID) {
+ $templateGroup = new TemplateGroup($this->templateGroupID);
+
+ // create templates tar
+ $templatesTarName = FileUtil::getTemporaryFilename('templates', '.tar');
+ $templatesTar = new TarWriter($templatesTarName);
+ @chmod($templatesTarName, 0777);
+
+ // append templates to tar
+ // get templates
+ $sql = "SELECT template.*, package.package, package.packageDir,
+ parent_package.package AS parentPackage, parent_package.packageDir AS parentPackageDir
+ FROM wcf".WCF_N."_template template
+ LEFT JOIN wcf".WCF_N."_package package
+ ON (package.packageID = template.packageID)
+ LEFT JOIN wcf".WCF_N."_package parent_package
+ ON (parent_package.packageID = package.parentPackageID)
+ WHERE template.templateGroupID = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($this->templateGroupID));
+ while ($row = $statement->fetchArray()) {
+ $packageDir = 'com.woltlab.wcf';
+ if (!empty($row['parentPackageDir'])) $packageDir = $row['parentPackage'];
+ else if (!empty($row['packageDir'])) $packageDir = $row['package'];
+
+ $filename = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR . $row['packageDir'] . 'templates/' . $templateGroup->templateGroupFolderName)) . $row['templateName'] . '.tpl';
+ $templatesTar->add($filename, $packageDir, dirname($filename));
+ }
+
+ // append templates tar to style tar
+ $templatesTar->create();
+ $styleTar->add($templatesTarName, 'templates.tar', $templatesTarName);
+ @unlink($templatesTarName);
+ }
+
+ if ($images) {
+ // create images tar
+ $imagesTarName = FileUtil::getTemporaryFilename('images_', '.tar');
+ $imagesTar = new TarWriter($imagesTarName);
+ @chmod($imagesTarName, 0777);
+
+ // cache rtl versions
+ foreach ($exportImages as $exportImage) {
+ if (strpos($exportImage, '-ltr')) $exportImages[] = str_replace('-ltr', '-rtl', $exportImage);
+ }
+
+ // append images to tar
+ $path = WCF_DIR.$variables['global.images.location'];
+ if (file_exists($path) && is_dir($path)) {
+ $handle = opendir($path);
+
+ while (($file = readdir($handle)) !== false) {
+ if (is_file($path.$file) && in_array($file, $exportImages)) {
+ $imagesTar->add($path.$file, '', $path);
+ }
+ }
+ }
+
+ // append images tar to style tar
+ $imagesTar->create();
+ $styleTar->add($imagesTarName, 'images.tar', $imagesTarName);
+ @unlink($imagesTarName);
+ }
+
+ // export icons
+ $iconsLocation = FileUtil::addTrailingSlash($variables['global.icons.location']);
+ if ($icons && $iconsLocation != 'icon/') {
+ // create icons tar
+ $iconsTarName = FileUtil::getTemporaryFilename('icons_', '.tar');
+ $iconsTar = new TarWriter($iconsTarName);
+ @chmod($iconsTar, 0777);
+
+ // get package dirs
+ $sql = "SELECT package, packageDir
+ FROM wcf".WCF_N."_package
+ WHERE standalone = 1
+ AND (packageDir <> '' OR package = 'com.woltlab.wcf')";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute();
+ while ($row = $statement->fetchArray()) {
+ $iconsDir = FileUtil::getRealPath(WCF_DIR.$row['packageDir']).$iconsLocation;
+ $packageIcons = array();
+ if (file_exists($iconsDir)) {
+ $icons = glob($iconsDir.'*.png');
+ if (is_array($icons)) {
+ foreach ($icons as $icon) {
+ $packageIcons[] = $icon;
+ }
+ }
+ }
+
+ if (count($packageIcons)) {
+ $iconsTar->add($packageIcons, $row['package'].'/', $iconsDir);
+ }
+ }
+
+ $iconsTar->create();
+ $styleTar->add($iconsTarName, 'icons.tar', $iconsTarName);
+ @unlink($iconsTarName);
+ }
+
+ // output file content
+ $styleTar->create();
+ readfile($styleTarName);
+ @unlink($styleTarName);
+ }
+
+ /**
+ * Sets the variables of a style.
+ */
+ public function setVariables($variables) {
+ // delete old variables
+ $sql = "DELETE FROM wcf".WCF_N."_style_variable
+ WHERE styleID = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($this->styleID));
+
+ // insert new variables
+ $statementParameters = array();
+ foreach ($variables as $name => $value) {
+ $statementParameters[] = array(
+ 'name' => $name,
+ 'value' => $value
+ );
+ }
+
+ if (count($statementParameters)) {
+ $sql = "INSERT INTO wcf".WCF_N."_style_variable
+ (styleID, variableName, variableValue)
+ VALUES (?, ?, ?)";
+ $statement = WCF::getDB()->prepareStatement($sql);
+
+ foreach ($statementParameters as $parameter) {
+ $statement->execute(array(
+ $this->styleID,
+ $parameter['name'],
+ $parameter['value']
+ ));
+ }
+ }
+
+ $this->writeStyleFile();
+ }
+
+ /**
+ * Writes the style-*.css file.
+ */
+ public function writeStyleFile() {
+ // get variables
+ $variables = $this->getVariables();
+
+ // parse additional styles
+ self::parseAdditionalStyles($variables);
+
+ // get file handle
+ $file = new File(WCF_DIR . 'style/style-'.$this->styleID.'.css', 'wb');
+
+ // include static styles
+ $staticStyles = glob(WCF_DIR.'style/*.css');
+ if ($staticStyles) {
+ foreach ($staticStyles as $staticStyle) {
+ if (!preg_match('/style-\d+(?:-rtl)?\.css/', $staticStyle)) {
+ $contents = file_get_contents($staticStyle);
+ $contents = StyleUtil::compressCSS($contents);
+ $file->write("/* static: ".basename($staticStyle)." */\n");
+ $file->write(StringUtil::trim($contents)."\n");
+ }
+ }
+ }
+
+ // get attributes
+ $file->write("/* dynamic style attributes */\n");
+ $sortedAttributes = array();
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_style_variable_to_attribute
+ ORDER BY variableName, attributeName, cssSelector";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute();
+ while ($row = $statement->fetchArray()) {
+ if (!empty($variables[$row['variableName']])) {
+ if (!isset($sortedAttributes[$row['variableName']])) $sortedAttributes[$row['variableName']] = array();
+ if (!isset($sortedAttributes[$row['variableName']][$row['attributeName']])) $sortedAttributes[$row['variableName']][$row['attributeName']] = array();
+ $sortedAttributes[$row['variableName']][$row['attributeName']][] = $row['cssSelector'];
+ }
+ }
+
+ foreach ($sortedAttributes as $variableName => $attributes) {
+ foreach ($attributes as $attributeName => $cssSelectors) {
+ $count = 0;
+
+ // write selectors
+ $css1Selectors = $css2Selectors = array();
+ foreach ($cssSelectors as $cssSelector) {
+ if (empty($cssSelector)) {
+ $file->write("/* ".$variableName." */\n");
+ $file->write(StyleUtil::compressCSS($variables[$variableName]));
+ $file->write("\n");
+ }
+ else {
+ if (preg_match('/^[a-z0-9.#:_\s-*]+$/i', $cssSelector)) {
+ $css1Selectors[] = $cssSelector;
+ }
+ else {
+ $css2Selectors[] = $cssSelector;
+ }
+ }
+ }
+
+ if (count($css1Selectors)) {
+ $file->write(implode(',', $css1Selectors));
+
+ $file->write("{");
+
+ // write attribute
+ if (!empty($attributeName)) $file->write($attributeName .":");
+
+ // write value
+ $file->write($variables[$variableName]);
+
+ $file->write("}\n");
+ }
+
+ if (count($css2Selectors)) {
+ $file->write(implode(',', $css2Selectors));
+
+ $file->write("{");
+
+ // write attribute
+ if (!empty($attributeName)) $file->write($attributeName .":");
+
+ // write value
+ $file->write($variables[$variableName]);
+
+ $file->write("}\n");
+ }
+ }
+ }
+
+ // close file
+ $file->close();
+ @chmod(WCF_DIR . 'style/style-'.$this->styleID.'.css', 0777);
+ $this->writeStyleFileRTL();
+ }
+
+ /**
+ * Converts the file of this style to a RTL ("right-to-left") version.
+ */
+ public function writeStyleFileRTL() {
+ // get contents of LTR version
+ $contents = file_get_contents(WCF_DIR . 'style/style-'.$this->styleID.'.css');
+
+ // convert ltr to rtl
+ $contents = StyleUtil::convertCSSToRTL($contents);
+
+ // write file
+ $file = new File(WCF_DIR . 'style/style-'.$this->styleID.'-rtl.css');
+ $file->write($contents);
+ $file->close();
+ @chmod(WCF_DIR . 'style/style-'.$this->styleID.'-rtl.css', 0777);
+ }
+
+ /**
+ * @see wcf\data\IEditableObject::create()
+ */
+ public static function create(array $parameters = array()) {
+ $variables = null;
+ if (isset($parameters['variables'])) {
+ $variables = $parameters['variables'];
+ unset($parameters['variables']);
+ }
+
+ // default values
+ if (!isset($parameters['packageID'])) $parameters['packageID'] = PACKAGE_ID;
+ if (!isset($parameters['styleDate'])) $parameters['styleDate'] = gmdate('Y-m-d', TIME_NOW);
+
+ // save style
+ $style = parent::create($parameters);
+ $styleEditor = new StyleEditor($style);
+
+ // save variables
+ if ($variables !== null) {
+ $styleEditor->setVariables($variables);
+ }
+
+ // scale preview image
+ if (!empty($parameters['image'])) {
+ self::scalePreviewImage(WCF_DIR.$parameters['image']);
+ }
+
+ return $style;
+ }
+
+ /**
+ * @see IEditableCachedObject::resetCache()
+ */
+ public static function resetCache() {
+ WCF::getCache()->clear(WCF_DIR.'cache', 'cache.icon-*-'.$this->styleID.'.php');
+ }
+
+ /**
+ * Scales the style preview image.
+ *
+ * @param string $filename
+ * @return boolean
+ */
+ public static function scalePreviewImage($filename) {
+ $thumbnail = new Thumbnail($filename, self::STYLE_PREVIEW_IMAGE_MAX_WIDTH, self::STYLE_PREVIEW_IMAGE_MAX_HEIGHT);
+ if (($source = $thumbnail->makeThumbnail())) {
+ $file = new File($filename);
+ $file->write($source);
+ $file->close();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ private static $variables = array();
+ private static function parseAdditionalStyles(&$variables) {
+ self::$variables = $variables;
+ // fix images location
+ if (!empty(self::$variables['global.images.location']) && !FileUtil::isURL(self::$variables['global.images.location']) && substr(self::$variables['global.images.location'], 0, 1) != '/') {
+ self::$variables['global.images.location'] = '../'.self::$variables['global.images.location'];
+ }
+ // fix images location
+ if (!empty(self::$variables['global.icons.location']) && !FileUtil::isURL(self::$variables['global.icons.location']) && substr(self::$variables['global.icons.location'], 0, 1) != '/') {
+ self::$variables['global.icons.location'] = '../'.self::$variables['global.icons.location'];
+ }
+
+ // parse additional styles
+ if (!empty($variables['user.additional.style.input1.use'])) {
+ $variables['user.additional.style.input1.use'] = preg_replace_callback('/\$([a-z0-9_\-\.]+)\$/', array('self', 'parseAdditionalStylesCallback'), $variables['user.additional.style.input1.use']);
+ }
+ if (!empty($variables['user.additional.style.input2.use'])) {
+ $variables['user.additional.style.input2.use'] = preg_replace_callback('/\$([a-z0-9_\-\.]+)\$/', array('self', 'parseAdditionalStylesCallback'), $variables['user.additional.style.input2.use']);
+ }
+ }
+
+ private static function parseAdditionalStylesCallback($match) {
+ if (isset(self::$variables[$match[1]])) {
+ return self::$variables[$match[1]];
+ }
+ else {
+ return $match[0];
+ }
+ }
}
-<?php\r
-namespace wcf\data\style;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of styles.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.style\r
- * @category Community Framework\r
- */\r
-class StyleList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\style\Style';\r
+<?php
+namespace wcf\data\style;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of styles.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.style
+ * @category Community Framework
+ */
+class StyleList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\style\Style';
}
-<?php\r
-namespace wcf\data\template;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes template-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2010 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.template\r
- * @category Community Framework\r
- */\r
-class TemplateAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\template\TemplateEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.template.canAddTemplate');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.template.canDeleteTemplate');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.template.canEditTemplate');\r
+<?php
+namespace wcf\data\template;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes template-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2010 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.template
+ * @category Community Framework
+ */
+class TemplateAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\template\TemplateEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.template.canAddTemplate');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.template.canDeleteTemplate');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.template.canEditTemplate');
}
-<?php\r
-namespace wcf\data\template;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of templates.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.template\r
- * @category Community Framework\r
- */\r
-class TemplateList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\template\Template';\r
+<?php
+namespace wcf\data\template;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of templates.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.template
+ * @category Community Framework
+ */
+class TemplateList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\template\Template';
}
-<?php\r
-namespace wcf\data\template\group;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-use wcf\system\exception\ValidateActionException;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Executes template group-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.template.group\r
- * @category Community Framework\r
- */\r
-class TemplateGroupAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\template\group\TemplateGroupEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.template.canAddTemplateGroup');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.template.canDeleteTemplateGroup');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.template.canEditTemplateGroup');\r
+<?php
+namespace wcf\data\template\group;
+use wcf\data\AbstractDatabaseObjectAction;
+use wcf\system\exception\ValidateActionException;
+use wcf\system\WCF;
+
+/**
+ * Executes template group-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.template.group
+ * @category Community Framework
+ */
+class TemplateGroupAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\template\group\TemplateGroupEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.template.canAddTemplateGroup');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.template.canDeleteTemplateGroup');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.template.canEditTemplateGroup');
}
-<?php\r
-namespace wcf\data\template\group;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of template groups.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.template.group\r
- * @category Community Framework\r
- */\r
-class TemplateGroupList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\template\group\TemplateGroup';\r
+<?php
+namespace wcf\data\template\group;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of template groups.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.template.group
+ * @category Community Framework
+ */
+class TemplateGroupList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\template\group\TemplateGroup';
}
-<?php\r
-namespace wcf\data\template\listener;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes template listener-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.template.listener\r
- * @category Community Framework\r
- */\r
-class TemplateListenerAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\template\listener\TemplateListenerEditor';\r
+<?php
+namespace wcf\data\template\listener;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes template listener-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.template.listener
+ * @category Community Framework
+ */
+class TemplateListenerAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\template\listener\TemplateListenerEditor';
}
-<?php\r
-namespace wcf\data\template\listener;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of template listener.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.template.listener\r
- * @category Community Framework\r
- */\r
-class TemplateListenerList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\template\listener\TemplateListener';\r
+<?php
+namespace wcf\data\template\listener;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of template listener.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.template.listener
+ * @category Community Framework
+ */
+class TemplateListenerList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\template\listener\TemplateListener';
}
-<?php\r
-namespace wcf\data\user;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of users.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user\r
- * @category Community Framework\r
- */\r
-class UserList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\user\User';\r
+<?php
+namespace wcf\data\user;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of users.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user
+ * @category Community Framework
+ */
+class UserList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\user\User';
}
-<?php\r
-namespace wcf\data\user\group;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user group-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2010 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.group\r
- * @category Community Framework\r
- */\r
-class UserGroupAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- public $className = 'wcf\data\user\group\UserGroupEditor';\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsCreate\r
- */\r
- protected $permissionsCreate = array('admin.user.canAddGroup');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsDelete\r
- */\r
- protected $permissionsDelete = array('admin.user.canDeleteGroup');\r
- \r
- /**\r
- * @see AbstractDatabaseObjectAction::$permissionsUpdate\r
- */\r
- protected $permissionsUpdate = array('admin.user.canEditGroup');\r
- \r
- /**\r
- * Creates a new group.\r
- * \r
- * @return UserGroup\r
- */\r
- public function create() {\r
- $group = parent::create();\r
- \r
- $groupEditor = new UserGroupEditor($group);\r
- $groupEditor->updateGroupOptions($this->parameters['options']);\r
- \r
- return $group;\r
- }\r
- \r
- /**\r
- * Updates groups.\r
- */\r
- public function update() {\r
- if (!count($this->objects)) {\r
- $this->readObjects();\r
- }\r
- \r
- foreach ($this->objects as $object) {\r
- $object->update($this->parameters['data']);\r
- $object->updateGroupOptions($this->parameters['options']);\r
- }\r
- }\r
+<?php
+namespace wcf\data\user\group;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user group-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2010 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.group
+ * @category Community Framework
+ */
+class UserGroupAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ public $className = 'wcf\data\user\group\UserGroupEditor';
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsCreate
+ */
+ protected $permissionsCreate = array('admin.user.canAddGroup');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsDelete
+ */
+ protected $permissionsDelete = array('admin.user.canDeleteGroup');
+
+ /**
+ * @see AbstractDatabaseObjectAction::$permissionsUpdate
+ */
+ protected $permissionsUpdate = array('admin.user.canEditGroup');
+
+ /**
+ * Creates a new group.
+ *
+ * @return UserGroup
+ */
+ public function create() {
+ $group = parent::create();
+
+ $groupEditor = new UserGroupEditor($group);
+ $groupEditor->updateGroupOptions($this->parameters['options']);
+
+ return $group;
+ }
+
+ /**
+ * Updates groups.
+ */
+ public function update() {
+ if (!count($this->objects)) {
+ $this->readObjects();
+ }
+
+ foreach ($this->objects as $object) {
+ $object->update($this->parameters['data']);
+ $object->updateGroupOptions($this->parameters['options']);
+ }
+ }
}
-<?php\r
-namespace wcf\data\user\group;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of user groups.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.group\r
- * @category Community Framework\r
- */\r
-class UserGroupList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\user\group\UserGroup';\r
+<?php
+namespace wcf\data\user\group;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of user groups.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.group
+ * @category Community Framework
+ */
+class UserGroupList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\user\group\UserGroup';
}
-<?php\r
-namespace wcf\data\user\group\option;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user group option-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.group.option\r
- * @category Community Framework\r
- */\r
-class UserGroupOptionAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\user\group\option\UserGroupOptionEditor';\r
+<?php
+namespace wcf\data\user\group\option;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user group option-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.group.option
+ * @category Community Framework
+ */
+class UserGroupOptionAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\user\group\option\UserGroupOptionEditor';
}
-<?php\r
-namespace wcf\data\user\group\option;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of user group options.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.group.option\r
- * @category Community Framework\r
- */\r
-class UserGroupOptionList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\user\group\option\UserGroupOption';\r
+<?php
+namespace wcf\data\user\group\option;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of user group options.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.group.option
+ * @category Community Framework
+ */
+class UserGroupOptionList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\user\group\option\UserGroupOption';
}
-<?php\r
-namespace wcf\data\user\group\option\category;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user group option category-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.group.option.category\r
- * @category Community Framework\r
- */\r
-class UserGroupOptionCategoryAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\user\group\option\category\UserGroupOptionCategoryEditor';\r
+<?php
+namespace wcf\data\user\group\option\category;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user group option category-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.group.option.category
+ * @category Community Framework
+ */
+class UserGroupOptionCategoryAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\user\group\option\category\UserGroupOptionCategoryEditor';
}
-<?php\r
-namespace wcf\data\user\group\option\category;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of user group option categories.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.group.option.category\r
- * @category Community Framework\r
- */\r
-class UserGroupOptionCategoryList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\user\group\option\category\UserGroupOptionCategory';\r
+<?php
+namespace wcf\data\user\group\option\category;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of user group option categories.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.group.option.category
+ * @category Community Framework
+ */
+class UserGroupOptionCategoryList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\user\group\option\category\UserGroupOptionCategory';
}
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\User;\r
-\r
-/**\r
- * Any user option output class should implement this interface.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category Community Framework\r
- */\r
-interface IUserOptionOutput {\r
- /**\r
- * Returns a short version of the html code for the output of the given user option.\r
- * \r
- * @param User $user\r
- * @param array $optionData\r
- * @param string $value\r
- * @return string\r
- */\r
- public function getShortOutput(User $user, $optionData, $value);\r
- \r
- /**\r
- * Returns a medium version of the html code for the output of the given user option.\r
- * \r
- * @param User $user\r
- * @param array $optionData\r
- * @param string $value\r
- * @return string\r
- */\r
- public function getMediumOutput(User $user, $optionData, $value);\r
- \r
- /**\r
- * Returns the html code for the output of the given user option.\r
- * \r
- * @param User $user\r
- * @param array $optionData\r
- * @param string $value\r
- * @return string\r
- */\r
- public function getOutput(User $user, $optionData, $value);\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\User;
+
+/**
+ * Any user option output class should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category Community Framework
+ */
+interface IUserOptionOutput {
+ /**
+ * Returns a short version of the html code for the output of the given user option.
+ *
+ * @param User $user
+ * @param array $optionData
+ * @param string $value
+ * @return string
+ */
+ public function getShortOutput(User $user, $optionData, $value);
+
+ /**
+ * Returns a medium version of the html code for the output of the given user option.
+ *
+ * @param User $user
+ * @param array $optionData
+ * @param string $value
+ * @return string
+ */
+ public function getMediumOutput(User $user, $optionData, $value);
+
+ /**
+ * Returns the html code for the output of the given user option.
+ *
+ * @param User $user
+ * @param array $optionData
+ * @param string $value
+ * @return string
+ */
+ public function getOutput(User $user, $optionData, $value);
}
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\option\Option;\r
-\r
-/**\r
- * Represents a user option.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2010 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category Community Framework\r
- */\r
-class UserOption extends Option {\r
- /**\r
- * @see DatabaseObject::$databaseTableName\r
- */\r
- protected static $databaseTableName = 'user_option';\r
- \r
- /**\r
- * @see DatabaseObject::$databaseTableIndexName\r
- */\r
- protected static $databaseTableIndexName = 'optionID';\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\option\Option;
+
+/**
+ * Represents a user option.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2010 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category Community Framework
+ */
+class UserOption extends Option {
+ /**
+ * @see DatabaseObject::$databaseTableName
+ */
+ protected static $databaseTableName = 'user_option';
+
+ /**
+ * @see DatabaseObject::$databaseTableIndexName
+ */
+ protected static $databaseTableIndexName = 'optionID';
}
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user option-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category Community Framework\r
- */\r
-class UserOptionAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\user\option\UserOptionEditor';\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user option-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category Community Framework
+ */
+class UserOptionAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\user\option\UserOptionEditor';
}
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\DatabaseObjectEditor;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Provides functions to edit user options.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category Community Framework\r
- */\r
-class UserOptionEditor extends DatabaseObjectEditor {\r
- /**\r
- * @see DatabaseObjectDecorator::$baseClass\r
- */\r
- protected static $baseClass = 'wcf\data\user\option\UserOption';\r
- \r
- /**\r
- * @see wcf\data\IEditableObject::create()\r
- */\r
- public static function create(array $parameters = array()) {\r
- $userOption = parent::create($parameters);\r
- \r
- // alter the table "wcf".WCF_N."_user_option_value" with this new option\r
- WCF::getDB()->getEditor()->addColumn('wcf'.WCF_N.'_user_option_value', 'userOption'.$userOption->optionID, self::getColumnDefinition($parameters['optionType']));\r
- \r
- // add the default value to this column\r
- if (isset($parameters['$defaultValue'])) {\r
- $sql = "UPDATE wcf".WCF_N."_user_option_value\r
- SET userOption".$userOption->optionID." = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($parameters['defaultValue']));\r
- }\r
- \r
- return $userOption;\r
- }\r
- \r
- /**\r
- * @see wcf\data\IEditableObject::update()\r
- */\r
- public function update(array $parameters = array()) {\r
- parent::update($parameters);\r
- \r
- // alter the table "wcf".WCF_N."_user_option_value" with this new option\r
- $sql = WCF::getDB()->getEditor()->updateColumn(\r
- 'wcf'.WCF_N.'_user_option_value',\r
- 'userOption'.$this->optionID,\r
- 'userOption'.$this->optionID,\r
- self::getColumnDefinition($parameters['optionType'])\r
- );\r
- }\r
- \r
- /**\r
- * @see wcf\data\IEditableObject::delete()\r
- */\r
- public function delete() {\r
- $sql = "DELETE FROM wcf".WCF_N."_user_option\r
- WHERE optionID = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($this->optionID));\r
- \r
- $sql = WCF::getDB()->getEditor()->dropColumn('wcf'.WCF_N.'_user_option_value', 'userOption'.$this->optionID);\r
- }\r
- \r
- /**\r
- * Disables this option.\r
- */\r
- public function disable() {\r
- $this->enable(false);\r
- }\r
- \r
- /**\r
- * Enables this option.\r
- * \r
- * @param boolean $enable\r
- */\r
- public function enable($enable = true) {\r
- $value = intval(!$enable);\r
- \r
- $sql = "UPDATE wcf".WCF_N."_user_option\r
- SET disabled = ?\r
- WHERE optionID = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($value, $this->optionID));\r
- }\r
- \r
- /**\r
- * Determines the needed sql statement to modify column definitions.\r
- * \r
- * @param string $optionType\r
- * @return array column definition\r
- */\r
- public static function getColumnDefinition($optionType) {\r
- $column = array(\r
- 'autoIncrement' => false,\r
- 'key' => false,\r
- 'notNull' => false,\r
- 'type' => 'text'\r
- );\r
- \r
- switch ($optionType) {\r
- case 'boolean':\r
- $column['notNull'] = true;\r
- $column['default'] = 0;\r
- $column['length'] = 1;\r
- $column['type'] = 'tinyint';\r
- break;\r
- \r
- case 'integer':\r
- $column['notNull'] = true;\r
- $column['default'] = 0;\r
- $column['length'] = 10;\r
- $column['type'] = 'int';\r
- break;\r
- \r
- case 'float':\r
- $column['notNull'] = true;\r
- $column['default'] = 0.0;\r
- $column['type'] = 'float';\r
- break;\r
- \r
- case 'textarea':\r
- $column['type'] = 'mediumtext';\r
- break;\r
- \r
- case 'birthday':\r
- case 'date':\r
- $column['notNull'] = true;\r
- $column['default'] = '0000-00-00';\r
- $column['length'] = 10;\r
- $column['type'] = 'char';\r
- break;\r
- }\r
- \r
- return $column;\r
- }\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\DatabaseObjectEditor;
+use wcf\system\WCF;
+
+/**
+ * Provides functions to edit user options.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category Community Framework
+ */
+class UserOptionEditor extends DatabaseObjectEditor {
+ /**
+ * @see DatabaseObjectDecorator::$baseClass
+ */
+ protected static $baseClass = 'wcf\data\user\option\UserOption';
+
+ /**
+ * @see wcf\data\IEditableObject::create()
+ */
+ public static function create(array $parameters = array()) {
+ $userOption = parent::create($parameters);
+
+ // alter the table "wcf".WCF_N."_user_option_value" with this new option
+ WCF::getDB()->getEditor()->addColumn('wcf'.WCF_N.'_user_option_value', 'userOption'.$userOption->optionID, self::getColumnDefinition($parameters['optionType']));
+
+ // add the default value to this column
+ if (isset($parameters['$defaultValue'])) {
+ $sql = "UPDATE wcf".WCF_N."_user_option_value
+ SET userOption".$userOption->optionID." = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($parameters['defaultValue']));
+ }
+
+ return $userOption;
+ }
+
+ /**
+ * @see wcf\data\IEditableObject::update()
+ */
+ public function update(array $parameters = array()) {
+ parent::update($parameters);
+
+ // alter the table "wcf".WCF_N."_user_option_value" with this new option
+ $sql = WCF::getDB()->getEditor()->updateColumn(
+ 'wcf'.WCF_N.'_user_option_value',
+ 'userOption'.$this->optionID,
+ 'userOption'.$this->optionID,
+ self::getColumnDefinition($parameters['optionType'])
+ );
+ }
+
+ /**
+ * @see wcf\data\IEditableObject::delete()
+ */
+ public function delete() {
+ $sql = "DELETE FROM wcf".WCF_N."_user_option
+ WHERE optionID = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($this->optionID));
+
+ $sql = WCF::getDB()->getEditor()->dropColumn('wcf'.WCF_N.'_user_option_value', 'userOption'.$this->optionID);
+ }
+
+ /**
+ * Disables this option.
+ */
+ public function disable() {
+ $this->enable(false);
+ }
+
+ /**
+ * Enables this option.
+ *
+ * @param boolean $enable
+ */
+ public function enable($enable = true) {
+ $value = intval(!$enable);
+
+ $sql = "UPDATE wcf".WCF_N."_user_option
+ SET disabled = ?
+ WHERE optionID = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($value, $this->optionID));
+ }
+
+ /**
+ * Determines the needed sql statement to modify column definitions.
+ *
+ * @param string $optionType
+ * @return array column definition
+ */
+ public static function getColumnDefinition($optionType) {
+ $column = array(
+ 'autoIncrement' => false,
+ 'key' => false,
+ 'notNull' => false,
+ 'type' => 'text'
+ );
+
+ switch ($optionType) {
+ case 'boolean':
+ $column['notNull'] = true;
+ $column['default'] = 0;
+ $column['length'] = 1;
+ $column['type'] = 'tinyint';
+ break;
+
+ case 'integer':
+ $column['notNull'] = true;
+ $column['default'] = 0;
+ $column['length'] = 10;
+ $column['type'] = 'int';
+ break;
+
+ case 'float':
+ $column['notNull'] = true;
+ $column['default'] = 0.0;
+ $column['type'] = 'float';
+ break;
+
+ case 'textarea':
+ $column['type'] = 'mediumtext';
+ break;
+
+ case 'birthday':
+ case 'date':
+ $column['notNull'] = true;
+ $column['default'] = '0000-00-00';
+ $column['length'] = 10;
+ $column['type'] = 'char';
+ break;
+ }
+
+ return $column;
+ }
}
\ No newline at end of file
-<?php\r
-namespace wcf\data\user\option;\r
-use wcf\data\DatabaseObjectList;\r
-\r
-/**\r
- * Represents a list of user options.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.option\r
- * @category Community Framework\r
- */\r
-class UserOptionList extends DatabaseObjectList {\r
- /**\r
- * @see DatabaseObjectList::$className\r
- */\r
- public $className = 'wcf\data\user\option\UserOption';\r
+<?php
+namespace wcf\data\user\option;
+use wcf\data\DatabaseObjectList;
+
+/**
+ * Represents a list of user options.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.option
+ * @category Community Framework
+ */
+class UserOptionList extends DatabaseObjectList {
+ /**
+ * @see DatabaseObjectList::$className
+ */
+ public $className = 'wcf\data\user\option\UserOption';
}
-<?php\r
-namespace wcf\data\user\option\category;\r
-use wcf\data\AbstractDatabaseObjectAction;\r
-\r
-/**\r
- * Executes user option category-related actions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.option.category\r
- * @category Community Framework\r
- */\r
-class UserOptionCategoryAction extends AbstractDatabaseObjectAction {\r
- /**\r
- * @see AbstractDatabaseObjectAction::$className\r
- */\r
- protected $className = 'wcf\data\user\option\category\UserOptionCategoryEditor';\r
+<?php
+namespace wcf\data\user\option\category;
+use wcf\data\AbstractDatabaseObjectAction;
+
+/**
+ * Executes user option category-related actions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.option.category
+ * @category Community Framework
+ */
+class UserOptionCategoryAction extends AbstractDatabaseObjectAction {
+ /**
+ * @see AbstractDatabaseObjectAction::$className
+ */
+ protected $className = 'wcf\data\user\option\category\UserOptionCategoryEditor';
}
-<?php\r
-namespace wcf\data\user\option\category;\r
-use wcf\data\DatabaseObjectEditor;\r
-\r
-/**\r
- * Provides functions to add, edit and delete user option categories.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.user.option.category\r
- * @category Community Framework\r
- */\r
-class UserOptionCategoryEditor extends DatabaseObjectEditor {\r
- /**\r
- * @see UserOptionCategory::$baseClass\r
- */\r
- protected static $baseClass = 'wcf\data\user\option\category\UserOptionCategory';\r
- \r
- /**\r
- * @see wcf\data\IEditableObject::create()\r
- */\r
- public static function create(array $parameters = array()) {\r
- // obtain default values\r
- if (!isset($parameters['packageID'])) $parameters['packageID'] = PACKAGE_ID;\r
- \r
- return parent::create($parameters);\r
- }\r
+<?php
+namespace wcf\data\user\option\category;
+use wcf\data\DatabaseObjectEditor;
+
+/**
+ * Provides functions to add, edit and delete user option categories.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.user.option.category
+ * @category Community Framework
+ */
+class UserOptionCategoryEditor extends DatabaseObjectEditor {
+ /**
+ * @see UserOptionCategory::$baseClass
+ */
+ protected static $baseClass = 'wcf\data\user\option\category\UserOptionCategory';
+
+ /**
+ * @see wcf\data\IEditableObject::create()
+ */
+ public static function create(array $parameters = array()) {
+ // obtain default values
+ if (!isset($parameters['packageID'])) $parameters['packageID'] = PACKAGE_ID;
+
+ return parent::create($parameters);
+ }
}
-<?php\r
-namespace wcf\form;\r
-use wcf\page\AbstractPage;\r
-use wcf\system\WCF;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\exception\UserInputException;\r
-\r
-/**\r
- * This class provides default implementations for the Form interface.\r
- * This includes the default event listener for a form: readFormParameters, validate, save.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage form\r
- * @category Community Framework\r
- */\r
-abstract class AbstractForm extends AbstractPage implements IForm {\r
- /**\r
- * Name of error field.\r
- *\r
- * @var string\r
- */\r
- public $errorField = '';\r
- \r
- /**\r
- * Name of error type.\r
- *\r
- * @var string\r
- */\r
- public $errorType = '';\r
- \r
- /**\r
- * @see wcf\form\IForm::submit()\r
- */\r
- public function submit() {\r
- // call submit event\r
- EventHandler::getInstance()->fireAction($this, 'submit');\r
- \r
- $this->readFormParameters();\r
- \r
- try {\r
- $this->validate();\r
- // no errors\r
- $this->save();\r
- }\r
- catch (UserInputException $e) {\r
- $this->errorField = $e->getField();\r
- $this->errorType = $e->getType();\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::readFormParameters()\r
- */\r
- public function readFormParameters() {\r
- // call readFormParameters event\r
- EventHandler::getInstance()->fireAction($this, 'readFormParameters');\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::validate()\r
- */\r
- public function validate() {\r
- // call validate event\r
- EventHandler::getInstance()->fireAction($this, 'validate');\r
- }\r
- \r
- /**\r
- * @see wcf\form\IForm::save()\r
- */\r
- public function save() {\r
- // call save event\r
- EventHandler::getInstance()->fireAction($this, 'save');\r
- }\r
- \r
- /**\r
- * Calls the 'saved' event after the successful call of the save method.\r
- * This functions won't called automatically. You must do this manually, if you inherit AbstractForm.\r
- */\r
- protected function saved() {\r
- EventHandler::getInstance()->fireAction($this, 'saved');\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- if (count($_POST) || count($_FILES)) {\r
- $this->submit();\r
- }\r
- \r
- parent::readData();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- // assign default variables\r
- WCF::getTPL()->assign(array(\r
- 'errorField' => $this->errorField,\r
- 'errorType' => $this->errorType\r
- ));\r
- }\r
+<?php
+namespace wcf\form;
+use wcf\page\AbstractPage;
+use wcf\system\WCF;
+use wcf\system\event\EventHandler;
+use wcf\system\exception\UserInputException;
+
+/**
+ * This class provides default implementations for the Form interface.
+ * This includes the default event listener for a form: readFormParameters, validate, save.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage form
+ * @category Community Framework
+ */
+abstract class AbstractForm extends AbstractPage implements IForm {
+ /**
+ * Name of error field.
+ *
+ * @var string
+ */
+ public $errorField = '';
+
+ /**
+ * Name of error type.
+ *
+ * @var string
+ */
+ public $errorType = '';
+
+ /**
+ * @see wcf\form\IForm::submit()
+ */
+ public function submit() {
+ // call submit event
+ EventHandler::getInstance()->fireAction($this, 'submit');
+
+ $this->readFormParameters();
+
+ try {
+ $this->validate();
+ // no errors
+ $this->save();
+ }
+ catch (UserInputException $e) {
+ $this->errorField = $e->getField();
+ $this->errorType = $e->getType();
+ }
+ }
+
+ /**
+ * @see wcf\form\IForm::readFormParameters()
+ */
+ public function readFormParameters() {
+ // call readFormParameters event
+ EventHandler::getInstance()->fireAction($this, 'readFormParameters');
+ }
+
+ /**
+ * @see wcf\form\IForm::validate()
+ */
+ public function validate() {
+ // call validate event
+ EventHandler::getInstance()->fireAction($this, 'validate');
+ }
+
+ /**
+ * @see wcf\form\IForm::save()
+ */
+ public function save() {
+ // call save event
+ EventHandler::getInstance()->fireAction($this, 'save');
+ }
+
+ /**
+ * Calls the 'saved' event after the successful call of the save method.
+ * This functions won't called automatically. You must do this manually, if you inherit AbstractForm.
+ */
+ protected function saved() {
+ EventHandler::getInstance()->fireAction($this, 'saved');
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ if (count($_POST) || count($_FILES)) {
+ $this->submit();
+ }
+
+ parent::readData();
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ // assign default variables
+ WCF::getTPL()->assign(array(
+ 'errorField' => $this->errorField,
+ 'errorType' => $this->errorType
+ ));
+ }
}
-<?php\r
-namespace wcf\form;\r
-use wcf\page\IPage;\r
-\r
-/**\r
- * All form classes should implement this interface. \r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage form\r
- * @category Community Framework\r
- */\r
-interface IForm extends IPage {\r
- /**\r
- * Is called when the form was submitted.\r
- */\r
- public function submit();\r
- \r
- /**\r
- * Validates form inputs.\r
- */\r
- public function validate();\r
- \r
- /**\r
- * Saves the data of the form.\r
- */\r
- public function save();\r
- \r
- /**\r
- * Reads the given form parameters.\r
- */\r
- public function readFormParameters();\r
+<?php
+namespace wcf\form;
+use wcf\page\IPage;
+
+/**
+ * All form classes should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage form
+ * @category Community Framework
+ */
+interface IForm extends IPage {
+ /**
+ * Is called when the form was submitted.
+ */
+ public function submit();
+
+ /**
+ * Validates form inputs.
+ */
+ public function validate();
+
+ /**
+ * Saves the data of the form.
+ */
+ public function save();
+
+ /**
+ * Reads the given form parameters.
+ */
+ public function readFormParameters();
}
-<?php\r
-namespace wcf\page;\r
-use wcf\system\WCF;\r
-use wcf\system\event\EventHandler;\r
-\r
-/**\r
- * This class provides default implementations for the Page interface.\r
- * This includes the call of the default event listeners for a page: readParameters, readData, assignVariables and show.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage page\r
- * @category Community Framework\r
- */\r
-abstract class AbstractPage implements IPage {\r
- /**\r
- * Name of the template for the called page.\r
- * \r
- * @var string\r
- */\r
- public $templateName = '';\r
- \r
- /**\r
- * Value of the given action parameter.\r
- * \r
- * @var string\r
- */\r
- public $action = '';\r
- \r
- /**\r
- * Needed modules to view this page.\r
- * \r
- * @var array<string>\r
- */\r
- public $neededModules = array();\r
- \r
- /**\r
- * Needed permissions to view this page.\r
- * \r
- * @var array<string>\r
- */\r
- public $neededPermissions = array();\r
- \r
- /**\r
- * Creates a new AbstractPage object.\r
- * Calls the readParameters() and show() methods automatically.\r
- */\r
- public function __construct() {\r
- // call default methods\r
- $this->readParameters();\r
- $this->show();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- // call readParameters event\r
- EventHandler::getInstance()->fireAction($this, 'readParameters');\r
- \r
- // read action parameter\r
- if (isset($_REQUEST['action'])) $this->action = $_REQUEST['action'];\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- // call readData event\r
- EventHandler::getInstance()->fireAction($this, 'readData');\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- // call assignVariables event\r
- EventHandler::getInstance()->fireAction($this, 'assignVariables');\r
- \r
- // assign parameters\r
- WCF::getTPL()->assign(array(\r
- 'action' => $this->action,\r
- 'templateName' => $this->templateName\r
- ));\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::checkModules()\r
- */\r
- public function checkModules() {\r
- // call checkModules event\r
- EventHandler::getInstance()->fireAction($this, 'checkModules');\r
- \r
- // check modules\r
- if (count($this->neededModules)) {\r
- foreach ($this->neededModules as $module) {\r
- if (!defined($module) || !constant($module)) {\r
- throw new wcf\system\exception\IllegalLinkException();\r
- }\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::checkPermissions()\r
- */\r
- public function checkPermissions() {\r
- // call checkPermissions event\r
- EventHandler::getInstance()->fireAction($this, 'checkPermissions');\r
- \r
- // check permission\r
- if (count($this->neededPermissions)) {\r
- WCF::getSession()->checkPermission($this->neededPermissions);\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::show()\r
- */\r
- public function show() {\r
- // check modules\r
- $this->checkModules();\r
- \r
- // check permission\r
- $this->checkPermissions();\r
- \r
- // read data\r
- $this->readData();\r
-\r
- // assign variables\r
- $this->assignVariables(); \r
- \r
- // call show event\r
- EventHandler::getInstance()->fireAction($this, 'show');\r
- \r
- // show template\r
- if (!empty($this->templateName)) {\r
- WCF::getTPL()->display($this->templateName);\r
- }\r
- }\r
+<?php
+namespace wcf\page;
+use wcf\system\WCF;
+use wcf\system\event\EventHandler;
+
+/**
+ * This class provides default implementations for the Page interface.
+ * This includes the call of the default event listeners for a page: readParameters, readData, assignVariables and show.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage page
+ * @category Community Framework
+ */
+abstract class AbstractPage implements IPage {
+ /**
+ * Name of the template for the called page.
+ *
+ * @var string
+ */
+ public $templateName = '';
+
+ /**
+ * Value of the given action parameter.
+ *
+ * @var string
+ */
+ public $action = '';
+
+ /**
+ * Needed modules to view this page.
+ *
+ * @var array<string>
+ */
+ public $neededModules = array();
+
+ /**
+ * Needed permissions to view this page.
+ *
+ * @var array<string>
+ */
+ public $neededPermissions = array();
+
+ /**
+ * Creates a new AbstractPage object.
+ * Calls the readParameters() and show() methods automatically.
+ */
+ public function __construct() {
+ // call default methods
+ $this->readParameters();
+ $this->show();
+ }
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ // call readParameters event
+ EventHandler::getInstance()->fireAction($this, 'readParameters');
+
+ // read action parameter
+ if (isset($_REQUEST['action'])) $this->action = $_REQUEST['action'];
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ // call readData event
+ EventHandler::getInstance()->fireAction($this, 'readData');
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ // call assignVariables event
+ EventHandler::getInstance()->fireAction($this, 'assignVariables');
+
+ // assign parameters
+ WCF::getTPL()->assign(array(
+ 'action' => $this->action,
+ 'templateName' => $this->templateName
+ ));
+ }
+
+ /**
+ * @see wcf\page\IPage::checkModules()
+ */
+ public function checkModules() {
+ // call checkModules event
+ EventHandler::getInstance()->fireAction($this, 'checkModules');
+
+ // check modules
+ if (count($this->neededModules)) {
+ foreach ($this->neededModules as $module) {
+ if (!defined($module) || !constant($module)) {
+ throw new wcf\system\exception\IllegalLinkException();
+ }
+ }
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::checkPermissions()
+ */
+ public function checkPermissions() {
+ // call checkPermissions event
+ EventHandler::getInstance()->fireAction($this, 'checkPermissions');
+
+ // check permission
+ if (count($this->neededPermissions)) {
+ WCF::getSession()->checkPermission($this->neededPermissions);
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::show()
+ */
+ public function show() {
+ // check modules
+ $this->checkModules();
+
+ // check permission
+ $this->checkPermissions();
+
+ // read data
+ $this->readData();
+
+ // assign variables
+ $this->assignVariables();
+
+ // call show event
+ EventHandler::getInstance()->fireAction($this, 'show');
+
+ // show template
+ if (!empty($this->templateName)) {
+ WCF::getTPL()->display($this->templateName);
+ }
+ }
}
-<?php\r
-namespace wcf\page;\r
-\r
-/**\r
- * All page classes should implement this interface. \r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage page\r
- * @category Community Framework\r
- */\r
-interface IPage {\r
- /**\r
- * Reads the given parameters.\r
- */\r
- public function readParameters();\r
- \r
- /**\r
- * Checks the modules of this page.\r
- */\r
- public function checkModules();\r
- \r
- /**\r
- * Checks the permissions of this page.\r
- */\r
- public function checkPermissions();\r
- \r
- /**\r
- * Reads/Gets the data to be displayed on this page.\r
- */\r
- public function readData();\r
- \r
- /**\r
- * Assigns variables to the template engine.\r
- */\r
- public function assignVariables();\r
- \r
- /**\r
- * Shows the requested page.\r
- */\r
- public function show();\r
+<?php
+namespace wcf\page;
+
+/**
+ * All page classes should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage page
+ * @category Community Framework
+ */
+interface IPage {
+ /**
+ * Reads the given parameters.
+ */
+ public function readParameters();
+
+ /**
+ * Checks the modules of this page.
+ */
+ public function checkModules();
+
+ /**
+ * Checks the permissions of this page.
+ */
+ public function checkPermissions();
+
+ /**
+ * Reads/Gets the data to be displayed on this page.
+ */
+ public function readData();
+
+ /**
+ * Assigns variables to the template engine.
+ */
+ public function assignVariables();
+
+ /**
+ * Shows the requested page.
+ */
+ public function show();
}
-<?php\r
-namespace wcf\page;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\WCF;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * Provides default implementations for a multiple link page.\r
- * Handles the page number parameter automatically.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage page\r
- * @category Community Framework\r
- */\r
-abstract class MultipleLinkPage extends AbstractPage {\r
- /**\r
- * The current page number.\r
- * \r
- * @var integer\r
- */\r
- public $pageNo = 0;\r
- \r
- /**\r
- * The number of all pages.\r
- * \r
- * @var integer\r
- */\r
- public $pages = 0;\r
- \r
- /**\r
- * The number of items shown per page.\r
- * \r
- * @var integer\r
- */\r
- public $itemsPerPage = 20;\r
- \r
- /**\r
- * The number of all items.\r
- * \r
- * @var integer\r
- */\r
- public $items = 0;\r
- \r
- /**\r
- * Indicates the range of the listed items.\r
- * \r
- * @var integer\r
- */\r
- public $startIndex = 0;\r
- \r
- /**\r
- * Indicates the range of the listed items.\r
- * \r
- * @var integer\r
- */\r
- public $endIndex = 0;\r
- \r
- /**\r
- * DatabaseObjectList object\r
- * \r
- * @var wcf\data\DatabaseObjectList\r
- */ \r
- public $objectList = null;\r
- \r
- /**\r
- * class name for DatabaseObjectList\r
- * \r
- * @var string\r
- */ \r
- public $objectListClassName = '';\r
- \r
- /**\r
- * list of DatabaseObject objects\r
- * \r
- * @var array<wcf\data\DatabaseObject>\r
- */ \r
- public $objects = array();\r
- \r
- /**\r
- * @see wcf\data\DatabaseObjectList::$sqlLimit\r
- */ \r
- public $sqlLimit = 0;\r
- \r
- /**\r
- * @see wcf\data\DatabaseObjectList::$sqlOffset\r
- */\r
- public $sqlOffset = '';\r
- \r
- /**\r
- * @see wcf\data\DatabaseObjectList::$sqlOrderBy\r
- */ \r
- public $sqlOrderBy = '';\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- // read page number parameter\r
- if (isset($_REQUEST['pageNo'])) $this->pageNo = intval($_REQUEST['pageNo']);\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- parent::readData();\r
- \r
- // initialize database object list\r
- $this->initObjectList();\r
- \r
- // calculates page number\r
- $this->calculateNumberOfPages();\r
- \r
- // read objects\r
- if ($this->items) {\r
- $this->sqlLimit = $this->itemsPerPage;\r
- $this->sqlOffset = ($this->pageNo - 1) * $this->itemsPerPage;\r
- $this->sqlOrderBy = $this->sortField." ".$this->sortOrder;\r
- $this->readObjects();\r
- }\r
- }\r
- \r
- /**\r
- * Initializes DatabaseObjectList instance.\r
- */ \r
- protected function initObjectList() {\r
- if (empty($this->objectListClassName)) {\r
- throw new SystemException('DatabaseObjectList class name not specified.');\r
- }\r
- \r
- if (!ClassUtil::isInstanceOf($this->objectListClassName, 'wcf\data\DatabaseObjectList')) {\r
- throw new SystemException("Class '".$this->objectListClassName."' does not extend 'wcf\data\DatabaseObjectList'");\r
- }\r
- \r
- $this->objectList = new $this->objectListClassName();\r
- }\r
- \r
- /**\r
- * Reads object list.\r
- */ \r
- protected function readObjects() {\r
- $this->objectList->sqlLimit = $this->sqlLimit;\r
- $this->objectList->sqlOffset = $this->sqlOffset;\r
- $this->objectList->sqlOrderBy = $this->sqlOrderBy;\r
- $this->objectList->readObjects();\r
- \r
- $this->objects = $this->objectList->getObjects();\r
- }\r
- \r
- /**\r
- * Calculates the number of pages and\r
- * handles the given page number parameter.\r
- */\r
- public function calculateNumberOfPages() {\r
- // call calculateNumberOfPages event\r
- EventHandler::getInstance()->fireAction($this, 'calculateNumberOfPages');\r
- \r
- // calculate number of pages\r
- $this->items = $this->countItems();\r
- $this->pages = intval(ceil($this->items / $this->itemsPerPage));\r
- \r
- // correct active page number\r
- if ($this->pageNo > $this->pages) $this->pageNo = $this->pages;\r
- if ($this->pageNo < 1) $this->pageNo = 1;\r
- \r
- // calculate start and end index\r
- $this->startIndex = ($this->pageNo - 1) * $this->itemsPerPage;\r
- $this->endIndex = $this->startIndex + $this->itemsPerPage;\r
- $this->startIndex++;\r
- if ($this->endIndex > $this->items) $this->endIndex = $this->items;\r
- }\r
- \r
- /**\r
- * Counts the displayed items.\r
- * \r
- * @return integer\r
- */\r
- public function countItems() {\r
- // call countItems event\r
- EventHandler::getInstance()->fireAction($this, 'countItems');\r
- \r
- return $this->objectList->countObjects();\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- // assign page parameters\r
- WCF::getTPL()->assign(array(\r
- 'pageNo' => $this->pageNo,\r
- 'pages' => $this->pages,\r
- 'items' => $this->items,\r
- 'itemsPerPage' => $this->itemsPerPage,\r
- 'startIndex' => $this->startIndex,\r
- 'endIndex' => $this->endIndex,\r
- 'objects' => $this->objects\r
- ));\r
- }\r
+<?php
+namespace wcf\page;
+use wcf\system\event\EventHandler;
+use wcf\system\exception\SystemException;
+use wcf\system\WCF;
+use wcf\util\ClassUtil;
+
+/**
+ * Provides default implementations for a multiple link page.
+ * Handles the page number parameter automatically.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage page
+ * @category Community Framework
+ */
+abstract class MultipleLinkPage extends AbstractPage {
+ /**
+ * The current page number.
+ *
+ * @var integer
+ */
+ public $pageNo = 0;
+
+ /**
+ * The number of all pages.
+ *
+ * @var integer
+ */
+ public $pages = 0;
+
+ /**
+ * The number of items shown per page.
+ *
+ * @var integer
+ */
+ public $itemsPerPage = 20;
+
+ /**
+ * The number of all items.
+ *
+ * @var integer
+ */
+ public $items = 0;
+
+ /**
+ * Indicates the range of the listed items.
+ *
+ * @var integer
+ */
+ public $startIndex = 0;
+
+ /**
+ * Indicates the range of the listed items.
+ *
+ * @var integer
+ */
+ public $endIndex = 0;
+
+ /**
+ * DatabaseObjectList object
+ *
+ * @var wcf\data\DatabaseObjectList
+ */
+ public $objectList = null;
+
+ /**
+ * class name for DatabaseObjectList
+ *
+ * @var string
+ */
+ public $objectListClassName = '';
+
+ /**
+ * list of DatabaseObject objects
+ *
+ * @var array<wcf\data\DatabaseObject>
+ */
+ public $objects = array();
+
+ /**
+ * @see wcf\data\DatabaseObjectList::$sqlLimit
+ */
+ public $sqlLimit = 0;
+
+ /**
+ * @see wcf\data\DatabaseObjectList::$sqlOffset
+ */
+ public $sqlOffset = '';
+
+ /**
+ * @see wcf\data\DatabaseObjectList::$sqlOrderBy
+ */
+ public $sqlOrderBy = '';
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ // read page number parameter
+ if (isset($_REQUEST['pageNo'])) $this->pageNo = intval($_REQUEST['pageNo']);
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ parent::readData();
+
+ // initialize database object list
+ $this->initObjectList();
+
+ // calculates page number
+ $this->calculateNumberOfPages();
+
+ // read objects
+ if ($this->items) {
+ $this->sqlLimit = $this->itemsPerPage;
+ $this->sqlOffset = ($this->pageNo - 1) * $this->itemsPerPage;
+ $this->sqlOrderBy = $this->sortField." ".$this->sortOrder;
+ $this->readObjects();
+ }
+ }
+
+ /**
+ * Initializes DatabaseObjectList instance.
+ */
+ protected function initObjectList() {
+ if (empty($this->objectListClassName)) {
+ throw new SystemException('DatabaseObjectList class name not specified.');
+ }
+
+ if (!ClassUtil::isInstanceOf($this->objectListClassName, 'wcf\data\DatabaseObjectList')) {
+ throw new SystemException("Class '".$this->objectListClassName."' does not extend 'wcf\data\DatabaseObjectList'");
+ }
+
+ $this->objectList = new $this->objectListClassName();
+ }
+
+ /**
+ * Reads object list.
+ */
+ protected function readObjects() {
+ $this->objectList->sqlLimit = $this->sqlLimit;
+ $this->objectList->sqlOffset = $this->sqlOffset;
+ $this->objectList->sqlOrderBy = $this->sqlOrderBy;
+ $this->objectList->readObjects();
+
+ $this->objects = $this->objectList->getObjects();
+ }
+
+ /**
+ * Calculates the number of pages and
+ * handles the given page number parameter.
+ */
+ public function calculateNumberOfPages() {
+ // call calculateNumberOfPages event
+ EventHandler::getInstance()->fireAction($this, 'calculateNumberOfPages');
+
+ // calculate number of pages
+ $this->items = $this->countItems();
+ $this->pages = intval(ceil($this->items / $this->itemsPerPage));
+
+ // correct active page number
+ if ($this->pageNo > $this->pages) $this->pageNo = $this->pages;
+ if ($this->pageNo < 1) $this->pageNo = 1;
+
+ // calculate start and end index
+ $this->startIndex = ($this->pageNo - 1) * $this->itemsPerPage;
+ $this->endIndex = $this->startIndex + $this->itemsPerPage;
+ $this->startIndex++;
+ if ($this->endIndex > $this->items) $this->endIndex = $this->items;
+ }
+
+ /**
+ * Counts the displayed items.
+ *
+ * @return integer
+ */
+ public function countItems() {
+ // call countItems event
+ EventHandler::getInstance()->fireAction($this, 'countItems');
+
+ return $this->objectList->countObjects();
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ // assign page parameters
+ WCF::getTPL()->assign(array(
+ 'pageNo' => $this->pageNo,
+ 'pages' => $this->pages,
+ 'items' => $this->items,
+ 'itemsPerPage' => $this->itemsPerPage,
+ 'startIndex' => $this->startIndex,
+ 'endIndex' => $this->endIndex,
+ 'objects' => $this->objects
+ ));
+ }
}
-<?php\r
-namespace wcf\page;\r
-use wcf\system\WCF;\r
-use wcf\system\event\EventHandler;\r
-\r
-/**\r
- * Provides default implementations for a sortable page of listed items.\r
- * Handles the sorting parameters automatically.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage page\r
- * @category Community Framework\r
- */\r
-abstract class SortablePage extends MultipleLinkPage {\r
- /**\r
- * The selected sort field.\r
- * \r
- * @var string\r
- */\r
- public $sortField = '';\r
- \r
- /**\r
- * The selected sort order.\r
- * \r
- * @var string\r
- */\r
- public $sortOrder = '';\r
- \r
- /**\r
- * The default sort field.\r
- * \r
- * @var string\r
- */\r
- public $defaultSortField = '';\r
- \r
- /**\r
- * The default sort order.\r
- * \r
- * @var string\r
- */\r
- public $defaultSortOrder = 'ASC';\r
- \r
- /**\r
- * @see wcf\page\IPage::readParameters()\r
- */\r
- public function readParameters() {\r
- parent::readParameters();\r
- \r
- // read sorting parameter\r
- if (isset($_REQUEST['sortField'])) $this->sortField = $_REQUEST['sortField'];\r
- if (isset($_REQUEST['sortOrder'])) $this->sortOrder = $_REQUEST['sortOrder'];\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::readData()\r
- */\r
- public function readData() {\r
- $this->validateSortOrder();\r
- $this->validateSortField();\r
- \r
- parent::readData();\r
- }\r
- \r
- /**\r
- * Validates the given sort field parameter. \r
- */\r
- public function validateSortField() {\r
- // call validateSortField event\r
- EventHandler::getInstance()->fireAction($this, 'validateSortField');\r
- }\r
- \r
- /**\r
- * Validates the given sort order parameter. \r
- */\r
- public function validateSortOrder() {\r
- // call validateSortOrder event\r
- EventHandler::getInstance()->fireAction($this, 'validateSortOrder');\r
- \r
- switch ($this->sortOrder) {\r
- case 'ASC':\r
- case 'DESC': break;\r
- default: $this->sortOrder = $this->defaultSortOrder;\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public function assignVariables() {\r
- parent::assignVariables();\r
- \r
- // assign sorting parameters\r
- WCF::getTPL()->assign(array(\r
- 'sortField' => $this->sortField,\r
- 'sortOrder' => $this->sortOrder\r
- ));\r
- }\r
+<?php
+namespace wcf\page;
+use wcf\system\WCF;
+use wcf\system\event\EventHandler;
+
+/**
+ * Provides default implementations for a sortable page of listed items.
+ * Handles the sorting parameters automatically.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage page
+ * @category Community Framework
+ */
+abstract class SortablePage extends MultipleLinkPage {
+ /**
+ * The selected sort field.
+ *
+ * @var string
+ */
+ public $sortField = '';
+
+ /**
+ * The selected sort order.
+ *
+ * @var string
+ */
+ public $sortOrder = '';
+
+ /**
+ * The default sort field.
+ *
+ * @var string
+ */
+ public $defaultSortField = '';
+
+ /**
+ * The default sort order.
+ *
+ * @var string
+ */
+ public $defaultSortOrder = 'ASC';
+
+ /**
+ * @see wcf\page\IPage::readParameters()
+ */
+ public function readParameters() {
+ parent::readParameters();
+
+ // read sorting parameter
+ if (isset($_REQUEST['sortField'])) $this->sortField = $_REQUEST['sortField'];
+ if (isset($_REQUEST['sortOrder'])) $this->sortOrder = $_REQUEST['sortOrder'];
+ }
+
+ /**
+ * @see wcf\page\IPage::readData()
+ */
+ public function readData() {
+ $this->validateSortOrder();
+ $this->validateSortField();
+
+ parent::readData();
+ }
+
+ /**
+ * Validates the given sort field parameter.
+ */
+ public function validateSortField() {
+ // call validateSortField event
+ EventHandler::getInstance()->fireAction($this, 'validateSortField');
+ }
+
+ /**
+ * Validates the given sort order parameter.
+ */
+ public function validateSortOrder() {
+ // call validateSortOrder event
+ EventHandler::getInstance()->fireAction($this, 'validateSortOrder');
+
+ switch ($this->sortOrder) {
+ case 'ASC':
+ case 'DESC': break;
+ default: $this->sortOrder = $this->defaultSortOrder;
+ }
+ }
+
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public function assignVariables() {
+ parent::assignVariables();
+
+ // assign sorting parameters
+ WCF::getTPL()->assign(array(
+ 'sortField' => $this->sortField,
+ 'sortOrder' => $this->sortOrder
+ ));
+ }
}
-<?php\r
-namespace wcf\page\util;\r
-\r
-/**\r
- * Assigns default variables for the usage of the inline (javascript) calendar.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage page.util\r
- * @category Community Framework\r
- */\r
-class InlineCalendar {\r
- /**\r
- * @see wcf\page\IPage::assignVariables()\r
- */\r
- public static function assignVariables() {\r
- // create calendar data\r
- $dayOptions = array(0 => '');\r
- $hourOptions = $minuteOptions = array('' => '');\r
- $monthList = $weekdayList = '';\r
- $weekdays = $monthOptions = array();\r
- \r
- // days\r
- for ($i = 1; $i <= 31; $i++) $dayOptions[$i] = $i;\r
- // months\r
- $monthFormat = (Language::$dateFormatLocalized ? '%B' : '%m');\r
- for ($i = 1; $i <= 12; $i++) $monthOptions[$i] = DateUtil::formatDate($monthFormat, gmmktime(0, 0, 0, $i, 15, 2000), false, true);\r
- $monthList = implode(',', $monthOptions);\r
- $monthOptions[0] = '';\r
- ksort($monthOptions);\r
- \r
- // weekdays\r
- for ($i = 1; $i <= 7; $i++) {\r
- $weekdayNumber = intval(DateUtil::formatDate('%w', gmmktime(0, 0, 0, 1, $i, 2000), false, true));\r
- $weekdays[$weekdayNumber] = DateUtil::formatDate('%a', gmmktime(0, 0, 0, 1, $i, 2000), false, true);\r
- }\r
- ksort($weekdays);\r
- $weekdayList = implode(',', $weekdays);\r
- \r
- // hours\r
- for ($i = 0; $i < 24; $i++) $hourOptions[$i] = $i < 10 ? "0" . $i : $i;\r
- \r
- // minutes\r
- for ($i = 0; $i < 60; $i += 5) $minuteOptions[$i] = $i < 10 ? "0" . $i : $i;\r
- \r
- WCF::getTPL()->assign(array(\r
- 'monthOptions' => $monthOptions,\r
- 'monthList' => $monthList,\r
- 'dayOptions' => $dayOptions,\r
- 'weekdayList' => $weekdayList,\r
- 'startOfWeek' => (WCF::getUser()->firstDayOfWeek == '' ? 1 : intval(WCF::getUser()->firstDayOfWeek)),\r
- 'hourOptions' => $hourOptions,\r
- 'minuteOptions' => $minuteOptions\r
- ));\r
- }\r
+<?php
+namespace wcf\page\util;
+
+/**
+ * Assigns default variables for the usage of the inline (javascript) calendar.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage page.util
+ * @category Community Framework
+ */
+class InlineCalendar {
+ /**
+ * @see wcf\page\IPage::assignVariables()
+ */
+ public static function assignVariables() {
+ // create calendar data
+ $dayOptions = array(0 => '');
+ $hourOptions = $minuteOptions = array('' => '');
+ $monthList = $weekdayList = '';
+ $weekdays = $monthOptions = array();
+
+ // days
+ for ($i = 1; $i <= 31; $i++) $dayOptions[$i] = $i;
+ // months
+ $monthFormat = (Language::$dateFormatLocalized ? '%B' : '%m');
+ for ($i = 1; $i <= 12; $i++) $monthOptions[$i] = DateUtil::formatDate($monthFormat, gmmktime(0, 0, 0, $i, 15, 2000), false, true);
+ $monthList = implode(',', $monthOptions);
+ $monthOptions[0] = '';
+ ksort($monthOptions);
+
+ // weekdays
+ for ($i = 1; $i <= 7; $i++) {
+ $weekdayNumber = intval(DateUtil::formatDate('%w', gmmktime(0, 0, 0, 1, $i, 2000), false, true));
+ $weekdays[$weekdayNumber] = DateUtil::formatDate('%a', gmmktime(0, 0, 0, 1, $i, 2000), false, true);
+ }
+ ksort($weekdays);
+ $weekdayList = implode(',', $weekdays);
+
+ // hours
+ for ($i = 0; $i < 24; $i++) $hourOptions[$i] = $i < 10 ? "0" . $i : $i;
+
+ // minutes
+ for ($i = 0; $i < 60; $i += 5) $minuteOptions[$i] = $i < 10 ? "0" . $i : $i;
+
+ WCF::getTPL()->assign(array(
+ 'monthOptions' => $monthOptions,
+ 'monthList' => $monthList,
+ 'dayOptions' => $dayOptions,
+ 'weekdayList' => $weekdayList,
+ 'startOfWeek' => (WCF::getUser()->firstDayOfWeek == '' ? 1 : intval(WCF::getUser()->firstDayOfWeek)),
+ 'hourOptions' => $hourOptions,
+ 'minuteOptions' => $minuteOptions
+ ));
+ }
}
-<?php\r
-namespace wcf\system;\r
-use wcf\data\application\Application;\r
-use wcf\data\package\Package;\r
-use wcf\system\application\ApplicationHandler;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\database\statement\PreparedStatement;\r
-use wcf\system\language\LanguageFactory;\r
-use wcf\system\package\PackageInstallationDispatcher;\r
-use wcf\system\session\SessionFactory;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\storage\StorageHandler;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\exception;\r
-use wcf\util;\r
-\r
-// try to disable execution time limit\r
-@set_time_limit(0);\r
-\r
-// define current wcf version\r
-define('WCF_VERSION', '2.0.0 Alpha 1 (Maelstrom)');\r
-\r
-// define current unix timestamp\r
-define('TIME_NOW', time());\r
-\r
-// wcf imports\r
-if (!defined('NO_IMPORTS')) {\r
- require_once(WCF_DIR.'lib/core.functions.php');\r
-}\r
-\r
-/**\r
- * WCF is the central class for the community framework.\r
- * It holds the database connection, access to template and language engine.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system\r
- * @category Community Framework\r
- */\r
-class WCF {\r
- /**\r
- * list of autoload directories\r
- *\r
- * @var array\r
- */\r
- protected static $autoloadDirectories = array();\r
- \r
- /**\r
- * list of unique instances of each core object\r
- *\r
- * @var array<wcf\system\SingletonFactory>\r
- */\r
- protected static $coreObject = array();\r
- \r
- /**\r
- * list of cached core objects\r
- *\r
- * @var array<array>\r
- */\r
- protected static $coreObjectCache = array();\r
- \r
- /**\r
- * list of package dependencies\r
- *\r
- * @var array\r
- */ \r
- protected static $packageDependencies = array();\r
- \r
- /**\r
- * database object\r
- *\r
- * @var wcf\system\database\Database\r
- */\r
- protected static $dbObj = null;\r
- \r
- /**\r
- * language object\r
- *\r
- * @var wcf\system\language\Language\r
- */\r
- protected static $languageObj = null;\r
- \r
- /**\r
- * session object\r
- *\r
- * @var wcf\system\session\SessionHandler\r
- */\r
- protected static $sessionObj = null;\r
- \r
- /**\r
- * template object\r
- *\r
- * @var wcf\system\template\TemplateEngine\r
- */\r
- protected static $tplObj = null;\r
- \r
- /**\r
- * current user object\r
- *\r
- * @var wcf\data\user\User\r
- */\r
- protected static $userObj = null;\r
- \r
- /**\r
- * Calls all init functions of the WCF class.\r
- */\r
- public function __construct() {\r
- // add autoload directory\r
- self::$autoloadDirectories['wcf'] = WCF_DIR . 'lib/';\r
- \r
- // define tmp directory\r
- if (!defined('TMP_DIR')) define('TMP_DIR', util\BasicFileUtil::getTempFolder());\r
- \r
- // start initialization\r
- $this->initMagicQuotes();\r
- $this->initDB();\r
- $this->initOptions();\r
- $this->initCache();\r
- $this->initSession();\r
- $this->initLanguage();\r
- $this->initTPL();\r
- $this->initBlacklist();\r
- $this->initApplications();\r
- $this->initCoreObjects();\r
- }\r
- \r
- /**\r
- * Replacement of the "__destruct()" method.\r
- * Seems that under specific conditions (windows) the destructor is not called automatically.\r
- * So we use the php register_shutdown_function to register an own destructor method.\r
- * Flushs the output, updates the session and executes the shutdown queries.\r
- */\r
- public static function destruct() {\r
- // flush ouput\r
- if (ob_get_level() && ini_get('output_handler')) {\r
- ob_flush();\r
- }\r
- else {\r
- flush();\r
- }\r
- \r
- // update session\r
- if (is_object(self::getSession())) {\r
- self::getSession()->update();\r
- }\r
- \r
- // close cache source\r
- if (is_object(CacheHandler::getInstance()) && is_object(CacheHandler::getInstance()->getCacheSource())) {\r
- CacheHandler::getInstance()->getCacheSource()->close();\r
- }\r
- \r
- // execute shutdown actions\r
- StorageHandler::getInstance()->shutdown();\r
- }\r
- \r
- /**\r
- * Removes slashes in superglobal gpc data arrays if 'magic quotes gpc' is enabled.\r
- */\r
- protected function initMagicQuotes() {\r
- if (function_exists('get_magic_quotes_gpc')) {\r
- if (@get_magic_quotes_gpc()) {\r
- if (count($_REQUEST)) {\r
- $_REQUEST = util\ArrayUtil::stripslashes($_REQUEST);\r
- }\r
- if (count($_POST)) {\r
- $_POST = util\ArrayUtil::stripslashes($_POST);\r
- }\r
- if (count($_GET)) {\r
- $_GET = util\ArrayUtil::stripslashes($_GET);\r
- }\r
- if (count($_COOKIE)) {\r
- $_COOKIE = util\ArrayUtil::stripslashes($_COOKIE);\r
- }\r
- if (count($_FILES)) {\r
- foreach ($_FILES as $name => $attributes) {\r
- foreach ($attributes as $key => $value) {\r
- if ($key != 'tmp_name') {\r
- $_FILES[$name][$key] = util\ArrayUtil::stripslashes($value);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
- \r
- if (function_exists('set_magic_quotes_runtime')) {\r
- @set_magic_quotes_runtime(0);\r
- }\r
- }\r
- \r
- /**\r
- * Returns the database object.\r
- *\r
- * @return wcf\system\database\Database\r
- */\r
- public static final function getDB() {\r
- return self::$dbObj;\r
- }\r
- \r
- /**\r
- * Returns the session object.\r
- *\r
- * @return wcf\system\session\SessionHandler\r
- */\r
- public static final function getSession() {\r
- return self::$sessionObj;\r
- }\r
- \r
- /**\r
- * Returns the user object.\r
- *\r
- * @return wcf\data\user\User\r
- */\r
- public static final function getUser() {\r
- return self::$userObj;\r
- }\r
- \r
- /**\r
- * Returns the language object.\r
- *\r
- * @return wcf\data\language\Language\r
- */\r
- public static final function getLanguage() {\r
- return self::$languageObj;\r
- }\r
- \r
- /**\r
- * Returns the template object.\r
- *\r
- * @return wcf\system\template\TemplateEngine\r
- */\r
- public static final function getTPL() {\r
- return self::$tplObj;\r
- }\r
- \r
- /**\r
- * Calls the show method on the given exception.\r
- *\r
- * @param \Exception $e\r
- */\r
- public static final function handleException(\Exception $e) {\r
- if ($e instanceof exception\IPrintableException) {\r
- $e->show();\r
- exit;\r
- }\r
- \r
- print $e;\r
- exit;\r
- }\r
- \r
- /**\r
- * Catches php errors and throws instead a system exception.\r
- *\r
- * @param integer $errorNo\r
- * @param string $message\r
- * @param string $filename\r
- * @param integer $lineNo\r
- */\r
- public static final function handleError($errorNo, $message, $filename, $lineNo) {\r
- if (error_reporting() != 0) {\r
- $type = 'error';\r
- switch ($errorNo) {\r
- case 2: $type = 'warning';\r
- break;\r
- case 8: $type = 'notice';\r
- break;\r
- }\r
- \r
- throw new exception\SystemException('PHP '.$type.' in file '.$filename.' ('.$lineNo.'): '.$message, 0);\r
- }\r
- }\r
- \r
- /**\r
- * Loads the database configuration and creates a new connection to the database.\r
- */\r
- protected function initDB() {\r
- // get configuration\r
- $dbHost = $dbUser = $dbPassword = $dbName = '';\r
- $dbPort = 0;\r
- $dbClass = 'wcf\system\database\MySQLDatabase';\r
- require_once(WCF_DIR.'config.inc.php');\r
- \r
- // create database connection\r
- self::$dbObj = new $dbClass($dbHost, $dbUser, $dbPassword, $dbName, $dbPort);\r
- }\r
- \r
- /**\r
- * Initialises the cache handler and loads the default cache resources.\r
- */\r
- protected function initCache() {\r
- $this->loadDefaultCacheResources();\r
- }\r
- \r
- /**\r
- * Loads the default cache resources.\r
- */\r
- protected function loadDefaultCacheResources() {\r
- CacheHandler::getInstance()->addResource('languages', WCF_DIR.'cache/cache.languages.php', 'wcf\system\cache\CacheBuilderLanguage');\r
- CacheHandler::getInstance()->addResource('spiders', WCF_DIR.'cache/cache.spiders.php', 'wcf\system\cache\CacheBuilderSpider');\r
- CacheHandler::getInstance()->addResource('languages', WCF_DIR.'cache/cache.languages.php', 'wcf\system\cache\builder\CacheBuilderLanguage');\r
- CacheHandler::getInstance()->addResource('spiders', WCF_DIR.'cache/cache.spiders.php', 'wcf\system\cache\builder\CacheBuilderSpider');\r
- if (defined('PACKAGE_ID')) {\r
- CacheHandler::getInstance()->addResource('coreObjects-'.PACKAGE_ID, WCF_DIR.'cache/cache.coreObjects-'.PACKAGE_ID.'.php', 'wcf\system\cache\CacheBuilderCoreObject');\r
- CacheHandler::getInstance()->addResource('coreObjects-'.PACKAGE_ID, WCF_DIR.'cache/cache.coreObjects-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderCoreObject');\r
- }\r
- }\r
- \r
- /**\r
- * Includes the options file.\r
- * If the option file doesn't exist, the rebuild of it is started.\r
- */\r
- protected function initOptions() {\r
- // get options file name\r
- $optionsFile = $this->getOptionsFilename();\r
- \r
- // create options file if doesn't exist\r
- if (!file_exists($optionsFile) || filemtime($optionsFile) <= 1) {\r
- \wcf\data\option\OptionEditor::rebuildFile($optionsFile);\r
- }\r
- require_once($optionsFile);\r
- }\r
- \r
- /**\r
- * Returns the name of the options file.\r
- *\r
- * @return string name of the options file\r
- */\r
- protected function getOptionsFilename() {\r
- return WCF_DIR.'options.inc.php';\r
- }\r
- \r
- /**\r
- * Starts the session system.\r
- */\r
- protected function initSession() {\r
- $factory = new SessionFactory();\r
- $factory->load();\r
- \r
- self::$sessionObj = SessionHandler::getInstance();\r
- self::$userObj = self::getSession()->getUser();\r
- }\r
- \r
- /**\r
- * Initialises the language engine.\r
- */\r
- protected function initLanguage() {\r
- if (isset($_GET['l']) && !self::getUser()->userID) {\r
- self::getSession()->setLanguageID(intval($_GET['l']));\r
- }\r
- \r
- // set mb settings\r
- mb_internal_encoding('UTF-8');\r
- if (function_exists('mb_regex_encoding')) mb_regex_encoding('UTF-8');\r
- mb_language('uni');\r
- \r
- // get language\r
- self::$languageObj = LanguageFactory::getLanguage(self::getSession()->getLanguageID());\r
- }\r
- \r
- /**\r
- * Initialises the template engine.\r
- */\r
- protected function initTPL() {\r
- self::$tplObj = TemplateEngine::getInstance();\r
- self::getTPL()->setLanguageID(self::getLanguage()->languageID);\r
- $this->assignDefaultTemplateVariables();\r
- }\r
- \r
- /**\r
- * Executes the blacklist.\r
- */\r
- protected function initBlacklist() {\r
- if (defined('BLACKLIST_IP_ADDRESSES') && BLACKLIST_IP_ADDRESSES != '') {\r
- if (!util\StringUtil::executeWordFilter(WCF::getSession()->ipAddress, BLACKLIST_IP_ADDRESSES)) {\r
- throw new exception\PermissionDeniedException();\r
- }\r
- }\r
- if (defined('BLACKLIST_USER_AGENTS') && BLACKLIST_USER_AGENTS != '') {\r
- if (!util\StringUtil::executeWordFilter(WCF::getSession()->userAgent, BLACKLIST_USER_AGENTS)) {\r
- throw new exception\PermissionDeniedException();\r
- }\r
- }\r
- if (defined('BLACKLIST_HOSTNAMES') && BLACKLIST_HOSTNAMES != '') {\r
- if (!util\StringUtil::executeWordFilter(@gethostbyaddr(WCF::getSession()->ipAddress), BLACKLIST_HOSTNAMES)) {\r
- throw new exception\PermissionDeniedException();\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Initialises applications.\r
- *\r
- * @todo Determine all required applications as such connected\r
- * with each other. Ensure all applications implement the\r
- * 'Application' interface.\r
- */\r
- protected function initApplications() {\r
- if (PACKAGE_ID == 1) return;\r
- \r
- // prepare statement\r
- $sql = "SELECT package, packageDir\r
- FROM wcf".WCF_N."_package\r
- WHERE packageID = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- \r
- // start main application\r
- $application = ApplicationHandler::getInstance()->getActiveApplication();\r
- $this->loadApplication($statement, $application);\r
- \r
- // start dependent applications\r
- $applications = ApplicationHandler::getInstance()->getDependentApplications();\r
- foreach ($applications as $application) {\r
- $this->loadApplication($statement, $application, true);\r
- }\r
- }\r
- \r
- /**\r
- * Loads an application.\r
- *\r
- * @param wcf\system\database\statement\PreparedStatement $statement\r
- * @param wcf\data\application\Application $application\r
- * @param boolean $isDependentApplication\r
- */ \r
- protected function loadApplication(PreparedStatement $statement, Application $application, $isDepedentApplication = false) {\r
- $statement->execute(array($application->packageID));\r
- $row = $statement->fetchArray();\r
- \r
- $abbreviation = ApplicationHandler::getInstance()->getAbbreviation($application->packageID);\r
- $packageDir = util\FileUtil::getRealPath(WCF_DIR.$row['packageDir']);\r
- self::$autoloadDirectories[$abbreviation] = $packageDir . 'lib/';\r
- \r
- $className = $abbreviation.'\system\\'.strtoupper($abbreviation).'Core';\r
- if (class_exists($className) && util\ClassUtil::isInstanceOf($className, 'wcf\system\application\IApplication')) {\r
- // include config file\r
- $configPath = $packageDir . PackageInstallationDispatcher::CONFIG_FILE;\r
- if (file_exists($configPath)) {\r
- require_once($configPath);\r
- }\r
- else {\r
- throw new exception\SystemException('Unable to load configuration for '.$row['package']);\r
- }\r
- \r
- // start application\r
- new $className();\r
- }\r
- else {\r
- unset(self::$autoloadDirectories[$abbreviation]);\r
- throw new exception\SystemException('Unable to run '.$row['package'].', '.$className.' missing.');\r
- }\r
- }\r
- \r
- /**\r
- * Initializes core object cache.\r
- */\r
- protected function initCoreObjects() {\r
- // ignore core objects if installing WCF\r
- if (PACKAGE_ID == 0) {\r
- return;\r
- }\r
- \r
- self::$coreObjectCache = CacheHandler::getInstance()->get('coreObjects-'.PACKAGE_ID);\r
- self::$packageDependencies = \wcf\system\package\PackageDependencyHandler::getDependencies();\r
- }\r
- \r
- /**\r
- * Assigns some default variables to the template engine.\r
- */\r
- protected function assignDefaultTemplateVariables() {\r
- self::getTPL()->registerPrefilter(array('event', 'hascontent', 'lang'));\r
- self::getTPL()->assign(array('__wcf' => $this));\r
- }\r
- \r
- /**\r
- * Wrapper for the getter methods of this class.\r
- *\r
- * @param string $name\r
- * @return mixed value\r
- */\r
- public function __get($name) {\r
- $method = 'get'.ucfirst($name);\r
- if (method_exists($this, $method)) {\r
- return $this->$method();\r
- }\r
- \r
- throw new exception\SystemException("method '".$method."' does not exist in class WCF");\r
- }\r
- \r
- /**\r
- * Changes the active language.\r
- *\r
- * @param integer $languageID\r
- */\r
- public static final function setLanguage($languageID) {\r
- self::$languageObj = LanguageFactory::getLanguage($languageID);\r
- self::getTPL()->setLanguageID(self::getLanguage()->languageID);\r
- }\r
- \r
- /**\r
- * Includes the required util or exception classes automatically.\r
- *\r
- * @param string $className\r
- * @see spl_autoload_register()\r
- */\r
- public static final function autoload($className) {\r
- $namespaces = explode('\\', $className);\r
- if (count($namespaces) > 1) {\r
- $applicationPrefix = array_shift($namespaces);\r
- if (isset(self::$autoloadDirectories[$applicationPrefix])) {\r
- $classPath = self::$autoloadDirectories[$applicationPrefix] . implode('/', $namespaces) . '.class.php';\r
- if (file_exists($classPath)) {\r
- require_once($classPath);\r
- }\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see WCF::__callStatic()\r
- */\r
- public final function __call($name, array $arguments) {\r
- // bug fix to avoid php crash, see http://bugs.php.net/bug.php?id=55020\r
- if (!method_exists($this, $name)) {\r
- return self::__callStatic($name, $arguments);\r
- }\r
- \r
- return $this->$name($arguments);\r
- }\r
- \r
- /**\r
- * Returns dynamically loaded core objects.\r
- *\r
- * @param string $name\r
- * @param array $arguments\r
- */\r
- public static final function __callStatic($name, array $arguments) {\r
- $className = preg_replace('~^get~', '', $name);\r
- \r
- if (isset(self::$coreObject[$className])) {\r
- return self::$coreObject[$className];\r
- }\r
- \r
- $objectName = self::getCoreObject($className);\r
- if ($objectName === null) {\r
- throw new exception\SystemException("Core object '".$className."' is unknown.");\r
- }\r
- \r
- if (class_exists($objectName)) {\r
- if (!(util\ClassUtil::isInstanceOf($objectName, 'wcf\system\SingletonFactory'))) {\r
- throw new exception\SystemException("class '".$objectName."' does not implement the interface 'SingletonFactory'", 11010);\r
- }\r
- \r
- self::$coreObject[$className] = call_user_func(array($objectName, 'getInstance'));\r
- return self::$coreObject[$className];\r
- }\r
- }\r
- \r
- /**\r
- * Searches for cached core object definition.\r
- *\r
- * @param string $className\r
- * @return string\r
- */\r
- protected static final function getCoreObject($className) {\r
- foreach (self::$packageDependencies as $packageID) {\r
- if (isset(self::$coreObjectCache[$packageID][$className])) {\r
- return self::$coreObjectCache[$packageID][$className];\r
- }\r
- }\r
- \r
- return null;\r
- }\r
-}\r
+<?php
+namespace wcf\system;
+use wcf\data\application\Application;
+use wcf\data\package\Package;
+use wcf\system\application\ApplicationHandler;
+use wcf\system\cache\CacheHandler;
+use wcf\system\database\statement\PreparedStatement;
+use wcf\system\language\LanguageFactory;
+use wcf\system\package\PackageInstallationDispatcher;
+use wcf\system\session\SessionFactory;
+use wcf\system\session\SessionHandler;
+use wcf\system\storage\StorageHandler;
+use wcf\system\template\TemplateEngine;
+use wcf\system\exception;
+use wcf\util;
+
+// try to disable execution time limit
+@set_time_limit(0);
+
+// define current wcf version
+define('WCF_VERSION', '2.0.0 Alpha 1 (Maelstrom)');
+
+// define current unix timestamp
+define('TIME_NOW', time());
+
+// wcf imports
+if (!defined('NO_IMPORTS')) {
+ require_once(WCF_DIR.'lib/core.functions.php');
+}
+
+/**
+ * WCF is the central class for the community framework.
+ * It holds the database connection, access to template and language engine.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system
+ * @category Community Framework
+ */
+class WCF {
+ /**
+ * list of autoload directories
+ *
+ * @var array
+ */
+ protected static $autoloadDirectories = array();
+
+ /**
+ * list of unique instances of each core object
+ *
+ * @var array<wcf\system\SingletonFactory>
+ */
+ protected static $coreObject = array();
+
+ /**
+ * list of cached core objects
+ *
+ * @var array<array>
+ */
+ protected static $coreObjectCache = array();
+
+ /**
+ * list of package dependencies
+ *
+ * @var array
+ */
+ protected static $packageDependencies = array();
+
+ /**
+ * database object
+ *
+ * @var wcf\system\database\Database
+ */
+ protected static $dbObj = null;
+
+ /**
+ * language object
+ *
+ * @var wcf\system\language\Language
+ */
+ protected static $languageObj = null;
+
+ /**
+ * session object
+ *
+ * @var wcf\system\session\SessionHandler
+ */
+ protected static $sessionObj = null;
+
+ /**
+ * template object
+ *
+ * @var wcf\system\template\TemplateEngine
+ */
+ protected static $tplObj = null;
+
+ /**
+ * current user object
+ *
+ * @var wcf\data\user\User
+ */
+ protected static $userObj = null;
+
+ /**
+ * Calls all init functions of the WCF class.
+ */
+ public function __construct() {
+ // add autoload directory
+ self::$autoloadDirectories['wcf'] = WCF_DIR . 'lib/';
+
+ // define tmp directory
+ if (!defined('TMP_DIR')) define('TMP_DIR', util\BasicFileUtil::getTempFolder());
+
+ // start initialization
+ $this->initMagicQuotes();
+ $this->initDB();
+ $this->initOptions();
+ $this->initCache();
+ $this->initSession();
+ $this->initLanguage();
+ $this->initTPL();
+ $this->initBlacklist();
+ $this->initApplications();
+ $this->initCoreObjects();
+ }
+
+ /**
+ * Replacement of the "__destruct()" method.
+ * Seems that under specific conditions (windows) the destructor is not called automatically.
+ * So we use the php register_shutdown_function to register an own destructor method.
+ * Flushs the output, updates the session and executes the shutdown queries.
+ */
+ public static function destruct() {
+ // flush ouput
+ if (ob_get_level() && ini_get('output_handler')) {
+ ob_flush();
+ }
+ else {
+ flush();
+ }
+
+ // update session
+ if (is_object(self::getSession())) {
+ self::getSession()->update();
+ }
+
+ // close cache source
+ if (is_object(CacheHandler::getInstance()) && is_object(CacheHandler::getInstance()->getCacheSource())) {
+ CacheHandler::getInstance()->getCacheSource()->close();
+ }
+
+ // execute shutdown actions
+ StorageHandler::getInstance()->shutdown();
+ }
+
+ /**
+ * Removes slashes in superglobal gpc data arrays if 'magic quotes gpc' is enabled.
+ */
+ protected function initMagicQuotes() {
+ if (function_exists('get_magic_quotes_gpc')) {
+ if (@get_magic_quotes_gpc()) {
+ if (count($_REQUEST)) {
+ $_REQUEST = util\ArrayUtil::stripslashes($_REQUEST);
+ }
+ if (count($_POST)) {
+ $_POST = util\ArrayUtil::stripslashes($_POST);
+ }
+ if (count($_GET)) {
+ $_GET = util\ArrayUtil::stripslashes($_GET);
+ }
+ if (count($_COOKIE)) {
+ $_COOKIE = util\ArrayUtil::stripslashes($_COOKIE);
+ }
+ if (count($_FILES)) {
+ foreach ($_FILES as $name => $attributes) {
+ foreach ($attributes as $key => $value) {
+ if ($key != 'tmp_name') {
+ $_FILES[$name][$key] = util\ArrayUtil::stripslashes($value);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (function_exists('set_magic_quotes_runtime')) {
+ @set_magic_quotes_runtime(0);
+ }
+ }
+
+ /**
+ * Returns the database object.
+ *
+ * @return wcf\system\database\Database
+ */
+ public static final function getDB() {
+ return self::$dbObj;
+ }
+
+ /**
+ * Returns the session object.
+ *
+ * @return wcf\system\session\SessionHandler
+ */
+ public static final function getSession() {
+ return self::$sessionObj;
+ }
+
+ /**
+ * Returns the user object.
+ *
+ * @return wcf\data\user\User
+ */
+ public static final function getUser() {
+ return self::$userObj;
+ }
+
+ /**
+ * Returns the language object.
+ *
+ * @return wcf\data\language\Language
+ */
+ public static final function getLanguage() {
+ return self::$languageObj;
+ }
+
+ /**
+ * Returns the template object.
+ *
+ * @return wcf\system\template\TemplateEngine
+ */
+ public static final function getTPL() {
+ return self::$tplObj;
+ }
+
+ /**
+ * Calls the show method on the given exception.
+ *
+ * @param \Exception $e
+ */
+ public static final function handleException(\Exception $e) {
+ if ($e instanceof exception\IPrintableException) {
+ $e->show();
+ exit;
+ }
+
+ print $e;
+ exit;
+ }
+
+ /**
+ * Catches php errors and throws instead a system exception.
+ *
+ * @param integer $errorNo
+ * @param string $message
+ * @param string $filename
+ * @param integer $lineNo
+ */
+ public static final function handleError($errorNo, $message, $filename, $lineNo) {
+ if (error_reporting() != 0) {
+ $type = 'error';
+ switch ($errorNo) {
+ case 2: $type = 'warning';
+ break;
+ case 8: $type = 'notice';
+ break;
+ }
+
+ throw new exception\SystemException('PHP '.$type.' in file '.$filename.' ('.$lineNo.'): '.$message, 0);
+ }
+ }
+
+ /**
+ * Loads the database configuration and creates a new connection to the database.
+ */
+ protected function initDB() {
+ // get configuration
+ $dbHost = $dbUser = $dbPassword = $dbName = '';
+ $dbPort = 0;
+ $dbClass = 'wcf\system\database\MySQLDatabase';
+ require_once(WCF_DIR.'config.inc.php');
+
+ // create database connection
+ self::$dbObj = new $dbClass($dbHost, $dbUser, $dbPassword, $dbName, $dbPort);
+ }
+
+ /**
+ * Initialises the cache handler and loads the default cache resources.
+ */
+ protected function initCache() {
+ $this->loadDefaultCacheResources();
+ }
+
+ /**
+ * Loads the default cache resources.
+ */
+ protected function loadDefaultCacheResources() {
+ CacheHandler::getInstance()->addResource('languages', WCF_DIR.'cache/cache.languages.php', 'wcf\system\cache\CacheBuilderLanguage');
+ CacheHandler::getInstance()->addResource('spiders', WCF_DIR.'cache/cache.spiders.php', 'wcf\system\cache\CacheBuilderSpider');
+ CacheHandler::getInstance()->addResource('languages', WCF_DIR.'cache/cache.languages.php', 'wcf\system\cache\builder\CacheBuilderLanguage');
+ CacheHandler::getInstance()->addResource('spiders', WCF_DIR.'cache/cache.spiders.php', 'wcf\system\cache\builder\CacheBuilderSpider');
+ if (defined('PACKAGE_ID')) {
+ CacheHandler::getInstance()->addResource('coreObjects-'.PACKAGE_ID, WCF_DIR.'cache/cache.coreObjects-'.PACKAGE_ID.'.php', 'wcf\system\cache\CacheBuilderCoreObject');
+ CacheHandler::getInstance()->addResource('coreObjects-'.PACKAGE_ID, WCF_DIR.'cache/cache.coreObjects-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderCoreObject');
+ }
+ }
+
+ /**
+ * Includes the options file.
+ * If the option file doesn't exist, the rebuild of it is started.
+ */
+ protected function initOptions() {
+ // get options file name
+ $optionsFile = $this->getOptionsFilename();
+
+ // create options file if doesn't exist
+ if (!file_exists($optionsFile) || filemtime($optionsFile) <= 1) {
+ \wcf\data\option\OptionEditor::rebuildFile($optionsFile);
+ }
+ require_once($optionsFile);
+ }
+
+ /**
+ * Returns the name of the options file.
+ *
+ * @return string name of the options file
+ */
+ protected function getOptionsFilename() {
+ return WCF_DIR.'options.inc.php';
+ }
+
+ /**
+ * Starts the session system.
+ */
+ protected function initSession() {
+ $factory = new SessionFactory();
+ $factory->load();
+
+ self::$sessionObj = SessionHandler::getInstance();
+ self::$userObj = self::getSession()->getUser();
+ }
+
+ /**
+ * Initialises the language engine.
+ */
+ protected function initLanguage() {
+ if (isset($_GET['l']) && !self::getUser()->userID) {
+ self::getSession()->setLanguageID(intval($_GET['l']));
+ }
+
+ // set mb settings
+ mb_internal_encoding('UTF-8');
+ if (function_exists('mb_regex_encoding')) mb_regex_encoding('UTF-8');
+ mb_language('uni');
+
+ // get language
+ self::$languageObj = LanguageFactory::getLanguage(self::getSession()->getLanguageID());
+ }
+
+ /**
+ * Initialises the template engine.
+ */
+ protected function initTPL() {
+ self::$tplObj = TemplateEngine::getInstance();
+ self::getTPL()->setLanguageID(self::getLanguage()->languageID);
+ $this->assignDefaultTemplateVariables();
+ }
+
+ /**
+ * Executes the blacklist.
+ */
+ protected function initBlacklist() {
+ if (defined('BLACKLIST_IP_ADDRESSES') && BLACKLIST_IP_ADDRESSES != '') {
+ if (!util\StringUtil::executeWordFilter(WCF::getSession()->ipAddress, BLACKLIST_IP_ADDRESSES)) {
+ throw new exception\PermissionDeniedException();
+ }
+ }
+ if (defined('BLACKLIST_USER_AGENTS') && BLACKLIST_USER_AGENTS != '') {
+ if (!util\StringUtil::executeWordFilter(WCF::getSession()->userAgent, BLACKLIST_USER_AGENTS)) {
+ throw new exception\PermissionDeniedException();
+ }
+ }
+ if (defined('BLACKLIST_HOSTNAMES') && BLACKLIST_HOSTNAMES != '') {
+ if (!util\StringUtil::executeWordFilter(@gethostbyaddr(WCF::getSession()->ipAddress), BLACKLIST_HOSTNAMES)) {
+ throw new exception\PermissionDeniedException();
+ }
+ }
+ }
+
+ /**
+ * Initialises applications.
+ *
+ * @todo Determine all required applications as such connected
+ * with each other. Ensure all applications implement the
+ * 'Application' interface.
+ */
+ protected function initApplications() {
+ if (PACKAGE_ID == 1) return;
+
+ // prepare statement
+ $sql = "SELECT package, packageDir
+ FROM wcf".WCF_N."_package
+ WHERE packageID = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+
+ // start main application
+ $application = ApplicationHandler::getInstance()->getActiveApplication();
+ $this->loadApplication($statement, $application);
+
+ // start dependent applications
+ $applications = ApplicationHandler::getInstance()->getDependentApplications();
+ foreach ($applications as $application) {
+ $this->loadApplication($statement, $application, true);
+ }
+ }
+
+ /**
+ * Loads an application.
+ *
+ * @param wcf\system\database\statement\PreparedStatement $statement
+ * @param wcf\data\application\Application $application
+ * @param boolean $isDependentApplication
+ */
+ protected function loadApplication(PreparedStatement $statement, Application $application, $isDepedentApplication = false) {
+ $statement->execute(array($application->packageID));
+ $row = $statement->fetchArray();
+
+ $abbreviation = ApplicationHandler::getInstance()->getAbbreviation($application->packageID);
+ $packageDir = util\FileUtil::getRealPath(WCF_DIR.$row['packageDir']);
+ self::$autoloadDirectories[$abbreviation] = $packageDir . 'lib/';
+
+ $className = $abbreviation.'\system\\'.strtoupper($abbreviation).'Core';
+ if (class_exists($className) && util\ClassUtil::isInstanceOf($className, 'wcf\system\application\IApplication')) {
+ // include config file
+ $configPath = $packageDir . PackageInstallationDispatcher::CONFIG_FILE;
+ if (file_exists($configPath)) {
+ require_once($configPath);
+ }
+ else {
+ throw new exception\SystemException('Unable to load configuration for '.$row['package']);
+ }
+
+ // start application
+ new $className();
+ }
+ else {
+ unset(self::$autoloadDirectories[$abbreviation]);
+ throw new exception\SystemException('Unable to run '.$row['package'].', '.$className.' missing.');
+ }
+ }
+
+ /**
+ * Initializes core object cache.
+ */
+ protected function initCoreObjects() {
+ // ignore core objects if installing WCF
+ if (PACKAGE_ID == 0) {
+ return;
+ }
+
+ self::$coreObjectCache = CacheHandler::getInstance()->get('coreObjects-'.PACKAGE_ID);
+ self::$packageDependencies = \wcf\system\package\PackageDependencyHandler::getDependencies();
+ }
+
+ /**
+ * Assigns some default variables to the template engine.
+ */
+ protected function assignDefaultTemplateVariables() {
+ self::getTPL()->registerPrefilter(array('event', 'hascontent', 'lang'));
+ self::getTPL()->assign(array('__wcf' => $this));
+ }
+
+ /**
+ * Wrapper for the getter methods of this class.
+ *
+ * @param string $name
+ * @return mixed value
+ */
+ public function __get($name) {
+ $method = 'get'.ucfirst($name);
+ if (method_exists($this, $method)) {
+ return $this->$method();
+ }
+
+ throw new exception\SystemException("method '".$method."' does not exist in class WCF");
+ }
+
+ /**
+ * Changes the active language.
+ *
+ * @param integer $languageID
+ */
+ public static final function setLanguage($languageID) {
+ self::$languageObj = LanguageFactory::getLanguage($languageID);
+ self::getTPL()->setLanguageID(self::getLanguage()->languageID);
+ }
+
+ /**
+ * Includes the required util or exception classes automatically.
+ *
+ * @param string $className
+ * @see spl_autoload_register()
+ */
+ public static final function autoload($className) {
+ $namespaces = explode('\\', $className);
+ if (count($namespaces) > 1) {
+ $applicationPrefix = array_shift($namespaces);
+ if (isset(self::$autoloadDirectories[$applicationPrefix])) {
+ $classPath = self::$autoloadDirectories[$applicationPrefix] . implode('/', $namespaces) . '.class.php';
+ if (file_exists($classPath)) {
+ require_once($classPath);
+ }
+ }
+ }
+ }
+
+ /**
+ * @see WCF::__callStatic()
+ */
+ public final function __call($name, array $arguments) {
+ // bug fix to avoid php crash, see http://bugs.php.net/bug.php?id=55020
+ if (!method_exists($this, $name)) {
+ return self::__callStatic($name, $arguments);
+ }
+
+ return $this->$name($arguments);
+ }
+
+ /**
+ * Returns dynamically loaded core objects.
+ *
+ * @param string $name
+ * @param array $arguments
+ */
+ public static final function __callStatic($name, array $arguments) {
+ $className = preg_replace('~^get~', '', $name);
+
+ if (isset(self::$coreObject[$className])) {
+ return self::$coreObject[$className];
+ }
+
+ $objectName = self::getCoreObject($className);
+ if ($objectName === null) {
+ throw new exception\SystemException("Core object '".$className."' is unknown.");
+ }
+
+ if (class_exists($objectName)) {
+ if (!(util\ClassUtil::isInstanceOf($objectName, 'wcf\system\SingletonFactory'))) {
+ throw new exception\SystemException("class '".$objectName."' does not implement the interface 'SingletonFactory'", 11010);
+ }
+
+ self::$coreObject[$className] = call_user_func(array($objectName, 'getInstance'));
+ return self::$coreObject[$className];
+ }
+ }
+
+ /**
+ * Searches for cached core object definition.
+ *
+ * @param string $className
+ * @return string
+ */
+ protected static final function getCoreObject($className) {
+ foreach (self::$packageDependencies as $packageID) {
+ if (isset(self::$coreObjectCache[$packageID][$className])) {
+ return self::$coreObjectCache[$packageID][$className];
+ }
+ }
+
+ return null;
+ }
+}
-<?php\r
-namespace wcf\system;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\session\ACPSessionFactory;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\template\ACPTemplateEngine;\r
-use wcf\util;\r
-\r
-/**\r
- * Extends WCF class with functions for the admin control panel.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system\r
- * @category Community Framework\r
- */\r
-class WCFACP extends WCF {\r
- /**\r
- * Calls all init functions of the WCF and the WCFACP class. \r
- */\r
- public function __construct() {\r
- // add autoload directory\r
- self::$autoloadDirectories['wcf'] = WCF_DIR . 'lib/';\r
- \r
- // define tmp directory\r
- if (!defined('TMP_DIR')) define('TMP_DIR', util\BasicFileUtil::getTempFolder());\r
- \r
- // start initialization\r
- $this->initMagicQuotes();\r
- $this->initDB();\r
- $this->initPackage();\r
- $this->initOptions();\r
- $this->initCache();\r
- $this->initSession();\r
- $this->initLanguage();\r
- $this->initTPL();\r
- $this->initBlacklist();\r
- $this->initAuth();\r
- $this->initCoreObjects();\r
- }\r
- \r
- /**\r
- * Does the user authentication.\r
- */\r
- protected function initAuth() {\r
- if ((!isset($_REQUEST['page']) || ($_REQUEST['page'] != 'Logout' && $_REQUEST['page'] != 'ACPCaptcha')) && (isset($_REQUEST['page']) || !isset($_REQUEST['form']) || $_REQUEST['form'] != 'Login')) {\r
- if (WCF::getUser()->userID == 0) {\r
- util\HeaderUtil::redirect('index.php?form=Login'.SID_ARG_2ND_NOT_ENCODED);\r
- exit;\r
- }\r
- else {\r
- WCF::getSession()->checkPermission(array('admin.general.canUseAcp'));\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Starts the session system.\r
- */\r
- protected function initSession() {\r
- $factory = new ACPSessionFactory();\r
- $factory->load();\r
- \r
- self::$sessionObj = SessionHandler::getInstance();\r
- self::$userObj = self::getSession()->getUser();\r
- }\r
- \r
- /**\r
- * Initialises the template engine.\r
- */\r
- protected function initTPL() {\r
- self::$tplObj = ACPTemplateEngine::getInstance();\r
- self::getTPL()->setLanguageID(self::getLanguage()->languageID);\r
- $this->assignDefaultTemplateVariables();\r
- }\r
- \r
- /**\r
- * @see WCF::assignDefaultTemplateVariables()\r
- */\r
- protected function assignDefaultTemplateVariables() {\r
- parent::assignDefaultTemplateVariables();\r
- \r
- self::getTPL()->assign(array(\r
- 'quickAccessPackages' => $this->getQuickAccessPackages(),\r
- //'timezone' => util\DateUtil::getTimezone()\r
- ));\r
- }\r
- \r
- /**\r
- * @see WCF::loadDefaultCacheResources()\r
- */\r
- protected function loadDefaultCacheResources() {\r
- parent::loadDefaultCacheResources();\r
- CacheHandler::getInstance()->addResource('packages', WCF_DIR.'cache/cache.packages.php', 'wcf\system\cache\builder\CacheBuilderPackage');\r
- }\r
- \r
- /**\r
- * Initialises the active package.\r
- */\r
- protected function initPackage() {\r
- // define active package id\r
- if (!defined('PACKAGE_ID')) {\r
- $packageID = self::getWcfPackageID();\r
- define('PACKAGE_ID', $packageID);\r
- }\r
- \r
- /*\r
- $packageID = 0;\r
- $packages = CacheHandler::getInstance()->get('packages');\r
- if (isset($_REQUEST['packageID'])) $packageID = intval($_REQUEST['packageID']);\r
- \r
- if (!isset($packages[$packageID]) || !$packages[$packageID]['standalone']) {\r
- // package id is invalid\r
- $packageID = self::getWcfPackageID();\r
- }\r
- \r
- // define active package id\r
- if (!defined('PACKAGE_ID')) define('PACKAGE_ID', $packageID);*/ \r
- }\r
- \r
- /**\r
- * Returns the package id of the wcf package.\r
- * \r
- * @return integer\r
- */\r
- public static final function getWcfPackageID() {\r
- // try to find package wcf id\r
- $sql = "SELECT packageID\r
- FROM wcf".WCF_N."_package\r
- WHERE package = 'com.woltlab.wcf'";\r
- $statement = WCFACP::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- $package = $statement->fetchArray();\r
- \r
- if (!$package) return 0;\r
- else return $package['packageID'];\r
- }\r
- \r
- /**\r
- * Returns a list of all installed standalone packages.\r
- * \r
- * @return array\r
- */\r
- protected function getQuickAccessPackages() {\r
- $quickAccessPackages = array();\r
- $packages = CacheHandler::getInstance()->get('packages');\r
- foreach ($packages as $packageID => $package) {\r
- if (!$package->standalone) break;\r
- if ($package->package != 'com.woltlab.wcf') {\r
- $quickAccessPackages[] = $package;\r
- }\r
- }\r
- \r
- return $quickAccessPackages;\r
- }\r
- \r
- /**\r
- * Checks whether the active user has entered the valid master password.\r
- */\r
- public static function checkMasterPassword() {\r
- if (defined('MODULE_MASTER_PASSWORD') && MODULE_MASTER_PASSWORD == 1 && !WCF::getSession()->getVar('masterPassword')) {\r
- if (file_exists(WCF_DIR.'acp/masterPassword.inc.php')) {\r
- require_once(WCF_DIR.'acp/masterPassword.inc.php');\r
- }\r
- if (defined('MASTER_PASSWORD') && defined('MASTER_PASSWORD_SALT')) {\r
- new \wcf\acp\form\MasterPasswordForm();\r
- exit;\r
- }\r
- else {\r
- new \wcf\acp\form\MasterPasswordInitForm();\r
- exit;\r
- }\r
- }\r
- }\r
-}\r
+<?php
+namespace wcf\system;
+use wcf\system\cache\CacheHandler;
+use wcf\system\session\ACPSessionFactory;
+use wcf\system\session\SessionHandler;
+use wcf\system\template\ACPTemplateEngine;
+use wcf\util;
+
+/**
+ * Extends WCF class with functions for the admin control panel.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system
+ * @category Community Framework
+ */
+class WCFACP extends WCF {
+ /**
+ * Calls all init functions of the WCF and the WCFACP class.
+ */
+ public function __construct() {
+ // add autoload directory
+ self::$autoloadDirectories['wcf'] = WCF_DIR . 'lib/';
+
+ // define tmp directory
+ if (!defined('TMP_DIR')) define('TMP_DIR', util\BasicFileUtil::getTempFolder());
+
+ // start initialization
+ $this->initMagicQuotes();
+ $this->initDB();
+ $this->initPackage();
+ $this->initOptions();
+ $this->initCache();
+ $this->initSession();
+ $this->initLanguage();
+ $this->initTPL();
+ $this->initBlacklist();
+ $this->initAuth();
+ $this->initCoreObjects();
+ }
+
+ /**
+ * Does the user authentication.
+ */
+ protected function initAuth() {
+ if ((!isset($_REQUEST['page']) || ($_REQUEST['page'] != 'Logout' && $_REQUEST['page'] != 'ACPCaptcha')) && (isset($_REQUEST['page']) || !isset($_REQUEST['form']) || $_REQUEST['form'] != 'Login')) {
+ if (WCF::getUser()->userID == 0) {
+ util\HeaderUtil::redirect('index.php?form=Login'.SID_ARG_2ND_NOT_ENCODED);
+ exit;
+ }
+ else {
+ WCF::getSession()->checkPermission(array('admin.general.canUseAcp'));
+ }
+ }
+ }
+
+ /**
+ * Starts the session system.
+ */
+ protected function initSession() {
+ $factory = new ACPSessionFactory();
+ $factory->load();
+
+ self::$sessionObj = SessionHandler::getInstance();
+ self::$userObj = self::getSession()->getUser();
+ }
+
+ /**
+ * Initialises the template engine.
+ */
+ protected function initTPL() {
+ self::$tplObj = ACPTemplateEngine::getInstance();
+ self::getTPL()->setLanguageID(self::getLanguage()->languageID);
+ $this->assignDefaultTemplateVariables();
+ }
+
+ /**
+ * @see WCF::assignDefaultTemplateVariables()
+ */
+ protected function assignDefaultTemplateVariables() {
+ parent::assignDefaultTemplateVariables();
+
+ self::getTPL()->assign(array(
+ 'quickAccessPackages' => $this->getQuickAccessPackages(),
+ //'timezone' => util\DateUtil::getTimezone()
+ ));
+ }
+
+ /**
+ * @see WCF::loadDefaultCacheResources()
+ */
+ protected function loadDefaultCacheResources() {
+ parent::loadDefaultCacheResources();
+ CacheHandler::getInstance()->addResource('packages', WCF_DIR.'cache/cache.packages.php', 'wcf\system\cache\builder\CacheBuilderPackage');
+ }
+
+ /**
+ * Initialises the active package.
+ */
+ protected function initPackage() {
+ // define active package id
+ if (!defined('PACKAGE_ID')) {
+ $packageID = self::getWcfPackageID();
+ define('PACKAGE_ID', $packageID);
+ }
+
+ /*
+ $packageID = 0;
+ $packages = CacheHandler::getInstance()->get('packages');
+ if (isset($_REQUEST['packageID'])) $packageID = intval($_REQUEST['packageID']);
+
+ if (!isset($packages[$packageID]) || !$packages[$packageID]['standalone']) {
+ // package id is invalid
+ $packageID = self::getWcfPackageID();
+ }
+
+ // define active package id
+ if (!defined('PACKAGE_ID')) define('PACKAGE_ID', $packageID);*/
+ }
+
+ /**
+ * Returns the package id of the wcf package.
+ *
+ * @return integer
+ */
+ public static final function getWcfPackageID() {
+ // try to find package wcf id
+ $sql = "SELECT packageID
+ FROM wcf".WCF_N."_package
+ WHERE package = 'com.woltlab.wcf'";
+ $statement = WCFACP::getDB()->prepareStatement($sql);
+ $statement->execute();
+ $package = $statement->fetchArray();
+
+ if (!$package) return 0;
+ else return $package['packageID'];
+ }
+
+ /**
+ * Returns a list of all installed standalone packages.
+ *
+ * @return array
+ */
+ protected function getQuickAccessPackages() {
+ $quickAccessPackages = array();
+ $packages = CacheHandler::getInstance()->get('packages');
+ foreach ($packages as $packageID => $package) {
+ if (!$package->standalone) break;
+ if ($package->package != 'com.woltlab.wcf') {
+ $quickAccessPackages[] = $package;
+ }
+ }
+
+ return $quickAccessPackages;
+ }
+
+ /**
+ * Checks whether the active user has entered the valid master password.
+ */
+ public static function checkMasterPassword() {
+ if (defined('MODULE_MASTER_PASSWORD') && MODULE_MASTER_PASSWORD == 1 && !WCF::getSession()->getVar('masterPassword')) {
+ if (file_exists(WCF_DIR.'acp/masterPassword.inc.php')) {
+ require_once(WCF_DIR.'acp/masterPassword.inc.php');
+ }
+ if (defined('MASTER_PASSWORD') && defined('MASTER_PASSWORD_SALT')) {
+ new \wcf\acp\form\MasterPasswordForm();
+ exit;
+ }
+ else {
+ new \wcf\acp\form\MasterPasswordInitForm();
+ exit;
+ }
+ }
+ }
+}
-<?php\r
-namespace wcf\system;\r
-use wcf\data\language\LanguageEditor;\r
-use wcf\data\language\SetupLanguage;\r
-use wcf\data\user\User;\r
-use wcf\data\user\UserAction;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\database\util\SQLParser;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\io\File;\r
-use wcf\system\io\Tar;\r
-use wcf\system\language\LanguageFactory;\r
-use wcf\system\package\PackageArchive;\r
-use wcf\system\session\ACPSessionFactory;\r
-use wcf\system\session\SessionHandler;\r
-use wcf\system\setup\Installer;\r
-use wcf\system\template\SetupTemplateEngine;\r
-use wcf\system\WCF;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-use wcf\util\UserUtil;\r
-use wcf\util\XML;\r
-\r
-// define\r
-define('PACKAGE_ID', '0');\r
-define('HTTP_ENABLE_NO_CACHE_HEADERS', 0);\r
-define('HTTP_ENABLE_GZIP', 0);\r
-define('HTTP_GZIP_LEVEL', 0);\r
-define('CACHE_SOURCE_TYPE', 'disk');\r
-define('ENABLE_SESSION_DATA_CACHE', 0);\r
-define('MODULE_MASTER_PASSWORD', 1);\r
-\r
-/**\r
- * WCFSetup executes the installation of the basic wcf systems.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system\r
- * @category Community Framework\r
- */\r
-class WCFSetup extends WCF {\r
- protected static $availableLanguages = array();\r
- protected static $selectedLanguageCode = 'en';\r
- protected static $selectedLanguages = array();\r
- protected static $wcfDir = '';\r
- protected static $installedFiles = array();\r
- protected static $setupPackageName = 'WoltLab Community Framework';\r
- protected static $developerMode = 0;\r
- protected static $dbClasses = array(\r
- 'MySQLDatabase' => array('class' => 'wcf\system\database\MySQLDatabase', 'minversion' => '5.1.17'), // MySQL 5.0.0+\r
- 'PostgreSQLDatabase' => array('class' => 'wcf\system\database\PostgreSQLDatabase', 'minversion' => '8.2.0') // PostgreSQL 8.2.0+\r
- );\r
- \r
- /**\r
- * Calls all init functions of the WCFSetup class and starts the setup process.\r
- */\r
- public function __construct() {\r
- @set_time_limit(0);\r
- $this->initMagicQuotes();\r
- $this->getDeveloperMode();\r
- $this->getLanguageSelection();\r
- $this->getWCFDir();\r
- $this->initLanguage();\r
- $this->initTPL();\r
- self::getLanguage()->loadLanguage();\r
- $this->getPackageName();\r
- \r
- // start setup\r
- $this->setup();\r
- }\r
- \r
- /**\r
- * Gets the status of the developer mode.\r
- */\r
- protected static function getDeveloperMode() {\r
- if (isset($_GET['dev'])) self::$developerMode = intval($_GET['dev']);\r
- else if (isset($_POST['dev'])) self::$developerMode = intval($_POST['dev']);\r
- }\r
- \r
- /**\r
- * Gets the selected language.\r
- */\r
- protected static function getLanguageSelection() {\r
- self::$availableLanguages = self::getAllLanguages();\r
- \r
- if (isset($_REQUEST['languageCode']) && in_array($_REQUEST['languageCode'], self::$availableLanguages)) {\r
- self::$selectedLanguageCode = $_REQUEST['languageCode'];\r
- }\r
- else {\r
- self::$selectedLanguageCode = LanguageFactory::getPreferredLanguage(self::$availableLanguages, self::$selectedLanguageCode);\r
- }\r
- \r
- if (isset($_POST['selectedLanguages']) && is_array($_POST['selectedLanguages'])) {\r
- self::$selectedLanguages = $_POST['selectedLanguages'];\r
- }\r
- }\r
- \r
- /**\r
- * Gets the available database classes.\r
- *\r
- * @return array\r
- */\r
- protected static function getAvailableDBClasses() {\r
- $availableDBClasses = array();\r
- foreach (self::$dbClasses as $class => $data) {\r
- if (call_user_func(array($data['class'], 'isSupported'))) {\r
- $availableDBClasses[$class] = $data;\r
- }\r
- }\r
- \r
- return $availableDBClasses;\r
- }\r
-\r
- /**\r
- * Gets the selected wcf dir from request.\r
- */\r
- protected static function getWCFDir() {\r
- if (isset($_REQUEST['wcfDir']) && $_REQUEST['wcfDir'] != '') {\r
- self::$wcfDir = FileUtil::addTrailingSlash(FileUtil::unifyDirSeperator($_REQUEST['wcfDir']));\r
- if (@file_exists(self::$wcfDir)) {\r
- define('RELATIVE_WCF_DIR', FileUtil::getRelativePath(INSTALL_SCRIPT_DIR, self::$wcfDir));\r
- }\r
- }\r
- \r
- define('WCF_DIR', self::$wcfDir);\r
- }\r
- \r
- /**\r
- * Initialises the language engine.\r
- */\r
- protected function initLanguage() {\r
- // set mb settings\r
- mb_internal_encoding('UTF-8');\r
- if (function_exists('mb_regex_encoding')) mb_regex_encoding('UTF-8');\r
- mb_language('uni');\r
- \r
- // init setup language\r
- self::$languageObj = new SetupLanguage(null, array(\r
- 'languageCode' => self::$selectedLanguageCode\r
- ));\r
- }\r
- \r
- /**\r
- * Initialises the template engine.\r
- */\r
- protected function initTPL() {\r
- self::$tplObj = SetupTemplateEngine::getInstance();\r
- self::getTPL()->setLanguageID(array_search(self::$selectedLanguageCode, self::$availableLanguages));\r
- self::getTPL()->setCompileDir(TMP_DIR);\r
- self::getTPL()->addTemplatePath(PACKAGE_ID, TMP_DIR);\r
- self::getTPL()->registerPrefilter(array('lang'));\r
- self::getTPL()->assign(array(\r
- '__wcf' => $this,\r
- 'tmpFilePrefix' => TMP_FILE_PREFIX,\r
- 'languageCode' => self::$selectedLanguageCode,\r
- 'selectedLanguages' => self::$selectedLanguages,\r
- 'wcfDir' => self::$wcfDir,\r
- 'developerMode' => self::$developerMode\r
- ));\r
- }\r
- \r
- /**\r
- * Returns all languages from WCFSetup.tar.gz.\r
- *\r
- * @return array\r
- */\r
- protected static function getAllLanguages() {\r
- $languages = $match = array();\r
- $tar = new Tar(SETUP_FILE);\r
- foreach ($tar->getContentList() as $file) {\r
- if (strpos($file['filename'], 'setup/lang/') === 0 && substr($file['filename'], -4) == '.xml' && preg_match('!^setup_([a-z]{2}(?:-[A-Za-z0-9]+)?(?:_[A-Za-z]{2})?)$!', basename($file['filename'], '.xml'), $match)) {\r
- $languages[] = $match[1];\r
- }\r
- }\r
- $tar->close();\r
-\r
- // sort languages by language code\r
- sort($languages);\r
-\r
- return $languages;\r
- }\r
- \r
- /**\r
- * Calculates the current state of the progress bar.\r
- *\r
- * @param integer $currentStep\r
- */\r
- protected function calcProgress($currentStep) {\r
- // count delivered packages\r
- $packages = 1; // one for wcf setup\r
- $tar = new Tar(SETUP_FILE);\r
- foreach ($tar->getContentList() as $file) {\r
- if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {\r
- $packages++;\r
- }\r
- }\r
- $tar->close();\r
- \r
- // calculate part of total install\r
- $part = 100 / $packages;\r
- \r
- // calculate progress\r
- $progress = round($part / 11 * $currentStep, 0);\r
- self::getTPL()->assign(array('progress' => $progress));\r
- }\r
- \r
- /**\r
- * Executes the setup steps.\r
- */\r
- protected function setup() {\r
- // get current step\r
- if (isset($_REQUEST['step'])) $step = $_REQUEST['step'];\r
- else $step = 'selectSetupLanguage';\r
-\r
- // execute current step\r
- switch ($step) {\r
- case 'selectSetupLanguage':\r
- if (!self::$developerMode) {\r
- $this->calcProgress(0);\r
- $this->selectSetupLanguage();\r
- break;\r
- }\r
- \r
- case 'showLicense':\r
- if (!self::$developerMode) {\r
- $this->calcProgress(1);\r
- $this->showLicense();\r
- break;\r
- }\r
- \r
- case 'showSystemRequirements':\r
- if (!self::$developerMode) {\r
- $this->calcProgress(2);\r
- $this->showSystemRequirements();\r
- break;\r
- }\r
- \r
- case 'searchWcfDir':\r
- $this->calcProgress(3);\r
- $this->searchWcfDir();\r
- break;\r
- \r
- case 'unzipFiles':\r
- $this->calcProgress(4);\r
- $this->unzipFiles();\r
- break;\r
- \r
- case 'selectLanguages':\r
- $this->calcProgress(5);\r
- $this->selectLanguages();\r
- break;\r
- \r
- case 'configureDB':\r
- $this->calcProgress(6);\r
- $this->configureDB();\r
- break;\r
- \r
- case 'createDB':\r
- $this->calcProgress(7);\r
- $this->createDB();\r
- break;\r
- \r
- case 'logFiles':\r
- $this->calcProgress(8);\r
- $this->logFiles();\r
- break;\r
- \r
- case 'installLanguage':\r
- $this->calcProgress(9);\r
- $this->installLanguage();\r
- break;\r
- \r
- case 'createUser':\r
- $this->calcProgress(10);\r
- $this->createUser();\r
- break;\r
- \r
- case 'installPackages':\r
- $this->calcProgress(11);\r
- $this->installPackages();\r
- break;\r
- }\r
- }\r
- \r
- /**\r
- * Shows the first setup page.\r
- */\r
- protected function selectSetupLanguage() {\r
- // build language list\r
- $languages = array();\r
- foreach (self::$availableLanguages as $languageCode) {\r
- $languages[$languageCode] = self::getLanguage()->get('wcf.global.language.'.$languageCode).' ('.$languageCode.')';\r
- }\r
- \r
- // sort languages\r
- StringUtil::sort($languages);\r
- \r
- WCF::getTPL()->assign(array(\r
- 'availableLanguages' => $languages,\r
- 'nextStep' => 'showLicense'\r
- ));\r
- WCF::getTPL()->display('stepSelectSetupLanguage');\r
- }\r
- \r
- /**\r
- * Shows the license agreement.\r
- */\r
- protected function showLicense() {\r
- if (isset($_POST['send'])) {\r
- if (isset($_POST['accepted'])) {\r
- $this->gotoNextStep('showSystemRequirements');\r
- exit;\r
- }\r
- else {\r
- WCF::getTPL()->assign(array('missingAcception' => true));\r
- }\r
- \r
- }\r
- \r
- if (file_exists(TMP_DIR.'setup/license/license_'.self::$selectedLanguageCode.'.txt')) {\r
- $license = file_get_contents(TMP_DIR.'setup/license/license_'.self::$selectedLanguageCode.'.txt');\r
- }\r
- else {\r
- $license = file_get_contents(TMP_DIR.'setup/license/license_en.txt');\r
- }\r
- \r
- WCF::getTPL()->assign(array(\r
- 'license' => $license,\r
- 'nextStep' => 'showLicense'\r
- ));\r
- WCF::getTPL()->display('stepShowLicense');\r
- }\r
- \r
- /**\r
- * Shows the system requirements.\r
- */\r
- protected function showSystemRequirements() {\r
- $system = array();\r
- \r
- // php version\r
- $system['phpVersion']['value'] = phpversion();\r
- $comparePhpVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $system['phpVersion']['value']);\r
- $system['phpVersion']['result'] = (version_compare($comparePhpVersion, '5.3.0') >= 0);\r
- \r
- // sql\r
- $system['sql']['value'] = array_keys(self::getAvailableDBClasses());\r
- $system['sql']['result'] = count($system['sql']['value'] > 0);\r
- \r
- // upload_max_filesize\r
- $system['uploadMaxFilesize']['value'] = ini_get('upload_max_filesize');\r
- $system['uploadMaxFilesize']['result'] = (intval($system['uploadMaxFilesize']['value']) > 0);\r
- \r
- // gdlib version\r
- $system['gdLib']['value'] = '0.0.0';\r
- if (function_exists('gd_info')) {\r
- $temp = gd_info();\r
- $match = array();\r
- if (preg_match('!([0-9]+\.[0-9]+(?:\.[0-9]+)?)!', $temp['GD Version'], $match)) {\r
- if (preg_match('/^[0-9]+\.[0-9]+$/', $match[1])) $match[1] .= '.0';\r
- $system['gdLib']['value'] = $match[1];\r
- }\r
- }\r
- $system['gdLib']['result'] = (version_compare($system['gdLib']['value'], '2.0.0') >= 0);\r
- \r
- // mb string\r
- $system['mbString']['result'] = extension_loaded('mbstring');\r
- \r
- // safe mode\r
- $system['safeMode']['result'] = (FileUtil::getSafeMode() != 1);\r
- \r
- WCF::getTPL()->assign(array(\r
- 'system' => $system,\r
- 'nextStep' => 'searchWcfDir'\r
- ));\r
- WCF::getTPL()->display('stepShowSystemRequirements');\r
- }\r
- \r
- /**\r
- * Searches the wcf dir.\r
- */\r
- protected function searchWcfDir() {\r
- $foundDirectory = '';\r
- if (self::$wcfDir) {\r
- $wcfDir = self::$wcfDir;\r
- }\r
- else {\r
- if ($foundDirectory = FileUtil::scanFolder(INSTALL_SCRIPT_DIR, "WCF.class.php", true)) {\r
- $foundDirectory = $wcfDir = FileUtil::unifyDirSeperator(dirname(dirname(dirname($foundDirectory))).'/');\r
- \r
- if (dirname(dirname($wcfDir)).'/' == TMP_DIR) {\r
- $foundDirectory = false;\r
- $wcfDir = FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR).'wcf/';\r
- }\r
- }\r
- else {\r
- $wcfDir = FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR).'wcf/';\r
- }\r
- }\r
- \r
- // domain\r
- $domainName = '';\r
- if (!empty($_SERVER['SERVER_NAME'])) $domainName = 'http://' . $_SERVER['SERVER_NAME'];\r
- // port\r
- if (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] != 80) $domainName .= ':' . $_SERVER['SERVER_PORT'];\r
- // script url\r
- $installScriptUrl = '';\r
- if (!empty($_SERVER['REQUEST_URI'])) $installScriptUrl = FileUtil::removeLeadingSlash(FileUtil::removeTrailingSlash(FileUtil::unifyDirSeperator(dirname($_SERVER['REQUEST_URI']))));\r
- \r
- WCF::getTPL()->assign(array(\r
- 'nextStep' => 'unzipFiles',\r
- 'foundDirectory' => $foundDirectory,\r
- 'wcfDir' => $wcfDir,\r
- 'domainName' => $domainName,\r
- 'installScriptUrl' => $installScriptUrl,\r
- 'installScriptDir' => FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR)\r
- ));\r
- \r
- WCF::getTPL()->display('stepSearchWcfDir');\r
- }\r
- \r
- /**\r
- * Unzips the files of the wcfsetup tar archive.\r
- */\r
- protected function unzipFiles() {\r
- // WCF seems to be installed, skip installation of\r
- // files, database and admin account\r
- // and go directly to the installation of packages\r
- if (@is_file(self::$wcfDir.'lib/system/WCF.class.php')) {\r
- $this->gotoNextStep('installPackages');\r
- exit;\r
- }\r
- // WCF not yet installed, install files first\r
- else {\r
- try {\r
- $this->installFiles();\r
- }\r
- catch (Exception $e) {\r
- WCF::getTPL()->assign(array('exception' => $e));\r
- $this->searchWcfDir();\r
- return;\r
- }\r
- \r
- $this->gotoNextStep('selectLanguages');\r
- }\r
- }\r
- \r
- /**\r
- * Shows the page for choosing the installed languages.\r
- */\r
- protected function selectLanguages() {\r
- $errorField = $errorType = '';\r
- $allLanguages = $this->getAllLanguages();\r
- $illegalLanguages = array();\r
- \r
- // build visible language list\r
- $languages = array();\r
- foreach ($allLanguages as $languageCode) {\r
- $languages[$languageCode] = self::getLanguage()->get('wcf.global.language.'.$languageCode).' ('.$languageCode.')';\r
- }\r
- \r
- // skip step in developer mode\r
- // select all available languages automatically\r
- if (self::$developerMode) {\r
- self::$selectedLanguages = array();\r
- foreach ($allLanguages as $languageCode) {\r
- self::$selectedLanguages[] = $languageCode;\r
- }\r
- \r
- self::getTPL()->assign(array('selectedLanguages' => self::$selectedLanguages));\r
- $this->gotoNextStep('configureDB');\r
- exit;\r
- }\r
- \r
- // sort languages\r
- StringUtil::sort($languages);\r
- \r
- // start error handling\r
- if (isset($_POST['send'])) {\r
- try {\r
- // no languages selected\r
- if (count(self::$selectedLanguages) == 0) {\r
- throw new UserInputException('selectedLanguages');\r
- }\r
- \r
- // illegal selection\r
- foreach (self::$selectedLanguages as $language) {\r
- if (!isset($languages[$language])) {\r
- throw new UserInputException('selectedLanguages');\r
- }\r
- }\r
- \r
- // no errors\r
- // go to next step\r
- $this->gotoNextStep('configureDB');\r
- exit;\r
- }\r
- catch (UserInputException $e) {\r
- $errorField = $e->getField();\r
- $errorType = $e->getType();\r
- }\r
- }\r
- else {\r
- self::$selectedLanguages[] = self::$selectedLanguageCode;\r
- WCF::getTPL()->assign(array('selectedLanguages' => self::$selectedLanguages));\r
- }\r
- \r
- WCF::getTPL()->assign(array(\r
- 'errorField' => $errorField,\r
- 'errorType' => $errorType,\r
- 'languages' => $languages,\r
- 'nextStep' => 'selectLanguages'\r
- ));\r
- WCF::getTPL()->display('stepSelectLanguages');\r
- }\r
- \r
- /**\r
- * Shows the page for configurating the database connection.\r
- */\r
- protected function configureDB() {\r
- $availableDBClasses = self::getAvailableDBClasses();\r
- $dbHost = 'localhost';\r
- $dbUser = 'root';\r
- $dbPassword = '';\r
- $dbName = 'wcf';\r
- $dbNumber = '1';\r
- $dbClass = 'MySQLDatabase';\r
- if (!function_exists('mysql_connect')) $dbClass = 'MySQLiDatabase';\r
- $overwriteTables = false;\r
- \r
- if (isset($_POST['send'])) {\r
- if (isset($_POST['dbHost'])) $dbHost = $_POST['dbHost'];\r
- if (isset($_POST['dbUser'])) $dbUser = $_POST['dbUser'];\r
- if (isset($_POST['dbPassword'])) $dbPassword = $_POST['dbPassword'];\r
- if (isset($_POST['dbName'])) $dbName = $_POST['dbName'];\r
- if (isset($_POST['overwriteTables'])) $overwriteTables = intval($_POST['overwriteTables']);\r
- // Should the user not be prompted if converted or default n match an\r
- // existing installation number? By now the existing installation\r
- // will be overwritten just so!\r
- if (isset($_POST['dbNumber'])) $dbNumber = intval($_POST['dbNumber']);\r
- if (isset($_POST['dbClass'])) $dbClass = $_POST['dbClass'];\r
- \r
- // get port\r
- $dbPort = 0;\r
- if (preg_match('/^(.+?):(\d+)$/', $dbHost, $match)) {\r
- $dbHost = $match[1];\r
- $dbPort = intval($match[2]);\r
- }\r
- \r
- // test connection\r
- try {\r
- // check db class\r
- $validDB = false;\r
- foreach ($availableDBClasses as $dbData) {\r
- if ($dbData['class'] == $dbClass) {\r
- $validDB = true;\r
- break;\r
- }\r
- }\r
- \r
- if (!$validDB) {\r
- throw new SystemException("Database type '".$dbClass."'. is not available on this system.");\r
- }\r
- \r
- // check connection data\r
- $db = new $dbClass($dbHost, $dbUser, $dbPassword, $dbName, $dbPort);\r
- $db->connect();\r
- \r
- // check sql version\r
- if (!empty($availableDBClasses[$dbClass]['minversion'])) {\r
- $sqlVersion = $db->getVersion();\r
- if ($sqlVersion != 'unknown') {\r
- $compareSQLVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $sqlVersion);\r
- if (!(version_compare($compareSQLVersion, $availableDBClasses[$dbClass]['minversion']) >= 0)) {\r
- throw new SystemException("Insufficient SQL version '".$compareSQLVersion."'. Version '".$availableDBClasses[$dbClass]['minversion']."' or greater is needed.");\r
- }\r
- }\r
- }\r
- \r
- // check for table conflicts\r
- $conflictedTables = $this->getConflictedTables($db, $dbNumber);\r
- \r
- // write config.inc\r
- if (empty($conflictedTables) || $overwriteTables || self::$developerMode) {\r
- // connection successfully established\r
- // write configuration to config.inc.php\r
- $file = new File(WCF_DIR.'config.inc.php');\r
- $file->write("<?php\n");\r
- $file->write("\$dbHost = '".StringUtil::replace("'", "\\'", $dbHost)."';\n");\r
- $file->write("\$dbPort = ".$dbPort.";\n");\r
- $file->write("\$dbUser = '".StringUtil::replace("'", "\\'", $dbUser)."';\n");\r
- $file->write("\$dbPassword = '".StringUtil::replace("'", "\\'", $dbPassword)."';\n");\r
- $file->write("\$dbName = '".StringUtil::replace("'", "\\'", $dbName)."';\n");\r
- $file->write("\$dbClass = '".StringUtil::replace("'", "\\'", $dbClass)."';\n");\r
- $file->write("if (!defined('WCF_N')) define('WCF_N', $dbNumber);\n?>");\r
- $file->close();\r
- \r
- // go to next step\r
- $this->gotoNextStep('createDB');\r
- exit;\r
- }\r
- // show configure temnplate again\r
- else {\r
- WCF::getTPL()->assign(array('conflictedTables' => $conflictedTables));\r
- }\r
- }\r
- catch (SystemException $e) {\r
- WCF::getTPL()->assign(array('exception' => $e));\r
- }\r
- }\r
- WCF::getTPL()->assign(array(\r
- 'dbHost' => $dbHost,\r
- 'dbUser' => $dbUser,\r
- 'dbPassword' => $dbPassword,\r
- 'dbName' => $dbName,\r
- 'dbNumber' => $dbNumber,\r
- 'dbClass' => $dbClass,\r
- 'availableDBClasses' => $availableDBClasses,\r
- 'nextStep' => 'configureDB'\r
- ));\r
- WCF::getTPL()->display('stepConfigureDB');\r
- }\r
- \r
- \r
- /**\r
- * Checks if in the chosen database are tables in conflict with the wcf tables\r
- * which will be created in the next step.\r
- *\r
- * @param Database $db\r
- * @param integer $dbNumber\r
- */\r
- protected function getConflictedTables($db, $dbNumber) {\r
- // get content of the sql structure file\r
- $sql = file_get_contents(TMP_DIR.'setup/db/install.sql');\r
- \r
- // installation number value 'n' (WCF_N) must be reflected in the executed sql queries\r
- $sql = StringUtil::replace('wcf1_', 'wcf'.$dbNumber.'_', $sql);\r
- \r
- // get all tablenames which should be created\r
- preg_match_all("%CREATE\s+TABLE\s+(\w+)%", $sql, $matches);\r
- \r
- // get all installed tables from chosen database\r
- $existingTables = $db->getEditor()->getTableNames();\r
- \r
- // check if existing tables are in conflict with wcf tables\r
- $conflictedTables = array();\r
- foreach ($existingTables as $existingTableName) {\r
- foreach ($matches[1] as $wcfTableName) {\r
- if ($existingTableName == $wcfTableName) {\r
- $conflictedTables[] = $wcfTableName;\r
- }\r
- }\r
- }\r
- return $conflictedTables;\r
- }\r
- \r
- /**\r
- * Creates the database structure of the wcf.\r
- */\r
- protected function createDB() {\r
- $this->initDB();\r
- \r
- // get content of the sql structure file\r
- $sql = file_get_contents(TMP_DIR.'setup/db/install.sql');\r
- \r
- // installation number value 'n' (WCF_N) must be reflected in the executed sql queries\r
- $sql = StringUtil::replace('wcf1_', 'wcf'.WCF_N.'_', $sql);\r
- \r
- // execute sql queries\r
- $parser = new SQLParser($sql);\r
- $parser->execute();\r
- \r
- // log sql queries\r
- preg_match_all("~CREATE\s+TABLE\s+(\w+)~i", $sql, $matches);\r
- \r
- if (count($matches[1])) {\r
- $sql = "INSERT INTO wcf".WCF_N."_package_installation_sql_log\r
- (sqlTable)\r
- VALUES (?)";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- foreach ($matches[1] as $tableName) {\r
- $statement->execute(array($tableName));\r
- }\r
- }\r
- \r
- /*\r
- * Manually install PIPPackageInstallationPlugin since install.sql content is not escaped resulting\r
- * in different behaviour in MySQL and MSSQL. You SHOULD NOT move this into install.sql!\r
- */\r
- $sql = "INSERT INTO wcf".WCF_N."_package_installation_plugin\r
- (pluginName, priority, className)\r
- VALUES (?, ?, ?)";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- $statement->execute(array(\r
- 'packageinstallationplugins',\r
- 1,\r
- 'wcf\system\package\plugin\PIPPackageInstallationPlugin'\r
- ));\r
- \r
- $this->gotoNextStep('logFiles');\r
- }\r
- \r
- /**\r
- * Logs the unzipped files.\r
- */\r
- protected function logFiles() {\r
- $this->initDB();\r
- \r
- $this->getInstalledFiles(WCF_DIR);\r
- $acpTemplateInserts = $fileInserts = array();\r
- foreach (self::$installedFiles as $file) {\r
- $match = array();\r
- if (preg_match('!/acp/templates/([^/]+)\.tpl$!', $file, $match)) {\r
- // acp template\r
- $acpTemplateInserts[] = $match[1];\r
- }\r
- else {\r
- // regular file\r
- $fileInserts[] = StringUtil::replace(WCF_DIR, '', $file);\r
- }\r
- }\r
- \r
- // save acp template log\r
- if (!empty($acpTemplateInserts)) {\r
- $sql = "INSERT INTO wcf".WCF_N."_acp_template\r
- (templateName)\r
- VALUES (?)";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- \r
- foreach ($acpTemplateInserts as $acpTemplate) {\r
- $statement->execute(array($acpTemplate));\r
- }\r
- }\r
- \r
- // save file log\r
- if (!empty($fileInserts)) {\r
- $sql = "INSERT INTO wcf".WCF_N."_package_installation_file_log\r
- (filename)\r
- VALUES (?)";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- \r
- foreach ($fileInserts as $file) {\r
- $statement->execute(array($file));\r
- }\r
- }\r
- \r
- $this->gotoNextStep('installLanguage');\r
- }\r
- \r
- /**\r
- * Scans the given dir for installed files.\r
- *\r
- * @param string $dir\r
- */\r
- protected function getInstalledFiles($dir) {\r
- if ($files = glob($dir.'*')) {\r
- foreach ($files as $file) {\r
- if (is_dir($file)) {\r
- $this->getInstalledFiles(FileUtil::addTrailingSlash($file));\r
- }\r
- else {\r
- self::$installedFiles[] = FileUtil::unifyDirSeperator($file);\r
- }\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Installs the selected languages.\r
- */\r
- protected function installLanguage() {\r
- $this->initDB();\r
- \r
- foreach (self::$selectedLanguages as $language) {\r
- // get language.xml file name\r
- $filename = TMP_DIR.'install/lang/'.$language.'.xml';\r
- \r
- // check the file\r
- if (!file_exists($filename)) {\r
- throw new SystemException("unable to find language file '".$filename."'", 11002);\r
- }\r
- \r
- // open the file\r
- $xml = new XML();\r
- $xml->load($filename);\r
- \r
- // import xml\r
- LanguageEditor::importFromXML($xml, 0);\r
- }\r
- \r
- // set default language\r
- $language = LanguageFactory::getLanguageByCode(in_array(self::$selectedLanguageCode, self::$selectedLanguages) ? self::$selectedLanguageCode : self::$selectedLanguages[0]);\r
- LanguageFactory::makeDefault($language->languageID);\r
- \r
- // assign all languages to package id 0\r
- $sql = "SELECT languageID\r
- FROM wcf".WCF_N."_language";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- $languages = array();\r
- while ($row = $statement->fetchArray()) {\r
- $languages[] = $row['languageID'];\r
- }\r
- \r
- if (count($languages) > 0) {\r
- $sql = "INSERT INTO wcf".WCF_N."_language_to_package\r
- (languageID)\r
- VALUES (?)";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- \r
- foreach ($languages as $languageID) {\r
- $statement->execute(array(\r
- $languageID\r
- ));\r
- }\r
- }\r
- \r
- // rebuild language cache\r
- CacheHandler::getInstance()->clearResource('languages');\r
- \r
- // go to next step\r
- $this->gotoNextStep('createUser');\r
- }\r
- \r
- /**\r
- * Shows the page for creating the admin account.\r
- */\r
- protected function createUser() {\r
- $errorType = $errorField = $username = $email = $confirmEmail = $password = $confirmPassword = '';\r
- \r
- $username = '';\r
- $email = $confirmEmail = '';\r
- $password = $confirmPassword = '';\r
- \r
- if (isset($_POST['send']) || self::$developerMode) {\r
- if (isset($_POST['send'])) {\r
- if (isset($_POST['username'])) $username = StringUtil::trim($_POST['username']);\r
- if (isset($_POST['email'])) $email = StringUtil::trim($_POST['email']);\r
- if (isset($_POST['confirmEmail'])) $confirmEmail = StringUtil::trim($_POST['confirmEmail']);\r
- if (isset($_POST['password'])) $password = $_POST['password'];\r
- if (isset($_POST['confirmPassword'])) $confirmPassword = $_POST['confirmPassword'];\r
- }\r
- else {\r
- $username = $password = $confirmPassword = 'root';\r
- $email = $confirmEmail = 'woltlab@woltlab.com';\r
- }\r
- \r
- // error handling\r
- try {\r
- // username\r
- if (empty($username)) {\r
- throw new UserInputException('username');\r
- }\r
- if (!UserUtil::isValidUsername($username)) {\r
- throw new UserInputException('username', 'notValid');\r
- }\r
- \r
- // e-mail address\r
- if (empty($email)) {\r
- throw new UserInputException('email');\r
- }\r
- if (!UserUtil::isValidEmail($email)) {\r
- throw new UserInputException('email', 'notValid');\r
- }\r
- \r
- // confirm e-mail address\r
- if ($email != $confirmEmail) {\r
- throw new UserInputException('confirmEmail', 'notEqual');\r
- }\r
- \r
- // password\r
- if (empty($password)) {\r
- throw new UserInputException('password');\r
- }\r
- \r
- // confirm e-mail address\r
- if ($password != $confirmPassword) {\r
- throw new UserInputException('confirmPassword', 'notEqual');\r
- }\r
- \r
- // no errors\r
- // init database connection\r
- $this->initDB();\r
- \r
- // get language id\r
- $languageID = 0;\r
- $sql = "SELECT languageID\r
- FROM wcf".WCF_N."_language\r
- WHERE languageCode = ?";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- $statement->execute(array(self::$selectedLanguageCode));\r
- $row = $statement->fetchArray();\r
- if (isset($row['languageID'])) $languageID = $row['languageID'];\r
- \r
- // create user\r
- $data = array(\r
- 'data' => array(\r
- 'email' => $email,\r
- 'languageID' => $languageID,\r
- 'password' => $password,\r
- 'username' => $username\r
- ),\r
- 'groups' => array(\r
- 1,\r
- 3,\r
- 4\r
- ),\r
- 'languages' => array(\r
- $languageID\r
- )\r
- );\r
- \r
- $userAction = new UserAction(array(), 'create', $data);\r
- $userAction->executeAction();\r
- \r
- // go to next step\r
- $this->gotoNextStep('installPackages');\r
- exit;\r
- }\r
- catch (UserInputException $e) {\r
- $errorField = $e->getField();\r
- $errorType = $e->getType();\r
- }\r
- }\r
- \r
- WCF::getTPL()->assign(array(\r
- 'errorField' => $errorField,\r
- 'errorType' => $errorType,\r
- 'username' => $username,\r
- 'email' => $email,\r
- 'confirmEmail' => $confirmEmail,\r
- 'password' => $password,\r
- 'confirmPassword' => $confirmPassword,\r
- 'nextStep' => 'createUser'\r
- ));\r
- WCF::getTPL()->display('stepCreateUser');\r
- }\r
- \r
- /**\r
- * Registers with wcf setup delivered packages in the package installation queue.\r
- */\r
- protected function installPackages() {\r
- // init database connection\r
- $this->initDB();\r
- \r
- // get admin account\r
- $admin = new User(1);\r
- \r
- // get delivered packages\r
- $wcfPackageFile = '';\r
- $otherPackages = array();\r
- $tar = new Tar(SETUP_FILE);\r
- foreach ($tar->getContentList() as $file) {\r
- if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {\r
- $packageFile = basename($file['filename']);\r
- $packageName = preg_replace('!\.(tar\.gz|tgz|tar)$!', '', $packageFile);\r
- \r
- if ($packageName == 'com.woltlab.wcf') {\r
- $wcfPackageFile = $packageFile;\r
- }\r
- else {\r
- $isStrato = (!empty($_SERVER['DOCUMENT_ROOT']) && (strpos($_SERVER['DOCUMENT_ROOT'], 'strato') !== false));\r
- if (!$isStrato && preg_match('!\.(tar\.gz|tgz)$!', $packageFile)) {\r
- // try to unzip zipped package files\r
- if (FileUtil::uncompressFile(TMP_DIR.'install/packages/'.$packageFile, TMP_DIR.'install/packages/'.$packageName.'.tar')) {\r
- @unlink(TMP_DIR.'install/packages/'.$packageFile);\r
- $packageFile = $packageName.'.tar';\r
- }\r
- }\r
- \r
- $otherPackages[$packageName] = $packageFile;\r
- }\r
- }\r
- }\r
- $tar->close();\r
- \r
- // register packages in queue\r
- // get new process id\r
- $sql = "SELECT MAX(processNo) AS processNo\r
- FROM wcf".WCF_N."_package_installation_queue";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- $result = $statement->fetchArray();\r
- $processNo = intval($result['processNo']) + 1;\r
- $statementParameters = array();\r
- \r
- // search existing wcf package\r
- $sql = "SELECT COUNT(*) AS count\r
- FROM wcf".WCF_N."_package\r
- WHERE package = 'com.woltlab.wcf'";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- $row = $statement->fetchArray();\r
- if (!$row['count']) {\r
- if (empty($wcfPackageFile)) {\r
- throw new SystemException('the essential package com.woltlab.wcf is missing.', 11007);\r
- }\r
- \r
- // register essential wcf package\r
- $statementParameters[] = array(\r
- 'packageName' => 'com.woltlab.wcf',\r
- 'archive' => TMP_DIR.'install/packages/'.$wcfPackageFile\r
- );\r
- }\r
- \r
- // register all other delivered packages\r
- asort($otherPackages);\r
- foreach ($otherPackages as $packageName => $packageFile) {\r
- $statementParameters[] = array(\r
- 'packageName' => $packageName,\r
- 'archive' => TMP_DIR.'install/packages/'.$packageFile\r
- );\r
- }\r
- \r
- if (!empty($statementParameters)) {\r
- $sql = "INSERT INTO wcf".WCF_N."_package_installation_queue\r
- (processNo, userID, package, archive)\r
- VALUES (?, ?, ?, ?)";\r
- $statement = self::getDB()->prepareStatement($sql);\r
- \r
- foreach ($statementParameters as $parameter) {\r
- $statement->execute(array(\r
- $processNo,\r
- $admin->userID,\r
- $parameter['packageName'],\r
- $parameter['archive']\r
- ));\r
- }\r
- }\r
- \r
- // login as admin\r
- $factory = new ACPSessionFactory();\r
- $factory->load();\r
- \r
- SessionHandler::getInstance()->changeUser($admin);\r
- SessionHandler::getInstance()->register('masterPassword', 1);\r
- SessionHandler::getInstance()->update();\r
- \r
- // TODO: print message if delete fails\r
- $installPhpDeleted = @unlink('./install.php');\r
- $testPhpDeleted = @unlink('./test.php');\r
- $wcfSetupTarDeleted = @unlink('./WCFSetup.tar.gz');\r
- \r
- // print page\r
- WCF::getTPL()->assign(array(\r
- 'installPhpDeleted' => $installPhpDeleted,\r
- 'wcfSetupTarDeleted' => $wcfSetupTarDeleted\r
- ));\r
- WCF::getTPL()->display('stepInstallPackages');\r
- \r
- // delete tmp files\r
- $directory = TMP_DIR.TMP_FILE_PREFIX.'/';\r
- $it = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory));\r
- while ($it->valid()) {\r
- // delete all files except directories and packages (required for post-wcfsetup installation)\r
- if (!$it->isDot() && !$it->isDir() && !preg_match('~\.tar(\.gz)?$~', $it->getSubPathName())) {\r
- @unlink($it->key());\r
- }\r
- \r
- $it->next();\r
- }\r
- }\r
- \r
- /**\r
- * Goes to the next step.\r
- *\r
- * @param string $nextStep\r
- */\r
- protected function gotoNextStep($nextStep) {\r
- WCF::getTPL()->assign(array('nextStep' => $nextStep));\r
- WCF::getTPL()->display('stepNext');\r
- }\r
- \r
- /**\r
- * Installs the files of the tar archive.\r
- */\r
- protected static function installFiles() {\r
- new Installer(self::$wcfDir, SETUP_FILE, null, 'install/files/');\r
- }\r
- \r
- /**\r
- * Gets the package name of the first standalone application in WCFSetup.tar.gz.\r
- */\r
- protected static function getPackageName() {\r
- // get package name\r
- $tar = new Tar(SETUP_FILE);\r
- foreach ($tar->getContentList() as $file) {\r
- if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {\r
- $packageFile = basename($file['filename']);\r
- $packageName = preg_replace('!\.(tar\.gz|tgz|tar)$!', '', $packageFile);\r
- \r
- if ($packageName != 'com.woltlab.wcf') {\r
- try {\r
- $archive = new PackageArchive(TMP_DIR.'install/packages/'.$packageFile);\r
- $archive->openArchive();\r
- self::$setupPackageName = $archive->getPackageInfo('packageName');\r
- $archive->getTar()->close();\r
- break;\r
- }\r
- catch (SystemException $e) {}\r
- }\r
- }\r
- }\r
- $tar->close();\r
- \r
- // assign package name\r
- WCF::getTPL()->assign(array('setupPackageName' => self::$setupPackageName));\r
- }\r
-}\r
+<?php
+namespace wcf\system;
+use wcf\data\language\LanguageEditor;
+use wcf\data\language\SetupLanguage;
+use wcf\data\user\User;
+use wcf\data\user\UserAction;
+use wcf\system\cache\CacheHandler;
+use wcf\system\database\util\SQLParser;
+use wcf\system\exception\SystemException;
+use wcf\system\io\File;
+use wcf\system\io\Tar;
+use wcf\system\language\LanguageFactory;
+use wcf\system\package\PackageArchive;
+use wcf\system\session\ACPSessionFactory;
+use wcf\system\session\SessionHandler;
+use wcf\system\setup\Installer;
+use wcf\system\template\SetupTemplateEngine;
+use wcf\system\WCF;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+use wcf\util\UserUtil;
+use wcf\util\XML;
+
+// define
+define('PACKAGE_ID', '0');
+define('HTTP_ENABLE_NO_CACHE_HEADERS', 0);
+define('HTTP_ENABLE_GZIP', 0);
+define('HTTP_GZIP_LEVEL', 0);
+define('CACHE_SOURCE_TYPE', 'disk');
+define('ENABLE_SESSION_DATA_CACHE', 0);
+define('MODULE_MASTER_PASSWORD', 1);
+
+/**
+ * WCFSetup executes the installation of the basic wcf systems.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system
+ * @category Community Framework
+ */
+class WCFSetup extends WCF {
+ protected static $availableLanguages = array();
+ protected static $selectedLanguageCode = 'en';
+ protected static $selectedLanguages = array();
+ protected static $wcfDir = '';
+ protected static $installedFiles = array();
+ protected static $setupPackageName = 'WoltLab Community Framework';
+ protected static $developerMode = 0;
+ protected static $dbClasses = array(
+ 'MySQLDatabase' => array('class' => 'wcf\system\database\MySQLDatabase', 'minversion' => '5.1.17'), // MySQL 5.0.0+
+ 'PostgreSQLDatabase' => array('class' => 'wcf\system\database\PostgreSQLDatabase', 'minversion' => '8.2.0') // PostgreSQL 8.2.0+
+ );
+
+ /**
+ * Calls all init functions of the WCFSetup class and starts the setup process.
+ */
+ public function __construct() {
+ @set_time_limit(0);
+ $this->initMagicQuotes();
+ $this->getDeveloperMode();
+ $this->getLanguageSelection();
+ $this->getWCFDir();
+ $this->initLanguage();
+ $this->initTPL();
+ self::getLanguage()->loadLanguage();
+ $this->getPackageName();
+
+ // start setup
+ $this->setup();
+ }
+
+ /**
+ * Gets the status of the developer mode.
+ */
+ protected static function getDeveloperMode() {
+ if (isset($_GET['dev'])) self::$developerMode = intval($_GET['dev']);
+ else if (isset($_POST['dev'])) self::$developerMode = intval($_POST['dev']);
+ }
+
+ /**
+ * Gets the selected language.
+ */
+ protected static function getLanguageSelection() {
+ self::$availableLanguages = self::getAllLanguages();
+
+ if (isset($_REQUEST['languageCode']) && in_array($_REQUEST['languageCode'], self::$availableLanguages)) {
+ self::$selectedLanguageCode = $_REQUEST['languageCode'];
+ }
+ else {
+ self::$selectedLanguageCode = LanguageFactory::getPreferredLanguage(self::$availableLanguages, self::$selectedLanguageCode);
+ }
+
+ if (isset($_POST['selectedLanguages']) && is_array($_POST['selectedLanguages'])) {
+ self::$selectedLanguages = $_POST['selectedLanguages'];
+ }
+ }
+
+ /**
+ * Gets the available database classes.
+ *
+ * @return array
+ */
+ protected static function getAvailableDBClasses() {
+ $availableDBClasses = array();
+ foreach (self::$dbClasses as $class => $data) {
+ if (call_user_func(array($data['class'], 'isSupported'))) {
+ $availableDBClasses[$class] = $data;
+ }
+ }
+
+ return $availableDBClasses;
+ }
+
+ /**
+ * Gets the selected wcf dir from request.
+ */
+ protected static function getWCFDir() {
+ if (isset($_REQUEST['wcfDir']) && $_REQUEST['wcfDir'] != '') {
+ self::$wcfDir = FileUtil::addTrailingSlash(FileUtil::unifyDirSeperator($_REQUEST['wcfDir']));
+ if (@file_exists(self::$wcfDir)) {
+ define('RELATIVE_WCF_DIR', FileUtil::getRelativePath(INSTALL_SCRIPT_DIR, self::$wcfDir));
+ }
+ }
+
+ define('WCF_DIR', self::$wcfDir);
+ }
+
+ /**
+ * Initialises the language engine.
+ */
+ protected function initLanguage() {
+ // set mb settings
+ mb_internal_encoding('UTF-8');
+ if (function_exists('mb_regex_encoding')) mb_regex_encoding('UTF-8');
+ mb_language('uni');
+
+ // init setup language
+ self::$languageObj = new SetupLanguage(null, array(
+ 'languageCode' => self::$selectedLanguageCode
+ ));
+ }
+
+ /**
+ * Initialises the template engine.
+ */
+ protected function initTPL() {
+ self::$tplObj = SetupTemplateEngine::getInstance();
+ self::getTPL()->setLanguageID(array_search(self::$selectedLanguageCode, self::$availableLanguages));
+ self::getTPL()->setCompileDir(TMP_DIR);
+ self::getTPL()->addTemplatePath(PACKAGE_ID, TMP_DIR);
+ self::getTPL()->registerPrefilter(array('lang'));
+ self::getTPL()->assign(array(
+ '__wcf' => $this,
+ 'tmpFilePrefix' => TMP_FILE_PREFIX,
+ 'languageCode' => self::$selectedLanguageCode,
+ 'selectedLanguages' => self::$selectedLanguages,
+ 'wcfDir' => self::$wcfDir,
+ 'developerMode' => self::$developerMode
+ ));
+ }
+
+ /**
+ * Returns all languages from WCFSetup.tar.gz.
+ *
+ * @return array
+ */
+ protected static function getAllLanguages() {
+ $languages = $match = array();
+ $tar = new Tar(SETUP_FILE);
+ foreach ($tar->getContentList() as $file) {
+ if (strpos($file['filename'], 'setup/lang/') === 0 && substr($file['filename'], -4) == '.xml' && preg_match('!^setup_([a-z]{2}(?:-[A-Za-z0-9]+)?(?:_[A-Za-z]{2})?)$!', basename($file['filename'], '.xml'), $match)) {
+ $languages[] = $match[1];
+ }
+ }
+ $tar->close();
+
+ // sort languages by language code
+ sort($languages);
+
+ return $languages;
+ }
+
+ /**
+ * Calculates the current state of the progress bar.
+ *
+ * @param integer $currentStep
+ */
+ protected function calcProgress($currentStep) {
+ // count delivered packages
+ $packages = 1; // one for wcf setup
+ $tar = new Tar(SETUP_FILE);
+ foreach ($tar->getContentList() as $file) {
+ if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {
+ $packages++;
+ }
+ }
+ $tar->close();
+
+ // calculate part of total install
+ $part = 100 / $packages;
+
+ // calculate progress
+ $progress = round($part / 11 * $currentStep, 0);
+ self::getTPL()->assign(array('progress' => $progress));
+ }
+
+ /**
+ * Executes the setup steps.
+ */
+ protected function setup() {
+ // get current step
+ if (isset($_REQUEST['step'])) $step = $_REQUEST['step'];
+ else $step = 'selectSetupLanguage';
+
+ // execute current step
+ switch ($step) {
+ case 'selectSetupLanguage':
+ if (!self::$developerMode) {
+ $this->calcProgress(0);
+ $this->selectSetupLanguage();
+ break;
+ }
+
+ case 'showLicense':
+ if (!self::$developerMode) {
+ $this->calcProgress(1);
+ $this->showLicense();
+ break;
+ }
+
+ case 'showSystemRequirements':
+ if (!self::$developerMode) {
+ $this->calcProgress(2);
+ $this->showSystemRequirements();
+ break;
+ }
+
+ case 'searchWcfDir':
+ $this->calcProgress(3);
+ $this->searchWcfDir();
+ break;
+
+ case 'unzipFiles':
+ $this->calcProgress(4);
+ $this->unzipFiles();
+ break;
+
+ case 'selectLanguages':
+ $this->calcProgress(5);
+ $this->selectLanguages();
+ break;
+
+ case 'configureDB':
+ $this->calcProgress(6);
+ $this->configureDB();
+ break;
+
+ case 'createDB':
+ $this->calcProgress(7);
+ $this->createDB();
+ break;
+
+ case 'logFiles':
+ $this->calcProgress(8);
+ $this->logFiles();
+ break;
+
+ case 'installLanguage':
+ $this->calcProgress(9);
+ $this->installLanguage();
+ break;
+
+ case 'createUser':
+ $this->calcProgress(10);
+ $this->createUser();
+ break;
+
+ case 'installPackages':
+ $this->calcProgress(11);
+ $this->installPackages();
+ break;
+ }
+ }
+
+ /**
+ * Shows the first setup page.
+ */
+ protected function selectSetupLanguage() {
+ // build language list
+ $languages = array();
+ foreach (self::$availableLanguages as $languageCode) {
+ $languages[$languageCode] = self::getLanguage()->get('wcf.global.language.'.$languageCode).' ('.$languageCode.')';
+ }
+
+ // sort languages
+ StringUtil::sort($languages);
+
+ WCF::getTPL()->assign(array(
+ 'availableLanguages' => $languages,
+ 'nextStep' => 'showLicense'
+ ));
+ WCF::getTPL()->display('stepSelectSetupLanguage');
+ }
+
+ /**
+ * Shows the license agreement.
+ */
+ protected function showLicense() {
+ if (isset($_POST['send'])) {
+ if (isset($_POST['accepted'])) {
+ $this->gotoNextStep('showSystemRequirements');
+ exit;
+ }
+ else {
+ WCF::getTPL()->assign(array('missingAcception' => true));
+ }
+
+ }
+
+ if (file_exists(TMP_DIR.'setup/license/license_'.self::$selectedLanguageCode.'.txt')) {
+ $license = file_get_contents(TMP_DIR.'setup/license/license_'.self::$selectedLanguageCode.'.txt');
+ }
+ else {
+ $license = file_get_contents(TMP_DIR.'setup/license/license_en.txt');
+ }
+
+ WCF::getTPL()->assign(array(
+ 'license' => $license,
+ 'nextStep' => 'showLicense'
+ ));
+ WCF::getTPL()->display('stepShowLicense');
+ }
+
+ /**
+ * Shows the system requirements.
+ */
+ protected function showSystemRequirements() {
+ $system = array();
+
+ // php version
+ $system['phpVersion']['value'] = phpversion();
+ $comparePhpVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $system['phpVersion']['value']);
+ $system['phpVersion']['result'] = (version_compare($comparePhpVersion, '5.3.0') >= 0);
+
+ // sql
+ $system['sql']['value'] = array_keys(self::getAvailableDBClasses());
+ $system['sql']['result'] = count($system['sql']['value'] > 0);
+
+ // upload_max_filesize
+ $system['uploadMaxFilesize']['value'] = ini_get('upload_max_filesize');
+ $system['uploadMaxFilesize']['result'] = (intval($system['uploadMaxFilesize']['value']) > 0);
+
+ // gdlib version
+ $system['gdLib']['value'] = '0.0.0';
+ if (function_exists('gd_info')) {
+ $temp = gd_info();
+ $match = array();
+ if (preg_match('!([0-9]+\.[0-9]+(?:\.[0-9]+)?)!', $temp['GD Version'], $match)) {
+ if (preg_match('/^[0-9]+\.[0-9]+$/', $match[1])) $match[1] .= '.0';
+ $system['gdLib']['value'] = $match[1];
+ }
+ }
+ $system['gdLib']['result'] = (version_compare($system['gdLib']['value'], '2.0.0') >= 0);
+
+ // mb string
+ $system['mbString']['result'] = extension_loaded('mbstring');
+
+ // safe mode
+ $system['safeMode']['result'] = (FileUtil::getSafeMode() != 1);
+
+ WCF::getTPL()->assign(array(
+ 'system' => $system,
+ 'nextStep' => 'searchWcfDir'
+ ));
+ WCF::getTPL()->display('stepShowSystemRequirements');
+ }
+
+ /**
+ * Searches the wcf dir.
+ */
+ protected function searchWcfDir() {
+ $foundDirectory = '';
+ if (self::$wcfDir) {
+ $wcfDir = self::$wcfDir;
+ }
+ else {
+ if ($foundDirectory = FileUtil::scanFolder(INSTALL_SCRIPT_DIR, "WCF.class.php", true)) {
+ $foundDirectory = $wcfDir = FileUtil::unifyDirSeperator(dirname(dirname(dirname($foundDirectory))).'/');
+
+ if (dirname(dirname($wcfDir)).'/' == TMP_DIR) {
+ $foundDirectory = false;
+ $wcfDir = FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR).'wcf/';
+ }
+ }
+ else {
+ $wcfDir = FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR).'wcf/';
+ }
+ }
+
+ // domain
+ $domainName = '';
+ if (!empty($_SERVER['SERVER_NAME'])) $domainName = 'http://' . $_SERVER['SERVER_NAME'];
+ // port
+ if (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] != 80) $domainName .= ':' . $_SERVER['SERVER_PORT'];
+ // script url
+ $installScriptUrl = '';
+ if (!empty($_SERVER['REQUEST_URI'])) $installScriptUrl = FileUtil::removeLeadingSlash(FileUtil::removeTrailingSlash(FileUtil::unifyDirSeperator(dirname($_SERVER['REQUEST_URI']))));
+
+ WCF::getTPL()->assign(array(
+ 'nextStep' => 'unzipFiles',
+ 'foundDirectory' => $foundDirectory,
+ 'wcfDir' => $wcfDir,
+ 'domainName' => $domainName,
+ 'installScriptUrl' => $installScriptUrl,
+ 'installScriptDir' => FileUtil::unifyDirSeperator(INSTALL_SCRIPT_DIR)
+ ));
+
+ WCF::getTPL()->display('stepSearchWcfDir');
+ }
+
+ /**
+ * Unzips the files of the wcfsetup tar archive.
+ */
+ protected function unzipFiles() {
+ // WCF seems to be installed, skip installation of
+ // files, database and admin account
+ // and go directly to the installation of packages
+ if (@is_file(self::$wcfDir.'lib/system/WCF.class.php')) {
+ $this->gotoNextStep('installPackages');
+ exit;
+ }
+ // WCF not yet installed, install files first
+ else {
+ try {
+ $this->installFiles();
+ }
+ catch (Exception $e) {
+ WCF::getTPL()->assign(array('exception' => $e));
+ $this->searchWcfDir();
+ return;
+ }
+
+ $this->gotoNextStep('selectLanguages');
+ }
+ }
+
+ /**
+ * Shows the page for choosing the installed languages.
+ */
+ protected function selectLanguages() {
+ $errorField = $errorType = '';
+ $allLanguages = $this->getAllLanguages();
+ $illegalLanguages = array();
+
+ // build visible language list
+ $languages = array();
+ foreach ($allLanguages as $languageCode) {
+ $languages[$languageCode] = self::getLanguage()->get('wcf.global.language.'.$languageCode).' ('.$languageCode.')';
+ }
+
+ // skip step in developer mode
+ // select all available languages automatically
+ if (self::$developerMode) {
+ self::$selectedLanguages = array();
+ foreach ($allLanguages as $languageCode) {
+ self::$selectedLanguages[] = $languageCode;
+ }
+
+ self::getTPL()->assign(array('selectedLanguages' => self::$selectedLanguages));
+ $this->gotoNextStep('configureDB');
+ exit;
+ }
+
+ // sort languages
+ StringUtil::sort($languages);
+
+ // start error handling
+ if (isset($_POST['send'])) {
+ try {
+ // no languages selected
+ if (count(self::$selectedLanguages) == 0) {
+ throw new UserInputException('selectedLanguages');
+ }
+
+ // illegal selection
+ foreach (self::$selectedLanguages as $language) {
+ if (!isset($languages[$language])) {
+ throw new UserInputException('selectedLanguages');
+ }
+ }
+
+ // no errors
+ // go to next step
+ $this->gotoNextStep('configureDB');
+ exit;
+ }
+ catch (UserInputException $e) {
+ $errorField = $e->getField();
+ $errorType = $e->getType();
+ }
+ }
+ else {
+ self::$selectedLanguages[] = self::$selectedLanguageCode;
+ WCF::getTPL()->assign(array('selectedLanguages' => self::$selectedLanguages));
+ }
+
+ WCF::getTPL()->assign(array(
+ 'errorField' => $errorField,
+ 'errorType' => $errorType,
+ 'languages' => $languages,
+ 'nextStep' => 'selectLanguages'
+ ));
+ WCF::getTPL()->display('stepSelectLanguages');
+ }
+
+ /**
+ * Shows the page for configurating the database connection.
+ */
+ protected function configureDB() {
+ $availableDBClasses = self::getAvailableDBClasses();
+ $dbHost = 'localhost';
+ $dbUser = 'root';
+ $dbPassword = '';
+ $dbName = 'wcf';
+ $dbNumber = '1';
+ $dbClass = 'MySQLDatabase';
+ if (!function_exists('mysql_connect')) $dbClass = 'MySQLiDatabase';
+ $overwriteTables = false;
+
+ if (isset($_POST['send'])) {
+ if (isset($_POST['dbHost'])) $dbHost = $_POST['dbHost'];
+ if (isset($_POST['dbUser'])) $dbUser = $_POST['dbUser'];
+ if (isset($_POST['dbPassword'])) $dbPassword = $_POST['dbPassword'];
+ if (isset($_POST['dbName'])) $dbName = $_POST['dbName'];
+ if (isset($_POST['overwriteTables'])) $overwriteTables = intval($_POST['overwriteTables']);
+ // Should the user not be prompted if converted or default n match an
+ // existing installation number? By now the existing installation
+ // will be overwritten just so!
+ if (isset($_POST['dbNumber'])) $dbNumber = intval($_POST['dbNumber']);
+ if (isset($_POST['dbClass'])) $dbClass = $_POST['dbClass'];
+
+ // get port
+ $dbPort = 0;
+ if (preg_match('/^(.+?):(\d+)$/', $dbHost, $match)) {
+ $dbHost = $match[1];
+ $dbPort = intval($match[2]);
+ }
+
+ // test connection
+ try {
+ // check db class
+ $validDB = false;
+ foreach ($availableDBClasses as $dbData) {
+ if ($dbData['class'] == $dbClass) {
+ $validDB = true;
+ break;
+ }
+ }
+
+ if (!$validDB) {
+ throw new SystemException("Database type '".$dbClass."'. is not available on this system.");
+ }
+
+ // check connection data
+ $db = new $dbClass($dbHost, $dbUser, $dbPassword, $dbName, $dbPort);
+ $db->connect();
+
+ // check sql version
+ if (!empty($availableDBClasses[$dbClass]['minversion'])) {
+ $sqlVersion = $db->getVersion();
+ if ($sqlVersion != 'unknown') {
+ $compareSQLVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $sqlVersion);
+ if (!(version_compare($compareSQLVersion, $availableDBClasses[$dbClass]['minversion']) >= 0)) {
+ throw new SystemException("Insufficient SQL version '".$compareSQLVersion."'. Version '".$availableDBClasses[$dbClass]['minversion']."' or greater is needed.");
+ }
+ }
+ }
+
+ // check for table conflicts
+ $conflictedTables = $this->getConflictedTables($db, $dbNumber);
+
+ // write config.inc
+ if (empty($conflictedTables) || $overwriteTables || self::$developerMode) {
+ // connection successfully established
+ // write configuration to config.inc.php
+ $file = new File(WCF_DIR.'config.inc.php');
+ $file->write("<?php\n");
+ $file->write("\$dbHost = '".StringUtil::replace("'", "\\'", $dbHost)."';\n");
+ $file->write("\$dbPort = ".$dbPort.";\n");
+ $file->write("\$dbUser = '".StringUtil::replace("'", "\\'", $dbUser)."';\n");
+ $file->write("\$dbPassword = '".StringUtil::replace("'", "\\'", $dbPassword)."';\n");
+ $file->write("\$dbName = '".StringUtil::replace("'", "\\'", $dbName)."';\n");
+ $file->write("\$dbClass = '".StringUtil::replace("'", "\\'", $dbClass)."';\n");
+ $file->write("if (!defined('WCF_N')) define('WCF_N', $dbNumber);\n?>");
+ $file->close();
+
+ // go to next step
+ $this->gotoNextStep('createDB');
+ exit;
+ }
+ // show configure temnplate again
+ else {
+ WCF::getTPL()->assign(array('conflictedTables' => $conflictedTables));
+ }
+ }
+ catch (SystemException $e) {
+ WCF::getTPL()->assign(array('exception' => $e));
+ }
+ }
+ WCF::getTPL()->assign(array(
+ 'dbHost' => $dbHost,
+ 'dbUser' => $dbUser,
+ 'dbPassword' => $dbPassword,
+ 'dbName' => $dbName,
+ 'dbNumber' => $dbNumber,
+ 'dbClass' => $dbClass,
+ 'availableDBClasses' => $availableDBClasses,
+ 'nextStep' => 'configureDB'
+ ));
+ WCF::getTPL()->display('stepConfigureDB');
+ }
+
+
+ /**
+ * Checks if in the chosen database are tables in conflict with the wcf tables
+ * which will be created in the next step.
+ *
+ * @param Database $db
+ * @param integer $dbNumber
+ */
+ protected function getConflictedTables($db, $dbNumber) {
+ // get content of the sql structure file
+ $sql = file_get_contents(TMP_DIR.'setup/db/install.sql');
+
+ // installation number value 'n' (WCF_N) must be reflected in the executed sql queries
+ $sql = StringUtil::replace('wcf1_', 'wcf'.$dbNumber.'_', $sql);
+
+ // get all tablenames which should be created
+ preg_match_all("%CREATE\s+TABLE\s+(\w+)%", $sql, $matches);
+
+ // get all installed tables from chosen database
+ $existingTables = $db->getEditor()->getTableNames();
+
+ // check if existing tables are in conflict with wcf tables
+ $conflictedTables = array();
+ foreach ($existingTables as $existingTableName) {
+ foreach ($matches[1] as $wcfTableName) {
+ if ($existingTableName == $wcfTableName) {
+ $conflictedTables[] = $wcfTableName;
+ }
+ }
+ }
+ return $conflictedTables;
+ }
+
+ /**
+ * Creates the database structure of the wcf.
+ */
+ protected function createDB() {
+ $this->initDB();
+
+ // get content of the sql structure file
+ $sql = file_get_contents(TMP_DIR.'setup/db/install.sql');
+
+ // installation number value 'n' (WCF_N) must be reflected in the executed sql queries
+ $sql = StringUtil::replace('wcf1_', 'wcf'.WCF_N.'_', $sql);
+
+ // execute sql queries
+ $parser = new SQLParser($sql);
+ $parser->execute();
+
+ // log sql queries
+ preg_match_all("~CREATE\s+TABLE\s+(\w+)~i", $sql, $matches);
+
+ if (count($matches[1])) {
+ $sql = "INSERT INTO wcf".WCF_N."_package_installation_sql_log
+ (sqlTable)
+ VALUES (?)";
+ $statement = self::getDB()->prepareStatement($sql);
+ foreach ($matches[1] as $tableName) {
+ $statement->execute(array($tableName));
+ }
+ }
+
+ /*
+ * Manually install PIPPackageInstallationPlugin since install.sql content is not escaped resulting
+ * in different behaviour in MySQL and MSSQL. You SHOULD NOT move this into install.sql!
+ */
+ $sql = "INSERT INTO wcf".WCF_N."_package_installation_plugin
+ (pluginName, priority, className)
+ VALUES (?, ?, ?)";
+ $statement = self::getDB()->prepareStatement($sql);
+ $statement->execute(array(
+ 'packageinstallationplugins',
+ 1,
+ 'wcf\system\package\plugin\PIPPackageInstallationPlugin'
+ ));
+
+ $this->gotoNextStep('logFiles');
+ }
+
+ /**
+ * Logs the unzipped files.
+ */
+ protected function logFiles() {
+ $this->initDB();
+
+ $this->getInstalledFiles(WCF_DIR);
+ $acpTemplateInserts = $fileInserts = array();
+ foreach (self::$installedFiles as $file) {
+ $match = array();
+ if (preg_match('!/acp/templates/([^/]+)\.tpl$!', $file, $match)) {
+ // acp template
+ $acpTemplateInserts[] = $match[1];
+ }
+ else {
+ // regular file
+ $fileInserts[] = StringUtil::replace(WCF_DIR, '', $file);
+ }
+ }
+
+ // save acp template log
+ if (!empty($acpTemplateInserts)) {
+ $sql = "INSERT INTO wcf".WCF_N."_acp_template
+ (templateName)
+ VALUES (?)";
+ $statement = self::getDB()->prepareStatement($sql);
+
+ foreach ($acpTemplateInserts as $acpTemplate) {
+ $statement->execute(array($acpTemplate));
+ }
+ }
+
+ // save file log
+ if (!empty($fileInserts)) {
+ $sql = "INSERT INTO wcf".WCF_N."_package_installation_file_log
+ (filename)
+ VALUES (?)";
+ $statement = self::getDB()->prepareStatement($sql);
+
+ foreach ($fileInserts as $file) {
+ $statement->execute(array($file));
+ }
+ }
+
+ $this->gotoNextStep('installLanguage');
+ }
+
+ /**
+ * Scans the given dir for installed files.
+ *
+ * @param string $dir
+ */
+ protected function getInstalledFiles($dir) {
+ if ($files = glob($dir.'*')) {
+ foreach ($files as $file) {
+ if (is_dir($file)) {
+ $this->getInstalledFiles(FileUtil::addTrailingSlash($file));
+ }
+ else {
+ self::$installedFiles[] = FileUtil::unifyDirSeperator($file);
+ }
+ }
+ }
+ }
+
+ /**
+ * Installs the selected languages.
+ */
+ protected function installLanguage() {
+ $this->initDB();
+
+ foreach (self::$selectedLanguages as $language) {
+ // get language.xml file name
+ $filename = TMP_DIR.'install/lang/'.$language.'.xml';
+
+ // check the file
+ if (!file_exists($filename)) {
+ throw new SystemException("unable to find language file '".$filename."'", 11002);
+ }
+
+ // open the file
+ $xml = new XML();
+ $xml->load($filename);
+
+ // import xml
+ LanguageEditor::importFromXML($xml, 0);
+ }
+
+ // set default language
+ $language = LanguageFactory::getLanguageByCode(in_array(self::$selectedLanguageCode, self::$selectedLanguages) ? self::$selectedLanguageCode : self::$selectedLanguages[0]);
+ LanguageFactory::makeDefault($language->languageID);
+
+ // assign all languages to package id 0
+ $sql = "SELECT languageID
+ FROM wcf".WCF_N."_language";
+ $statement = self::getDB()->prepareStatement($sql);
+ $statement->execute();
+ $languages = array();
+ while ($row = $statement->fetchArray()) {
+ $languages[] = $row['languageID'];
+ }
+
+ if (count($languages) > 0) {
+ $sql = "INSERT INTO wcf".WCF_N."_language_to_package
+ (languageID)
+ VALUES (?)";
+ $statement = self::getDB()->prepareStatement($sql);
+
+ foreach ($languages as $languageID) {
+ $statement->execute(array(
+ $languageID
+ ));
+ }
+ }
+
+ // rebuild language cache
+ CacheHandler::getInstance()->clearResource('languages');
+
+ // go to next step
+ $this->gotoNextStep('createUser');
+ }
+
+ /**
+ * Shows the page for creating the admin account.
+ */
+ protected function createUser() {
+ $errorType = $errorField = $username = $email = $confirmEmail = $password = $confirmPassword = '';
+
+ $username = '';
+ $email = $confirmEmail = '';
+ $password = $confirmPassword = '';
+
+ if (isset($_POST['send']) || self::$developerMode) {
+ if (isset($_POST['send'])) {
+ if (isset($_POST['username'])) $username = StringUtil::trim($_POST['username']);
+ if (isset($_POST['email'])) $email = StringUtil::trim($_POST['email']);
+ if (isset($_POST['confirmEmail'])) $confirmEmail = StringUtil::trim($_POST['confirmEmail']);
+ if (isset($_POST['password'])) $password = $_POST['password'];
+ if (isset($_POST['confirmPassword'])) $confirmPassword = $_POST['confirmPassword'];
+ }
+ else {
+ $username = $password = $confirmPassword = 'root';
+ $email = $confirmEmail = 'woltlab@woltlab.com';
+ }
+
+ // error handling
+ try {
+ // username
+ if (empty($username)) {
+ throw new UserInputException('username');
+ }
+ if (!UserUtil::isValidUsername($username)) {
+ throw new UserInputException('username', 'notValid');
+ }
+
+ // e-mail address
+ if (empty($email)) {
+ throw new UserInputException('email');
+ }
+ if (!UserUtil::isValidEmail($email)) {
+ throw new UserInputException('email', 'notValid');
+ }
+
+ // confirm e-mail address
+ if ($email != $confirmEmail) {
+ throw new UserInputException('confirmEmail', 'notEqual');
+ }
+
+ // password
+ if (empty($password)) {
+ throw new UserInputException('password');
+ }
+
+ // confirm e-mail address
+ if ($password != $confirmPassword) {
+ throw new UserInputException('confirmPassword', 'notEqual');
+ }
+
+ // no errors
+ // init database connection
+ $this->initDB();
+
+ // get language id
+ $languageID = 0;
+ $sql = "SELECT languageID
+ FROM wcf".WCF_N."_language
+ WHERE languageCode = ?";
+ $statement = self::getDB()->prepareStatement($sql);
+ $statement->execute(array(self::$selectedLanguageCode));
+ $row = $statement->fetchArray();
+ if (isset($row['languageID'])) $languageID = $row['languageID'];
+
+ // create user
+ $data = array(
+ 'data' => array(
+ 'email' => $email,
+ 'languageID' => $languageID,
+ 'password' => $password,
+ 'username' => $username
+ ),
+ 'groups' => array(
+ 1,
+ 3,
+ 4
+ ),
+ 'languages' => array(
+ $languageID
+ )
+ );
+
+ $userAction = new UserAction(array(), 'create', $data);
+ $userAction->executeAction();
+
+ // go to next step
+ $this->gotoNextStep('installPackages');
+ exit;
+ }
+ catch (UserInputException $e) {
+ $errorField = $e->getField();
+ $errorType = $e->getType();
+ }
+ }
+
+ WCF::getTPL()->assign(array(
+ 'errorField' => $errorField,
+ 'errorType' => $errorType,
+ 'username' => $username,
+ 'email' => $email,
+ 'confirmEmail' => $confirmEmail,
+ 'password' => $password,
+ 'confirmPassword' => $confirmPassword,
+ 'nextStep' => 'createUser'
+ ));
+ WCF::getTPL()->display('stepCreateUser');
+ }
+
+ /**
+ * Registers with wcf setup delivered packages in the package installation queue.
+ */
+ protected function installPackages() {
+ // init database connection
+ $this->initDB();
+
+ // get admin account
+ $admin = new User(1);
+
+ // get delivered packages
+ $wcfPackageFile = '';
+ $otherPackages = array();
+ $tar = new Tar(SETUP_FILE);
+ foreach ($tar->getContentList() as $file) {
+ if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {
+ $packageFile = basename($file['filename']);
+ $packageName = preg_replace('!\.(tar\.gz|tgz|tar)$!', '', $packageFile);
+
+ if ($packageName == 'com.woltlab.wcf') {
+ $wcfPackageFile = $packageFile;
+ }
+ else {
+ $isStrato = (!empty($_SERVER['DOCUMENT_ROOT']) && (strpos($_SERVER['DOCUMENT_ROOT'], 'strato') !== false));
+ if (!$isStrato && preg_match('!\.(tar\.gz|tgz)$!', $packageFile)) {
+ // try to unzip zipped package files
+ if (FileUtil::uncompressFile(TMP_DIR.'install/packages/'.$packageFile, TMP_DIR.'install/packages/'.$packageName.'.tar')) {
+ @unlink(TMP_DIR.'install/packages/'.$packageFile);
+ $packageFile = $packageName.'.tar';
+ }
+ }
+
+ $otherPackages[$packageName] = $packageFile;
+ }
+ }
+ }
+ $tar->close();
+
+ // register packages in queue
+ // get new process id
+ $sql = "SELECT MAX(processNo) AS processNo
+ FROM wcf".WCF_N."_package_installation_queue";
+ $statement = self::getDB()->prepareStatement($sql);
+ $statement->execute();
+ $result = $statement->fetchArray();
+ $processNo = intval($result['processNo']) + 1;
+ $statementParameters = array();
+
+ // search existing wcf package
+ $sql = "SELECT COUNT(*) AS count
+ FROM wcf".WCF_N."_package
+ WHERE package = 'com.woltlab.wcf'";
+ $statement = self::getDB()->prepareStatement($sql);
+ $statement->execute();
+ $row = $statement->fetchArray();
+ if (!$row['count']) {
+ if (empty($wcfPackageFile)) {
+ throw new SystemException('the essential package com.woltlab.wcf is missing.', 11007);
+ }
+
+ // register essential wcf package
+ $statementParameters[] = array(
+ 'packageName' => 'com.woltlab.wcf',
+ 'archive' => TMP_DIR.'install/packages/'.$wcfPackageFile
+ );
+ }
+
+ // register all other delivered packages
+ asort($otherPackages);
+ foreach ($otherPackages as $packageName => $packageFile) {
+ $statementParameters[] = array(
+ 'packageName' => $packageName,
+ 'archive' => TMP_DIR.'install/packages/'.$packageFile
+ );
+ }
+
+ if (!empty($statementParameters)) {
+ $sql = "INSERT INTO wcf".WCF_N."_package_installation_queue
+ (processNo, userID, package, archive)
+ VALUES (?, ?, ?, ?)";
+ $statement = self::getDB()->prepareStatement($sql);
+
+ foreach ($statementParameters as $parameter) {
+ $statement->execute(array(
+ $processNo,
+ $admin->userID,
+ $parameter['packageName'],
+ $parameter['archive']
+ ));
+ }
+ }
+
+ // login as admin
+ $factory = new ACPSessionFactory();
+ $factory->load();
+
+ SessionHandler::getInstance()->changeUser($admin);
+ SessionHandler::getInstance()->register('masterPassword', 1);
+ SessionHandler::getInstance()->update();
+
+ // TODO: print message if delete fails
+ $installPhpDeleted = @unlink('./install.php');
+ $testPhpDeleted = @unlink('./test.php');
+ $wcfSetupTarDeleted = @unlink('./WCFSetup.tar.gz');
+
+ // print page
+ WCF::getTPL()->assign(array(
+ 'installPhpDeleted' => $installPhpDeleted,
+ 'wcfSetupTarDeleted' => $wcfSetupTarDeleted
+ ));
+ WCF::getTPL()->display('stepInstallPackages');
+
+ // delete tmp files
+ $directory = TMP_DIR.TMP_FILE_PREFIX.'/';
+ $it = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory));
+ while ($it->valid()) {
+ // delete all files except directories and packages (required for post-wcfsetup installation)
+ if (!$it->isDot() && !$it->isDir() && !preg_match('~\.tar(\.gz)?$~', $it->getSubPathName())) {
+ @unlink($it->key());
+ }
+
+ $it->next();
+ }
+ }
+
+ /**
+ * Goes to the next step.
+ *
+ * @param string $nextStep
+ */
+ protected function gotoNextStep($nextStep) {
+ WCF::getTPL()->assign(array('nextStep' => $nextStep));
+ WCF::getTPL()->display('stepNext');
+ }
+
+ /**
+ * Installs the files of the tar archive.
+ */
+ protected static function installFiles() {
+ new Installer(self::$wcfDir, SETUP_FILE, null, 'install/files/');
+ }
+
+ /**
+ * Gets the package name of the first standalone application in WCFSetup.tar.gz.
+ */
+ protected static function getPackageName() {
+ // get package name
+ $tar = new Tar(SETUP_FILE);
+ foreach ($tar->getContentList() as $file) {
+ if ($file['type'] != 'folder' && StringUtil::indexOf($file['filename'], 'install/packages/') === 0) {
+ $packageFile = basename($file['filename']);
+ $packageName = preg_replace('!\.(tar\.gz|tgz|tar)$!', '', $packageFile);
+
+ if ($packageName != 'com.woltlab.wcf') {
+ try {
+ $archive = new PackageArchive(TMP_DIR.'install/packages/'.$packageFile);
+ $archive->openArchive();
+ self::$setupPackageName = $archive->getPackageInfo('packageName');
+ $archive->getTar()->close();
+ break;
+ }
+ catch (SystemException $e) {}
+ }
+ }
+ }
+ $tar->close();
+
+ // assign package name
+ WCF::getTPL()->assign(array('setupPackageName' => self::$setupPackageName));
+ }
+}
-<?php\r
-namespace wcf\system\auth;\r
-use wcf\data\user\User;\r
-use wcf\system\event\EventHandler;\r
-\r
-/**\r
- * All user authentication types should implement the abstract functions of this class.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.auth\r
- * @category Community Framework\r
- */\r
-abstract class UserAuth {\r
- /**\r
- * active instance\r
- *\r
- * @var UserAuth\r
- */\r
- protected static $instance = null;\r
- \r
- /**\r
- * Returns an instance of the enabled user auth class.\r
- * \r
- * @return UserAuth\r
- */\r
- public static function getInstance() {\r
- if (self::$instance === null) {\r
- // call loadInstance event\r
- EventHandler::getInstance()->fireAction(__CLASS__, 'loadInstance');\r
- \r
- // use default implementation\r
- if (self::$instance === null) {\r
- self::$instance = new UserAuthDefault();\r
- }\r
- }\r
- \r
- return self::$instance;\r
- }\r
- \r
- /**\r
- * Prevents creating an additional instance.\r
- */\r
- protected function __clone() {}\r
- \r
- /**\r
- * Returns true, if this auth type supports persistent logins.\r
- * \r
- * @return boolean\r
- */\r
- public abstract function supportsPersistentLogins();\r
- \r
- /**\r
- * Stores the user access data for a persistent login.\r
- * \r
- * @param User $user\r
- * @param string $username\r
- * @param string $password\r
- */\r
- public abstract function storeAccessData(User $user, $username, $password);\r
- \r
- /**\r
- * Does an manual user login.\r
- * \r
- * @param string $username\r
- * @param string $password\r
- * @param string $userClassname class name of user class\r
- * @return User\r
- */\r
- public abstract function loginManually($username, $password, $userClassname = 'wcf\data\user\User');\r
- \r
- /**\r
- * Does an automatic user login.\r
- * \r
- * @param boolean $persistent true = persistent login\r
- * @param string $userClassname class name of user class\r
- * @return User\r
- */\r
- public abstract function loginAutomatically($persistent = false, $userClassname = 'wcf\data\user\User');\r
+<?php
+namespace wcf\system\auth;
+use wcf\data\user\User;
+use wcf\system\event\EventHandler;
+
+/**
+ * All user authentication types should implement the abstract functions of this class.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.auth
+ * @category Community Framework
+ */
+abstract class UserAuth {
+ /**
+ * active instance
+ *
+ * @var UserAuth
+ */
+ protected static $instance = null;
+
+ /**
+ * Returns an instance of the enabled user auth class.
+ *
+ * @return UserAuth
+ */
+ public static function getInstance() {
+ if (self::$instance === null) {
+ // call loadInstance event
+ EventHandler::getInstance()->fireAction(__CLASS__, 'loadInstance');
+
+ // use default implementation
+ if (self::$instance === null) {
+ self::$instance = new UserAuthDefault();
+ }
+ }
+
+ return self::$instance;
+ }
+
+ /**
+ * Prevents creating an additional instance.
+ */
+ protected function __clone() {}
+
+ /**
+ * Returns true, if this auth type supports persistent logins.
+ *
+ * @return boolean
+ */
+ public abstract function supportsPersistentLogins();
+
+ /**
+ * Stores the user access data for a persistent login.
+ *
+ * @param User $user
+ * @param string $username
+ * @param string $password
+ */
+ public abstract function storeAccessData(User $user, $username, $password);
+
+ /**
+ * Does an manual user login.
+ *
+ * @param string $username
+ * @param string $password
+ * @param string $userClassname class name of user class
+ * @return User
+ */
+ public abstract function loginManually($username, $password, $userClassname = 'wcf\data\user\User');
+
+ /**
+ * Does an automatic user login.
+ *
+ * @param boolean $persistent true = persistent login
+ * @param string $userClassname class name of user class
+ * @return User
+ */
+ public abstract function loginAutomatically($persistent = false, $userClassname = 'wcf\data\user\User');
}
-<?php\r
-namespace wcf\system\auth;\r
-use wcf\data\user\User;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\util\HeaderUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Default implementation of the user authentication.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.auth\r
- * @category Community Framework\r
- */\r
-class UserAuthDefault extends UserAuth {\r
- /**\r
- * @see UserAuth::supportsPersistentLogins()\r
- */\r
- public function supportsPersistentLogins() {\r
- return true;\r
- }\r
- \r
- /**\r
- * @see UserAuth::loginManually()\r
- */\r
- public function loginManually($username, $password, $userClassname = 'wcf\data\user\User') {\r
- $user = User::getUserByUsername($username);\r
- $userSession = new $userClassname(null, null, $user);\r
- \r
- if ($userSession->userID == 0) {\r
- throw new UserInputException('username', 'notFound');\r
- }\r
- \r
- // check password\r
- if (!$userSession->checkPassword($password)) {\r
- throw new UserInputException('password', 'false');\r
- }\r
- \r
- return $userSession;\r
- }\r
- \r
- /**\r
- * @see UserAuth::storeAccessData()\r
- */\r
- public function storeAccessData(User $user, $username, $password) {\r
- HeaderUtil::setCookie('userID', $user->userID, TIME_NOW + 365 * 24 * 3600);\r
- HeaderUtil::setCookie('password', StringUtil::getSaltedHash($password, $user->salt), TIME_NOW + 365 * 24 * 3600);\r
- }\r
-\r
- /**\r
- * @see UserAuth::loginAutomatically()\r
- */\r
- public function loginAutomatically($persistent = false, $userClassname = 'wcf\data\user\User') {\r
- if (!$persistent) return null;\r
- \r
- $user = null;\r
- if (isset($_COOKIE[COOKIE_PREFIX.'userID']) && isset($_COOKIE[COOKIE_PREFIX.'password'])) {\r
- if (!($user = $this->getUserAutomatically(intval($_COOKIE[COOKIE_PREFIX.'userID']), $_COOKIE[COOKIE_PREFIX.'password'], $userClassname))) {\r
- $user = null;\r
- // reset cookie\r
- HeaderUtil::setCookie('userID', '');\r
- HeaderUtil::setCookie('password', '');\r
- }\r
- }\r
- \r
- return $user;\r
- }\r
- \r
- /**\r
- * Returns a user object or null on failure.\r
- * \r
- * @param integer $userID\r
- * @param string $password\r
- * @param string $userClassname\r
- * @return User \r
- */\r
- protected function getUserAutomatically($userID, $password, $userClassname = 'wcf\data\user\User') {\r
- $user = new $userClassname($userID);\r
- if (!$user->userID || !$this->checkCookiePassword($user, $password)) {\r
- $user = null;\r
- }\r
- \r
- return $user;\r
- }\r
- \r
- /**\r
- * Validates the cookie password.\r
- * \r
- * @param User $user\r
- * @param string $password\r
- * @return boolean\r
- */\r
- protected function checkCookiePassword($user, $password) {\r
- return $user->checkCookiePassword($password);\r
- }\r
+<?php
+namespace wcf\system\auth;
+use wcf\data\user\User;
+use wcf\system\exception\UserInputException;
+use wcf\util\HeaderUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Default implementation of the user authentication.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.auth
+ * @category Community Framework
+ */
+class UserAuthDefault extends UserAuth {
+ /**
+ * @see UserAuth::supportsPersistentLogins()
+ */
+ public function supportsPersistentLogins() {
+ return true;
+ }
+
+ /**
+ * @see UserAuth::loginManually()
+ */
+ public function loginManually($username, $password, $userClassname = 'wcf\data\user\User') {
+ $user = User::getUserByUsername($username);
+ $userSession = new $userClassname(null, null, $user);
+
+ if ($userSession->userID == 0) {
+ throw new UserInputException('username', 'notFound');
+ }
+
+ // check password
+ if (!$userSession->checkPassword($password)) {
+ throw new UserInputException('password', 'false');
+ }
+
+ return $userSession;
+ }
+
+ /**
+ * @see UserAuth::storeAccessData()
+ */
+ public function storeAccessData(User $user, $username, $password) {
+ HeaderUtil::setCookie('userID', $user->userID, TIME_NOW + 365 * 24 * 3600);
+ HeaderUtil::setCookie('password', StringUtil::getSaltedHash($password, $user->salt), TIME_NOW + 365 * 24 * 3600);
+ }
+
+ /**
+ * @see UserAuth::loginAutomatically()
+ */
+ public function loginAutomatically($persistent = false, $userClassname = 'wcf\data\user\User') {
+ if (!$persistent) return null;
+
+ $user = null;
+ if (isset($_COOKIE[COOKIE_PREFIX.'userID']) && isset($_COOKIE[COOKIE_PREFIX.'password'])) {
+ if (!($user = $this->getUserAutomatically(intval($_COOKIE[COOKIE_PREFIX.'userID']), $_COOKIE[COOKIE_PREFIX.'password'], $userClassname))) {
+ $user = null;
+ // reset cookie
+ HeaderUtil::setCookie('userID', '');
+ HeaderUtil::setCookie('password', '');
+ }
+ }
+
+ return $user;
+ }
+
+ /**
+ * Returns a user object or null on failure.
+ *
+ * @param integer $userID
+ * @param string $password
+ * @param string $userClassname
+ * @return User
+ */
+ protected function getUserAutomatically($userID, $password, $userClassname = 'wcf\data\user\User') {
+ $user = new $userClassname($userID);
+ if (!$user->userID || !$this->checkCookiePassword($user, $password)) {
+ $user = null;
+ }
+
+ return $user;
+ }
+
+ /**
+ * Validates the cookie password.
+ *
+ * @param User $user
+ * @param string $password
+ * @return boolean
+ */
+ protected function checkCookiePassword($user, $password) {
+ return $user->checkCookiePassword($password);
+ }
}
-<?php\r
-namespace wcf\system\cache;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\SingletonFactory;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * CacheHandler holds all registered cache resources.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache\r
- * @category Community Framework\r
- */\r
-class CacheHandler extends SingletonFactory {\r
- /**\r
- * Registered cache resources.\r
- * \r
- * @var array\r
- */\r
- protected $cacheResources = array();\r
- \r
- /**\r
- * cache source object\r
- * \r
- * @var wcf\system\cache\source\ICacheSource\r
- */\r
- protected $cacheSource = null;\r
- \r
- /**\r
- * Creates a new CacheHandler object.\r
- */\r
- protected function init() {\r
- // init cache source object\r
- try {\r
- $className = 'wcf\system\cache\source\\'.ucfirst(CACHE_SOURCE_TYPE).'CacheSource';\r
- $this->cacheSource = new $className();\r
- }\r
- catch (SystemException $e) {\r
- if (CACHE_SOURCE_TYPE != 'disk') {\r
- // fallback to disk cache\r
- $this->cacheSource = new wcf\system\cache\source\DiskCacheSource();\r
- }\r
- else {\r
- throw $e;\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Registers a new cache resource.\r
- * \r
- * @param string $cache name of this resource\r
- * @param string $file data file for this resource\r
- * @param string $className\r
- * @param integer $minLifetime\r
- * @param integer $maxLifetime\r
- */\r
- public function addResource($cache, $file, $className, $minLifetime = 0, $maxLifetime = 0) {\r
- $this->cacheResources[$cache] = array(\r
- 'cache' => $cache,\r
- 'file' => $file, \r
- 'className' => $className, \r
- 'minLifetime' => $minLifetime,\r
- 'maxLifetime' => $maxLifetime\r
- );\r
- }\r
- \r
- /**\r
- * Deletes a registered cache resource.\r
- * \r
- * @param string $cache\r
- * @param boolean $ignoreLifetime\r
- */\r
- public function clearResource($cache, $ignoreLifetime = false) {\r
- if (!isset($this->cacheResources[$cache])) {\r
- throw new SystemException("cache resource '".$cache."' does not exist", 11005);\r
- }\r
- \r
- $this->getCacheSource()->delete($this->cacheResources[$cache], $ignoreLifetime);\r
- }\r
- \r
- /**\r
- * Marks cached files as obsolete.\r
- *\r
- * @param string $directory\r
- * @param string $filepattern\r
- * @param boolean $forceDelete\r
- */\r
- public function clear($directory, $filepattern, $forceDelete = false) {\r
- $this->getCacheSource()->clear($directory, $filepattern, $forceDelete);\r
- }\r
- \r
- /**\r
- * Returns a cached variable.\r
- *\r
- * @param string $cache\r
- * @param string $variable\r
- * @return mixed $value\r
- */\r
- public function get($cache, $variable = '') {\r
- if (!isset($this->cacheResources[$cache])) {\r
- throw new SystemException("unknown cache resource '".$cache."'", 11005);\r
- }\r
- \r
- // try to get value\r
- $value = $this->getCacheSource()->get($this->cacheResources[$cache]);\r
- if ($value === null) {\r
- // rebuild cache\r
- $this->rebuild($this->cacheResources[$cache]);\r
- \r
- // try to get value again\r
- $value = $this->getCacheSource()->get($this->cacheResources[$cache]);\r
- if ($value === null) {\r
- throw new SystemException("cache resource '".$cache."' does not exist", 11005);\r
- }\r
- }\r
- \r
- // return value\r
- if (!empty($variable)) {\r
- if (!isset($value[$variable])) {\r
- throw new SystemException("variable '".$variable."' does not exist in cache resource '".$cache."'", 11008);\r
- }\r
- \r
- return $value[$variable];\r
- }\r
- else {\r
- return $value;\r
- }\r
- }\r
- \r
- /**\r
- * Rebuilds a cache resource.\r
- * \r
- * @param array $cacheResource\r
- * @return boolean result\r
- */\r
- public function rebuild($cacheResource) {\r
- // instance cache class\r
- if (!class_exists($cacheResource['className'])) {\r
- throw new SystemException("Unable to find class '".$cacheResource['className']."'", 11001);\r
- }\r
- \r
- // update file last modified time to avoid multiple users rebuilding cache at the same time\r
- if (get_class($this->getCacheSource()) == 'wcf\system\cache\source\DiskCacheSource') {\r
- @touch($cacheResource['file']);\r
- }\r
- \r
- // build cache\r
- $cacheBuilder = new $cacheResource['className'];\r
- $value = $cacheBuilder->getData($cacheResource);\r
-\r
- // save cache\r
- $this->getCacheSource()->set($cacheResource, $value);\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * Returns the cache source object.\r
- *\r
- * @return CacheSource\r
- */\r
- public function getCacheSource() {\r
- return $this->cacheSource;\r
- }\r
+<?php
+namespace wcf\system\cache;
+use wcf\system\exception\SystemException;
+use wcf\system\SingletonFactory;
+use wcf\util\StringUtil;
+
+/**
+ * CacheHandler holds all registered cache resources.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache
+ * @category Community Framework
+ */
+class CacheHandler extends SingletonFactory {
+ /**
+ * Registered cache resources.
+ *
+ * @var array
+ */
+ protected $cacheResources = array();
+
+ /**
+ * cache source object
+ *
+ * @var wcf\system\cache\source\ICacheSource
+ */
+ protected $cacheSource = null;
+
+ /**
+ * Creates a new CacheHandler object.
+ */
+ protected function init() {
+ // init cache source object
+ try {
+ $className = 'wcf\system\cache\source\\'.ucfirst(CACHE_SOURCE_TYPE).'CacheSource';
+ $this->cacheSource = new $className();
+ }
+ catch (SystemException $e) {
+ if (CACHE_SOURCE_TYPE != 'disk') {
+ // fallback to disk cache
+ $this->cacheSource = new wcf\system\cache\source\DiskCacheSource();
+ }
+ else {
+ throw $e;
+ }
+ }
+ }
+
+ /**
+ * Registers a new cache resource.
+ *
+ * @param string $cache name of this resource
+ * @param string $file data file for this resource
+ * @param string $className
+ * @param integer $minLifetime
+ * @param integer $maxLifetime
+ */
+ public function addResource($cache, $file, $className, $minLifetime = 0, $maxLifetime = 0) {
+ $this->cacheResources[$cache] = array(
+ 'cache' => $cache,
+ 'file' => $file,
+ 'className' => $className,
+ 'minLifetime' => $minLifetime,
+ 'maxLifetime' => $maxLifetime
+ );
+ }
+
+ /**
+ * Deletes a registered cache resource.
+ *
+ * @param string $cache
+ * @param boolean $ignoreLifetime
+ */
+ public function clearResource($cache, $ignoreLifetime = false) {
+ if (!isset($this->cacheResources[$cache])) {
+ throw new SystemException("cache resource '".$cache."' does not exist", 11005);
+ }
+
+ $this->getCacheSource()->delete($this->cacheResources[$cache], $ignoreLifetime);
+ }
+
+ /**
+ * Marks cached files as obsolete.
+ *
+ * @param string $directory
+ * @param string $filepattern
+ * @param boolean $forceDelete
+ */
+ public function clear($directory, $filepattern, $forceDelete = false) {
+ $this->getCacheSource()->clear($directory, $filepattern, $forceDelete);
+ }
+
+ /**
+ * Returns a cached variable.
+ *
+ * @param string $cache
+ * @param string $variable
+ * @return mixed $value
+ */
+ public function get($cache, $variable = '') {
+ if (!isset($this->cacheResources[$cache])) {
+ throw new SystemException("unknown cache resource '".$cache."'", 11005);
+ }
+
+ // try to get value
+ $value = $this->getCacheSource()->get($this->cacheResources[$cache]);
+ if ($value === null) {
+ // rebuild cache
+ $this->rebuild($this->cacheResources[$cache]);
+
+ // try to get value again
+ $value = $this->getCacheSource()->get($this->cacheResources[$cache]);
+ if ($value === null) {
+ throw new SystemException("cache resource '".$cache."' does not exist", 11005);
+ }
+ }
+
+ // return value
+ if (!empty($variable)) {
+ if (!isset($value[$variable])) {
+ throw new SystemException("variable '".$variable."' does not exist in cache resource '".$cache."'", 11008);
+ }
+
+ return $value[$variable];
+ }
+ else {
+ return $value;
+ }
+ }
+
+ /**
+ * Rebuilds a cache resource.
+ *
+ * @param array $cacheResource
+ * @return boolean result
+ */
+ public function rebuild($cacheResource) {
+ // instance cache class
+ if (!class_exists($cacheResource['className'])) {
+ throw new SystemException("Unable to find class '".$cacheResource['className']."'", 11001);
+ }
+
+ // update file last modified time to avoid multiple users rebuilding cache at the same time
+ if (get_class($this->getCacheSource()) == 'wcf\system\cache\source\DiskCacheSource') {
+ @touch($cacheResource['file']);
+ }
+
+ // build cache
+ $cacheBuilder = new $cacheResource['className'];
+ $value = $cacheBuilder->getData($cacheResource);
+
+ // save cache
+ $this->getCacheSource()->set($cacheResource, $value);
+
+ return true;
+ }
+
+ /**
+ * Returns the cache source object.
+ *
+ * @return CacheSource
+ */
+ public function getCacheSource() {
+ return $this->cacheSource;
+ }
}
-<?php\r
-namespace wcf\system\cache;\r
-\r
-/**\r
- * A CacheBuilder provides data to the CacheHandler that ought to be cached.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache\r
- * @category Community Framework\r
- */\r
-interface ICacheBuilder {\r
- /**\r
- * Returns the data that ought to be cached.\r
- *\r
- * @param array $cacheResource\r
- * @return array $data\r
- */\r
- public function getData($cacheResource);\r
+<?php
+namespace wcf\system\cache;
+
+/**
+ * A CacheBuilder provides data to the CacheHandler that ought to be cached.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache
+ * @category Community Framework
+ */
+interface ICacheBuilder {
+ /**
+ * Returns the data that ought to be cached.
+ *
+ * @param array $cacheResource
+ * @return array $data
+ */
+ public function getData($cacheResource);
}
-<?php\r
-namespace wcf\system\cache;\r
-\r
-/**\r
- * Disables cache functions during the wcf setup.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache\r
- * @category Community Framework\r
- */\r
-class SetupCacheHandler extends CacheHandler {\r
- /**\r
- * @see CacheHandler::addResource()\r
- */\r
- public function addResource($cache, $file, $classFile, $minLifetime = 0, $maxLifetime = 0) {\r
- return false;\r
- }\r
- \r
- /**\r
- * @see CacheHandler::clearResource()\r
- */\r
- public function clearResource($cache, $ignoreLifetime = false) {\r
- return false;\r
- }\r
- \r
- /**\r
- * @see CacheHandler::clear()\r
- */\r
- public function clear($directory, $filepattern, $forceDelete = false) {\r
- return false;\r
- }\r
- \r
- /**\r
- * @see CacheHandler::get()\r
- */\r
- public function get($cache, $variable = '') {\r
- return false;\r
- }\r
- \r
- /**\r
- * @see CacheHandler::load()\r
- */\r
- public function load($cacheResource, $reload = false) {\r
- return false;\r
- }\r
- \r
- /**\r
- * @see CacheHandler::rebuild()\r
- */\r
- public function rebuild($cacheResource, $forceRebuilt = false) {\r
- return false;\r
- }\r
+<?php
+namespace wcf\system\cache;
+
+/**
+ * Disables cache functions during the wcf setup.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache
+ * @category Community Framework
+ */
+class SetupCacheHandler extends CacheHandler {
+ /**
+ * @see CacheHandler::addResource()
+ */
+ public function addResource($cache, $file, $classFile, $minLifetime = 0, $maxLifetime = 0) {
+ return false;
+ }
+
+ /**
+ * @see CacheHandler::clearResource()
+ */
+ public function clearResource($cache, $ignoreLifetime = false) {
+ return false;
+ }
+
+ /**
+ * @see CacheHandler::clear()
+ */
+ public function clear($directory, $filepattern, $forceDelete = false) {
+ return false;
+ }
+
+ /**
+ * @see CacheHandler::get()
+ */
+ public function get($cache, $variable = '') {
+ return false;
+ }
+
+ /**
+ * @see CacheHandler::load()
+ */
+ public function load($cacheResource, $reload = false) {
+ return false;
+ }
+
+ /**
+ * @see CacheHandler::rebuild()
+ */
+ public function rebuild($cacheResource, $forceRebuilt = false) {
+ return false;
+ }
}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\acp\menu\item\ACPMenuItem;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches the acp menu items tree.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderACPMenu implements ICacheBuilder {\r
- protected $optionCategoryStructure = array();\r
-\r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- list($cache, $packageID) = explode('-', $cacheResource['cache']); \r
- $data = array();\r
-\r
- // get all menu items and filter menu items with low priority\r
- $sql = "SELECT menuItem, menuItemID\r
- FROM wcf".WCF_N."_acp_menu_item menu_item\r
- LEFT JOIN wcf".WCF_N."_package_dependency package_dependency\r
- ON (menu_item.packageID = package_dependency.dependency)\r
- WHERE package_dependency.packageID = ?\r
- ORDER BY package_dependency.priority ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($packageID));\r
- $itemIDs = array();\r
- while ($row = $statement->fetchArray()) {\r
- $itemIDs[$row['menuItem']] = $row['menuItemID'];\r
- }\r
- \r
- if (count($itemIDs) > 0) {\r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("menuItemID IN (?)", array($itemIDs));\r
- \r
- // get needed menu items and build item tree\r
- $sql = "SELECT menu_item.packageID, menuItem, parentMenuItem,\r
- menuItemLink, permissions, options, packageDir\r
- FROM wcf".WCF_N."_acp_menu_item menu_item\r
- LEFT JOIN wcf".WCF_N."_package package\r
- ON (package.packageID = menu_item.packageID)\r
- ".$conditions."\r
- ORDER BY showOrder ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- while ($row = $statement->fetchArray()) {\r
- if (!isset($data[$row['parentMenuItem']])) {\r
- $data[$row['parentMenuItem']] = array();\r
- }\r
- \r
- $data[$row['parentMenuItem']][] = new ACPMenuItem(null, $row);\r
- }\r
- }\r
- \r
- // get top option categories\r
- $optionCategories = $this->getTopOptionCategories($packageID);\r
- if (count($optionCategories) > 0) {\r
- if (!isset($data['wcf.acp.menu.link.option.category'])) {\r
- $data['wcf.acp.menu.link.option.category'] = array();\r
- }\r
- \r
- // get option category data\r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("categoryID IN (?)", array($optionCategories));\r
- \r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_option_category\r
- ".$conditions."\r
- ORDER BY showOrder ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- while ($row = $statement->fetchArray()) {\r
- $data['wcf.acp.menu.link.option.category'][] = new ACPMenuItem(null, array(\r
- 'packageID' => $packageID,\r
- 'menuItem' => 'wcf.acp.option.category.'.$row['categoryName'],\r
- 'parentMenuItem' => 'wcf.acp.menu.link.option.category',\r
- 'menuItemLink' => 'index.php?form=Option&categoryID='.$row['categoryID'],\r
- 'packageDir' => '',\r
- 'permissions' => $row['permissions'],\r
- 'options' => $row['options']\r
- ));\r
- }\r
- }\r
- \r
- return $data;\r
- }\r
- \r
- protected function getTopOptionCategories($packageID) {\r
- // get all option categories and filter categories with low priority\r
- $sql = "SELECT categoryName, categoryID \r
- FROM wcf".WCF_N."_option_category option_category\r
- LEFT JOIN wcf".WCF_N."_package_dependency package_dependency\r
- ON (package_dependency.dependency = option_category.packageID)\r
- WHERE package_dependency.packageID = ?\r
- ORDER BY package_dependency.priority ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($packageID));\r
- $optionCategories = array();\r
- while ($row = $statement->fetchArray()) {\r
- $optionCategories[$row['categoryName']] = $row['categoryID'];\r
- }\r
- \r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("categoryID IN (?)", array($optionCategories));\r
- $statementParameters = $conditions->getParameters();\r
- array_unshift($statementParameters, $packageID);\r
- \r
- $sql = "SELECT categoryID, parentCategoryName, categoryName,\r
- (\r
- SELECT COUNT(*) FROM wcf".WCF_N."_option WHERE categoryName = category.categoryName AND packageID IN (\r
- SELECT dependency FROM wcf".WCF_N."_package_dependency WHERE packageID = ?\r
- )\r
- ) AS count\r
- FROM wcf".WCF_N."_option_category category\r
- ".$conditions;\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($statementParameters);\r
- while ($row = $statement->fetchArray()) {\r
- if (!isset($this->optionCategoryStructure[$row['parentCategoryName']])) $this->optionCategoryStructure[$row['parentCategoryName']] = array();\r
- $this->optionCategoryStructure[$row['parentCategoryName']][] = $row;\r
- }\r
- \r
- $topOptionCategories = array();\r
- foreach ($this->optionCategoryStructure[''] as $optionCategory) {\r
- $count = $optionCategory['count'] + $this->countOptions($optionCategory['categoryName']);\r
- if ($count > 0) $topOptionCategories[] = $optionCategory['categoryID'];\r
- }\r
- \r
- return $topOptionCategories;\r
- }\r
- \r
- protected function countOptions($parentCategoryName) {\r
- if (!isset($this->optionCategoryStructure[$parentCategoryName])) return 0;\r
- \r
- $count = 0;\r
- foreach ($this->optionCategoryStructure[$parentCategoryName] as $optionCategory) {\r
- $count += $optionCategory['count'] + $this->countOptions($optionCategory['categoryName']);\r
- }\r
- \r
- return $count;\r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\acp\menu\item\ACPMenuItem;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches the acp menu items tree.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderACPMenu implements ICacheBuilder {
+ protected $optionCategoryStructure = array();
+
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ list($cache, $packageID) = explode('-', $cacheResource['cache']);
+ $data = array();
+
+ // get all menu items and filter menu items with low priority
+ $sql = "SELECT menuItem, menuItemID
+ FROM wcf".WCF_N."_acp_menu_item menu_item
+ LEFT JOIN wcf".WCF_N."_package_dependency package_dependency
+ ON (menu_item.packageID = package_dependency.dependency)
+ WHERE package_dependency.packageID = ?
+ ORDER BY package_dependency.priority ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($packageID));
+ $itemIDs = array();
+ while ($row = $statement->fetchArray()) {
+ $itemIDs[$row['menuItem']] = $row['menuItemID'];
+ }
+
+ if (count($itemIDs) > 0) {
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("menuItemID IN (?)", array($itemIDs));
+
+ // get needed menu items and build item tree
+ $sql = "SELECT menu_item.packageID, menuItem, parentMenuItem,
+ menuItemLink, permissions, options, packageDir
+ FROM wcf".WCF_N."_acp_menu_item menu_item
+ LEFT JOIN wcf".WCF_N."_package package
+ ON (package.packageID = menu_item.packageID)
+ ".$conditions."
+ ORDER BY showOrder ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+ while ($row = $statement->fetchArray()) {
+ if (!isset($data[$row['parentMenuItem']])) {
+ $data[$row['parentMenuItem']] = array();
+ }
+
+ $data[$row['parentMenuItem']][] = new ACPMenuItem(null, $row);
+ }
+ }
+
+ // get top option categories
+ $optionCategories = $this->getTopOptionCategories($packageID);
+ if (count($optionCategories) > 0) {
+ if (!isset($data['wcf.acp.menu.link.option.category'])) {
+ $data['wcf.acp.menu.link.option.category'] = array();
+ }
+
+ // get option category data
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("categoryID IN (?)", array($optionCategories));
+
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_option_category
+ ".$conditions."
+ ORDER BY showOrder ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+ while ($row = $statement->fetchArray()) {
+ $data['wcf.acp.menu.link.option.category'][] = new ACPMenuItem(null, array(
+ 'packageID' => $packageID,
+ 'menuItem' => 'wcf.acp.option.category.'.$row['categoryName'],
+ 'parentMenuItem' => 'wcf.acp.menu.link.option.category',
+ 'menuItemLink' => 'index.php?form=Option&categoryID='.$row['categoryID'],
+ 'packageDir' => '',
+ 'permissions' => $row['permissions'],
+ 'options' => $row['options']
+ ));
+ }
+ }
+
+ return $data;
+ }
+
+ protected function getTopOptionCategories($packageID) {
+ // get all option categories and filter categories with low priority
+ $sql = "SELECT categoryName, categoryID
+ FROM wcf".WCF_N."_option_category option_category
+ LEFT JOIN wcf".WCF_N."_package_dependency package_dependency
+ ON (package_dependency.dependency = option_category.packageID)
+ WHERE package_dependency.packageID = ?
+ ORDER BY package_dependency.priority ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($packageID));
+ $optionCategories = array();
+ while ($row = $statement->fetchArray()) {
+ $optionCategories[$row['categoryName']] = $row['categoryID'];
+ }
+
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("categoryID IN (?)", array($optionCategories));
+ $statementParameters = $conditions->getParameters();
+ array_unshift($statementParameters, $packageID);
+
+ $sql = "SELECT categoryID, parentCategoryName, categoryName,
+ (
+ SELECT COUNT(*) FROM wcf".WCF_N."_option WHERE categoryName = category.categoryName AND packageID IN (
+ SELECT dependency FROM wcf".WCF_N."_package_dependency WHERE packageID = ?
+ )
+ ) AS count
+ FROM wcf".WCF_N."_option_category category
+ ".$conditions;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($statementParameters);
+ while ($row = $statement->fetchArray()) {
+ if (!isset($this->optionCategoryStructure[$row['parentCategoryName']])) $this->optionCategoryStructure[$row['parentCategoryName']] = array();
+ $this->optionCategoryStructure[$row['parentCategoryName']][] = $row;
+ }
+
+ $topOptionCategories = array();
+ foreach ($this->optionCategoryStructure[''] as $optionCategory) {
+ $count = $optionCategory['count'] + $this->countOptions($optionCategory['categoryName']);
+ if ($count > 0) $topOptionCategories[] = $optionCategory['categoryID'];
+ }
+
+ return $topOptionCategories;
+ }
+
+ protected function countOptions($parentCategoryName) {
+ if (!isset($this->optionCategoryStructure[$parentCategoryName])) return 0;
+
+ $count = 0;
+ foreach ($this->optionCategoryStructure[$parentCategoryName] as $optionCategory) {
+ $count += $optionCategory['count'] + $this->countOptions($optionCategory['categoryName']);
+ }
+
+ return $count;
+ }
+}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\event\listener\EventHandler;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Caches the event listeners.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderEventListener implements ICacheBuilder {\r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- list($cache, $packageID) = explode('-', $cacheResource['cache']); \r
- $data = array(\r
- 'actions' => array('user' => array(), 'admin' => array()),\r
- 'inheritedActions' => array('user' => array(), 'admin' => array())\r
- );\r
- \r
- // get all listeners and filter options with low priority\r
- $sql = "SELECT event_listener.*\r
- FROM wcf".WCF_N."_event_listener event_listener\r
- LEFT JOIN wcf".WCF_N."_package_dependency package_dependency\r
- ON (package_dependency.dependency = event_listener.packageID)\r
- WHERE package_dependency.packageID = ?\r
- ORDER BY package_dependency.priority ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($packageID));\r
- while ($row = $statement->fetchArray()) {\r
- // distinguish between inherited actions and non-inherited actions\r
- if (!$row['inherit']) {\r
- $data['actions'][EventHandler::generateKey($row['eventClassName'], $row['eventName'])][] = $row;\r
- }\r
- else {\r
- if (!isset($data['inheritedActions'][$row['eventClassName']])) $data['inheritedActions'][$row['eventClassName']] = array();\r
- $data['inheritedActions'][$row['eventClassName']][$row['eventName']][] = $row; \r
- }\r
- }\r
- \r
- // sort data by nice value and class name\r
- foreach ($data['actions'] as $key => $listeners) {\r
- uasort($data['actions'][$key], array(__CLASS__, 'sortListeners'));\r
- }\r
- \r
- foreach ($data['inheritedActions'] as $class => $listeners) {\r
- foreach ($listeners as $key => $val) {\r
- uasort($data['inheritedActions'][$class][$key], array(__CLASS__, 'sortListeners'));\r
- }\r
- }\r
- \r
- return $data;\r
- }\r
- \r
- /**\r
- * Sorts the event listeners alphabetically.\r
- */\r
- public static function sortListeners($listenerA, $listenerB) {\r
- if ($listenerA['niceValue'] < $listenerB['niceValue']) {\r
- return -1;\r
- }\r
- else if ($listenerA['niceValue'] > $listenerB['niceValue']) {\r
- return 1;\r
- }\r
- else {\r
- return strcmp($listenerA['listenerClassName'], $listenerB['listenerClassName']);\r
- } \r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\event\listener\EventHandler;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * Caches the event listeners.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderEventListener implements ICacheBuilder {
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ list($cache, $packageID) = explode('-', $cacheResource['cache']);
+ $data = array(
+ 'actions' => array('user' => array(), 'admin' => array()),
+ 'inheritedActions' => array('user' => array(), 'admin' => array())
+ );
+
+ // get all listeners and filter options with low priority
+ $sql = "SELECT event_listener.*
+ FROM wcf".WCF_N."_event_listener event_listener
+ LEFT JOIN wcf".WCF_N."_package_dependency package_dependency
+ ON (package_dependency.dependency = event_listener.packageID)
+ WHERE package_dependency.packageID = ?
+ ORDER BY package_dependency.priority ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($packageID));
+ while ($row = $statement->fetchArray()) {
+ // distinguish between inherited actions and non-inherited actions
+ if (!$row['inherit']) {
+ $data['actions'][EventHandler::generateKey($row['eventClassName'], $row['eventName'])][] = $row;
+ }
+ else {
+ if (!isset($data['inheritedActions'][$row['eventClassName']])) $data['inheritedActions'][$row['eventClassName']] = array();
+ $data['inheritedActions'][$row['eventClassName']][$row['eventName']][] = $row;
+ }
+ }
+
+ // sort data by nice value and class name
+ foreach ($data['actions'] as $key => $listeners) {
+ uasort($data['actions'][$key], array(__CLASS__, 'sortListeners'));
+ }
+
+ foreach ($data['inheritedActions'] as $class => $listeners) {
+ foreach ($listeners as $key => $val) {
+ uasort($data['inheritedActions'][$class][$key], array(__CLASS__, 'sortListeners'));
+ }
+ }
+
+ return $data;
+ }
+
+ /**
+ * Sorts the event listeners alphabetically.
+ */
+ public static function sortListeners($listenerA, $listenerB) {
+ if ($listenerA['niceValue'] < $listenerB['niceValue']) {
+ return -1;
+ }
+ else if ($listenerA['niceValue'] > $listenerB['niceValue']) {
+ return 1;
+ }
+ else {
+ return strcmp($listenerA['listenerClassName'], $listenerB['listenerClassName']);
+ }
+ }
+}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches languages, language to packages relation, package to languages relation\r
- * and the id of the default language. \r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderLanguage implements ICacheBuilder {\r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- $languageToPackages = array();\r
- $data = array(\r
- 'codes' => array(),\r
- 'languages' => array(), \r
- 'packages' => array(),\r
- 'default' => 0,\r
- 'categories' => array()\r
- );\r
- \r
- // get language to packages\r
- $sql = "SELECT package.languageID, package.packageID\r
- FROM wcf".WCF_N."_language_to_package package\r
- LEFT JOIN wcf".WCF_N."_language language\r
- ON (language.languageID = package.languageID)\r
- ORDER BY language.isDefault DESC,\r
- language.languageCode ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- while ($row = $statement->fetchArray()) {\r
- // package to languages\r
- if (!isset($data['packages'][$row['packageID']])) {\r
- $data['packages'][$row['packageID']] = array();\r
- }\r
- $data['packages'][$row['packageID']][] = $row['languageID'];\r
- \r
- // language to packages\r
- if (!isset($languageToPackages[$row['languageID']])) {\r
- $languageToPackages[$row['languageID']] = array();\r
- }\r
- $languageToPackages[$row['languageID']][] = $row['packageID'];\r
- }\r
- \r
- // get languages\r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_language";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- while ($row = $statement->fetchArray()) {\r
- // language data\r
- $data['languages'][$row['languageID']] = $row;\r
- \r
- // language to packages\r
- if (!isset($languageToPackages[$row['languageID']])) {\r
- $languageToPackages[$row['languageID']] = array();\r
- }\r
- $data['languages'][$row['languageID']]['packages'] = $languageToPackages[$row['languageID']];\r
- \r
- // default language\r
- if ($row['isDefault']) {\r
- $data['default'] = $row['languageID'];\r
- }\r
- \r
- // language code to language id\r
- $data['codes'][$row['languageCode']] = $row['languageID'];\r
- }\r
- \r
- // get language categories\r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_language_category";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- while ($row = $statement->fetchArray()) {\r
- // package to languages\r
- $data['categories'][$row['languageCategory']] = $row;\r
- }\r
-\r
- return $data;\r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches languages, language to packages relation, package to languages relation
+ * and the id of the default language.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderLanguage implements ICacheBuilder {
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ $languageToPackages = array();
+ $data = array(
+ 'codes' => array(),
+ 'languages' => array(),
+ 'packages' => array(),
+ 'default' => 0,
+ 'categories' => array()
+ );
+
+ // get language to packages
+ $sql = "SELECT package.languageID, package.packageID
+ FROM wcf".WCF_N."_language_to_package package
+ LEFT JOIN wcf".WCF_N."_language language
+ ON (language.languageID = package.languageID)
+ ORDER BY language.isDefault DESC,
+ language.languageCode ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute();
+ while ($row = $statement->fetchArray()) {
+ // package to languages
+ if (!isset($data['packages'][$row['packageID']])) {
+ $data['packages'][$row['packageID']] = array();
+ }
+ $data['packages'][$row['packageID']][] = $row['languageID'];
+
+ // language to packages
+ if (!isset($languageToPackages[$row['languageID']])) {
+ $languageToPackages[$row['languageID']] = array();
+ }
+ $languageToPackages[$row['languageID']][] = $row['packageID'];
+ }
+
+ // get languages
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_language";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute();
+ while ($row = $statement->fetchArray()) {
+ // language data
+ $data['languages'][$row['languageID']] = $row;
+
+ // language to packages
+ if (!isset($languageToPackages[$row['languageID']])) {
+ $languageToPackages[$row['languageID']] = array();
+ }
+ $data['languages'][$row['languageID']]['packages'] = $languageToPackages[$row['languageID']];
+
+ // default language
+ if ($row['isDefault']) {
+ $data['default'] = $row['languageID'];
+ }
+
+ // language code to language id
+ $data['codes'][$row['languageCode']] = $row['languageID'];
+ }
+
+ // get language categories
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_language_category";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute();
+ while ($row = $statement->fetchArray()) {
+ // package to languages
+ $data['categories'][$row['languageCategory']] = $row;
+ }
+
+ return $data;
+ }
+}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\option\category\OptionCategory;\r
-use wcf\data\option\Option;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches the options and option categories\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderOption implements ICacheBuilder {\r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- $information = explode('-', $cacheResource['cache']);\r
- if (count($information) == 3) {\r
- $type = $information[0].'_';\r
- $packageID = $information[2];\r
- }\r
- else {\r
- $type = '';\r
- $packageID = $information[1];\r
- }\r
- \r
- $data = array(\r
- 'categories' => array(),\r
- 'options' => array(),\r
- 'categoryStructure' => array(),\r
- 'optionToCategories' => array()\r
- );\r
-\r
- // option categories\r
- // get all option categories and sort categories by priority\r
- $sql = "SELECT categoryName, categoryID \r
- FROM wcf".WCF_N."_".$type."option_category option_category\r
- LEFT JOIN wcf".WCF_N."_package_dependency package_dependency\r
- ON (package_dependency.dependency = option_category.packageID)\r
- WHERE package_dependency.packageID = ?\r
- ORDER BY package_dependency.priority ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($packageID));\r
- $optionCategories = array();\r
- while ($row = $statement->fetchArray()) {\r
- $optionCategories[$row['categoryName']] = $row['categoryID'];\r
- }\r
- \r
- if (count($optionCategories) > 0) {\r
- // get needed option categories\r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("categoryID IN (?)", array($optionCategories));\r
- \r
- $sql = "SELECT option_category.*, package.packageDir\r
- FROM wcf".WCF_N."_".$type."option_category option_category\r
- LEFT JOIN wcf".WCF_N."_package package\r
- ON (package.packageID = option_category.packageID)\r
- ".$conditions."\r
- ORDER BY showOrder ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- while ($row = $statement->fetchArray()) {\r
- $data['categories'][$row['categoryName']] = new OptionCategory(null, $row);\r
- if (!isset($data['categoryStructure'][$row['parentCategoryName']])) {\r
- $data['categoryStructure'][$row['parentCategoryName']] = array();\r
- }\r
- \r
- $data['categoryStructure'][$row['parentCategoryName']][] = $row['categoryName'];\r
- }\r
- }\r
- \r
- // options\r
- // get all options and sort options by priority\r
- $optionIDs = array();\r
- $sql = "SELECT optionName, optionID \r
- FROM wcf".WCF_N."_".$type."option option_table\r
- LEFT JOIN wcf".WCF_N."_package_dependency package_dependency\r
- ON (package_dependency.dependency = option_table.packageID)\r
- WHERE package_dependency.packageID = ?\r
- ORDER BY package_dependency.priority ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($packageID));\r
- while ($row = $statement->fetchArray()) {\r
- $optionIDs[$row['optionName']] = $row['optionID'];\r
- }\r
- \r
- if (count($optionIDs) > 0) {\r
- // get needed options\r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("optionID IN (?)", array($optionIDs));\r
- \r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_".$type."option\r
- ".$conditions."\r
- ORDER BY showOrder ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- while ($row = $statement->fetchArray()) {\r
- $data['options'][$row['optionName']] = new Option(null, $row);\r
- if (!isset($data['optionToCategories'][$row['categoryName']])) {\r
- $data['optionToCategories'][$row['categoryName']] = array();\r
- }\r
- \r
- $data['optionToCategories'][$row['categoryName']][] = $row['optionName'];\r
- }\r
- }\r
- \r
- return $data;\r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\option\category\OptionCategory;
+use wcf\data\option\Option;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches the options and option categories
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderOption implements ICacheBuilder {
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ $information = explode('-', $cacheResource['cache']);
+ if (count($information) == 3) {
+ $type = $information[0].'_';
+ $packageID = $information[2];
+ }
+ else {
+ $type = '';
+ $packageID = $information[1];
+ }
+
+ $data = array(
+ 'categories' => array(),
+ 'options' => array(),
+ 'categoryStructure' => array(),
+ 'optionToCategories' => array()
+ );
+
+ // option categories
+ // get all option categories and sort categories by priority
+ $sql = "SELECT categoryName, categoryID
+ FROM wcf".WCF_N."_".$type."option_category option_category
+ LEFT JOIN wcf".WCF_N."_package_dependency package_dependency
+ ON (package_dependency.dependency = option_category.packageID)
+ WHERE package_dependency.packageID = ?
+ ORDER BY package_dependency.priority ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($packageID));
+ $optionCategories = array();
+ while ($row = $statement->fetchArray()) {
+ $optionCategories[$row['categoryName']] = $row['categoryID'];
+ }
+
+ if (count($optionCategories) > 0) {
+ // get needed option categories
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("categoryID IN (?)", array($optionCategories));
+
+ $sql = "SELECT option_category.*, package.packageDir
+ FROM wcf".WCF_N."_".$type."option_category option_category
+ LEFT JOIN wcf".WCF_N."_package package
+ ON (package.packageID = option_category.packageID)
+ ".$conditions."
+ ORDER BY showOrder ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+ while ($row = $statement->fetchArray()) {
+ $data['categories'][$row['categoryName']] = new OptionCategory(null, $row);
+ if (!isset($data['categoryStructure'][$row['parentCategoryName']])) {
+ $data['categoryStructure'][$row['parentCategoryName']] = array();
+ }
+
+ $data['categoryStructure'][$row['parentCategoryName']][] = $row['categoryName'];
+ }
+ }
+
+ // options
+ // get all options and sort options by priority
+ $optionIDs = array();
+ $sql = "SELECT optionName, optionID
+ FROM wcf".WCF_N."_".$type."option option_table
+ LEFT JOIN wcf".WCF_N."_package_dependency package_dependency
+ ON (package_dependency.dependency = option_table.packageID)
+ WHERE package_dependency.packageID = ?
+ ORDER BY package_dependency.priority ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($packageID));
+ while ($row = $statement->fetchArray()) {
+ $optionIDs[$row['optionName']] = $row['optionID'];
+ }
+
+ if (count($optionIDs) > 0) {
+ // get needed options
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("optionID IN (?)", array($optionIDs));
+
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_".$type."option
+ ".$conditions."
+ ORDER BY showOrder ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+ while ($row = $statement->fetchArray()) {
+ $data['options'][$row['optionName']] = new Option(null, $row);
+ if (!isset($data['optionToCategories'][$row['categoryName']])) {
+ $data['optionToCategories'][$row['categoryName']] = array();
+ }
+
+ $data['optionToCategories'][$row['categoryName']][] = $row['optionName'];
+ }
+ }
+
+ return $data;
+ }
+}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\package\PackageList;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches all registered packages.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderPackage implements ICacheBuilder {\r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- $packageList = new PackageList();\r
- $packageList->sqlLimit = 0;\r
- $packageList->readObjects();\r
- \r
- return $packageList->getObjects();\r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\package\PackageList;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches all registered packages.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderPackage implements ICacheBuilder {
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ $packageList = new PackageList();
+ $packageList->sqlLimit = 0;
+ $packageList->readObjects();
+
+ return $packageList->getObjects();
+ }
+}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\spider\SpiderList;\r
-use wcf\system\cache\ICacheBuilder;\r
-\r
-/**\r
- * Caches the list of search engine spiders.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderSpider implements ICacheBuilder {\r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- $spiderList = new SpiderList();\r
- $spiderList->sqlOrderBy = "spider.spiderID ASC";\r
- $spiderList->sqlLimit = 0;\r
- $spiderList->readObjects();\r
- \r
- return $spiderList->getObjects();\r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\spider\SpiderList;
+use wcf\system\cache\ICacheBuilder;
+
+/**
+ * Caches the list of search engine spiders.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderSpider implements ICacheBuilder {
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ $spiderList = new SpiderList();
+ $spiderList->sqlOrderBy = "spider.spiderID ASC";
+ $spiderList->sqlLimit = 0;
+ $spiderList->readObjects();
+
+ return $spiderList->getObjects();
+ }
+}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\style\Style;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches the styles and style variables.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderStyle implements ICacheBuilder {\r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- $data = array('default' => 0, 'styles' => array(), 'packages' => array());\r
- \r
- // get all styles\r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_style\r
- ORDER BY styleName ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- while ($row = $statement->fetchArray()) {\r
- if ($row['isDefault']) $data['default'] = $row['styleID'];\r
- $row['variables'] = array();\r
- \r
- // get variable\r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_style_variable\r
- WHERE styleID = ?";\r
- $statement2 = WCF::getDB()->prepareStatement($sql);\r
- $statement2->execute(array($row['styleID']));\r
- while ($row = $statement2->fetchArray()) {\r
- \r
- $row['variables'][$row2['variableName']] = $row2['variableValue'];\r
- }\r
- \r
- $data['styles'][$row['styleID']] = new Style(null, $row);\r
- }\r
- \r
- // get style to packages\r
- $sql = "SELECT *\r
- FROM wcf".WCF_N."_style_to_package\r
- ORDER BY packageID ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- while ($row = $statement->fetchArray()) {\r
- \r
- if (!isset($data['packages'][$row['packageID']])) {\r
- $data['packages'][$row['packageID']] = array('default' => 0, 'disabled' => array());\r
- }\r
- \r
- if ($row['isDefault']) {\r
- $data['packages'][$row['packageID']]['default'] = $row['styleID'];\r
- }\r
- $data['packages'][$row['packageID']]['disabled'][$row['styleID']] = $row['disabled'];\r
- }\r
- \r
- return $data;\r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\style\Style;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches the styles and style variables.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderStyle implements ICacheBuilder {
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ $data = array('default' => 0, 'styles' => array(), 'packages' => array());
+
+ // get all styles
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_style
+ ORDER BY styleName ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute();
+ while ($row = $statement->fetchArray()) {
+ if ($row['isDefault']) $data['default'] = $row['styleID'];
+ $row['variables'] = array();
+
+ // get variable
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_style_variable
+ WHERE styleID = ?";
+ $statement2 = WCF::getDB()->prepareStatement($sql);
+ $statement2->execute(array($row['styleID']));
+ while ($row = $statement2->fetchArray()) {
+
+ $row['variables'][$row2['variableName']] = $row2['variableValue'];
+ }
+
+ $data['styles'][$row['styleID']] = new Style(null, $row);
+ }
+
+ // get style to packages
+ $sql = "SELECT *
+ FROM wcf".WCF_N."_style_to_package
+ ORDER BY packageID ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute();
+ while ($row = $statement->fetchArray()) {
+
+ if (!isset($data['packages'][$row['packageID']])) {
+ $data['packages'][$row['packageID']] = array('default' => 0, 'disabled' => array());
+ }
+
+ if ($row['isDefault']) {
+ $data['packages'][$row['packageID']]['default'] = $row['styleID'];
+ }
+ $data['packages'][$row['packageID']]['disabled'][$row['styleID']] = $row['disabled'];
+ }
+
+ return $data;
+ }
+}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Caches the structure of templates.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderTemplate implements ICacheBuilder {\r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- $information = explode('-', $cacheResource['cache']);\r
- if (count($information) == 3) {\r
- $prefix = $information[0].'_';\r
- $packageID = $information[2];\r
- }\r
- else {\r
- $prefix = '';\r
- $packageID = $information[1];\r
- }\r
- \r
- $data = array();\r
- \r
- // get package directory for given package id\r
- $sql = "SELECT packageDir\r
- FROM wcf".WCF_N."_package\r
- WHERE packageID = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($packageID));\r
- $row = $statement->fetchArray();\r
- \r
- // get all templates and filter options with low priority\r
- $sql = "SELECT templateName, template.packageID \r
- FROM wcf".WCF_N."_".$prefix."template template\r
- LEFT JOIN wcf".WCF_N."_package_dependency package_dependency\r
- ON (package_dependency.dependency = template.packageID)\r
- WHERE package_dependency.packageID = ?\r
- ORDER BY package_dependency.priority DESC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($packageID));\r
- while ($row = $statement->fetchArray()) {\r
- if (!isset($data[$row['templateName']]) || $packageID == $row['packageID']) {\r
- $data[$row['templateName']] = $row['packageID'];\r
- }\r
- }\r
- \r
- return $data;\r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\WCF;
+
+/**
+ * Caches the structure of templates.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderTemplate implements ICacheBuilder {
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ $information = explode('-', $cacheResource['cache']);
+ if (count($information) == 3) {
+ $prefix = $information[0].'_';
+ $packageID = $information[2];
+ }
+ else {
+ $prefix = '';
+ $packageID = $information[1];
+ }
+
+ $data = array();
+
+ // get package directory for given package id
+ $sql = "SELECT packageDir
+ FROM wcf".WCF_N."_package
+ WHERE packageID = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($packageID));
+ $row = $statement->fetchArray();
+
+ // get all templates and filter options with low priority
+ $sql = "SELECT templateName, template.packageID
+ FROM wcf".WCF_N."_".$prefix."template template
+ LEFT JOIN wcf".WCF_N."_package_dependency package_dependency
+ ON (package_dependency.dependency = template.packageID)
+ WHERE package_dependency.packageID = ?
+ ORDER BY package_dependency.priority DESC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($packageID));
+ while ($row = $statement->fetchArray()) {
+ if (!isset($data[$row['templateName']]) || $packageID == $row['packageID']) {
+ $data[$row['templateName']] = $row['packageID'];
+ }
+ }
+
+ return $data;
+ }
+}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\data\user\group\UserGroupList;\r
-use wcf\system\cache\ICacheBuilder;\r
-\r
-/**\r
- * Caches all user groups.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderUserGroup implements ICacheBuilder {\r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- $data = array('types' => array(), 'groups' => array());\r
-\r
- // get all user groups\r
- $groupList = new UserGroupList();\r
- $groupList->sqlOrderBy = "user_group.groupName";\r
- $groupList->sqlLimit = 0;\r
- $groupList->readObjects();\r
- $groups = $groupList->getObjects();\r
- \r
- foreach ($groups as $group) {\r
- if (!isset($data['types'][$group->groupType])) {\r
- $data['types'][$group->groupType] = array();\r
- }\r
- \r
- $data['types'][$group->groupType][] = $group->groupID;\r
- $data['groups'][$group->groupID] = $group;\r
- }\r
- \r
- return $data;\r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\data\user\group\UserGroupList;
+use wcf\system\cache\ICacheBuilder;
+
+/**
+ * Caches all user groups.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderUserGroup implements ICacheBuilder {
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ $data = array('types' => array(), 'groups' => array());
+
+ // get all user groups
+ $groupList = new UserGroupList();
+ $groupList->sqlOrderBy = "user_group.groupName";
+ $groupList->sqlLimit = 0;
+ $groupList->readObjects();
+ $groups = $groupList->getObjects();
+
+ foreach ($groups as $group) {
+ if (!isset($data['types'][$group->groupType])) {
+ $data['types'][$group->groupType] = array();
+ }
+
+ $data['types'][$group->groupType][] = $group->groupID;
+ $data['groups'][$group->groupID] = $group;
+ }
+
+ return $data;
+ }
+}
-<?php\r
-namespace wcf\system\cache\builder;\r
-use wcf\system\cache\ICacheBuilder;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\WCF;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * Caches the merged group options of a group combination.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cache.builder\r
- * @category Community Framework\r
- */\r
-class CacheBuilderUserGroupPermission implements ICacheBuilder {\r
- protected $typeObjects = array();\r
- \r
- /**\r
- * @see wcf\system\cache\ICacheBuilder::getData()\r
- */\r
- public function getData($cacheResource) {\r
- list($cache, $packageID, $groupIDs) = explode('-', $cacheResource['cache']);\r
- $data = array();\r
- \r
- // get all options and filter options with low priority\r
- if ($packageID == 0) {\r
- // during the installation of the package wcf\r
- $sql = "SELECT optionName, optionID \r
- FROM wcf".WCF_N."_user_group_option\r
- WHERE packageID IS NULL";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute();\r
- }\r
- else {\r
- $sql = "SELECT optionName, optionID \r
- FROM wcf".WCF_N."_user_group_option option_table\r
- LEFT JOIN wcf".WCF_N."_package_dependency package_dependency\r
- ON (package_dependency.dependency = option_table.packageID)\r
- WHERE package_dependency.packageID = ?\r
- ORDER BY package_dependency.priority ASC";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($packageID));\r
- }\r
- \r
- $options = array();\r
- while ($row = $statement->fetchArray()) {\r
- $options[$row['optionName']] = $row['optionID'];\r
- }\r
- \r
- if (count($options) > 0) {\r
- // get needed options\r
- $conditions = new PreparedStatementConditionBuilder();\r
- $conditions->add("option_value.groupID IN (?)", array(explode(',', $groupIDs)));\r
- $conditions->add("option_value.optionID IN (?)", array($options));\r
- \r
- $sql = "SELECT option_table.optionName, option_table.optionType, option_value.optionValue\r
- FROM wcf".WCF_N."_user_group_option_value option_value\r
- LEFT JOIN wcf".WCF_N."_user_group_option option_table\r
- ON (option_table.optionID = option_value.optionID)\r
- ".$conditions;\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute($conditions->getParameters());\r
- while ($row = $statement->fetchArray()) {\r
- if (!isset($data[$row['optionName']])) {\r
- $data[$row['optionName']] = array('type' => $row['optionType'], 'values' => array());\r
- }\r
- \r
- $data[$row['optionName']]['values'][] = $row['optionValue'];\r
- }\r
- \r
- // merge values\r
- foreach ($data as $optionName => $option) {\r
- if (count($option['values']) == 1) {\r
- $result = $option['values'][0];\r
- }\r
- else {\r
- $typeObj = $this->getTypeObject($option['type']);\r
- $result = $typeObj->merge($option['values']);\r
- }\r
- \r
- // unset false values\r
- if ($result === false) {\r
- unset($data[$optionName]);\r
- }\r
- else {\r
- $data[$optionName] = $result;\r
- }\r
- }\r
- }\r
- \r
- $data['groupIDs'] = $groupIDs;\r
- return $data;\r
- }\r
- \r
- /**\r
- * Returns an object of the requested group option type.\r
- * \r
- * @param string $type\r
- * @return wcf\system\option\group\IGroupOptionType\r
- */\r
- protected function getTypeObject($type) {\r
- if (!isset($this->typeObjects[$type])) {\r
- $className = 'wcf\system\option\group\GroupOptionType'.ucfirst($type);\r
- \r
- // validate class\r
- if (!class_exists($className)) {\r
- throw new SystemException("unable to find class '".$className."'", 11001);\r
- }\r
- if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\group\IGroupOptionType')) {\r
- throw new SystemException("'".$className."' should implement wcf\system\option\group\IGroupOptionType");\r
- }\r
- \r
- // create instance\r
- $this->typeObjects[$type] = new $className();\r
- }\r
- \r
- return $this->typeObjects[$type];\r
- }\r
-}\r
+<?php
+namespace wcf\system\cache\builder;
+use wcf\system\cache\ICacheBuilder;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\SystemException;
+use wcf\system\WCF;
+use wcf\util\ClassUtil;
+
+/**
+ * Caches the merged group options of a group combination.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cache.builder
+ * @category Community Framework
+ */
+class CacheBuilderUserGroupPermission implements ICacheBuilder {
+ protected $typeObjects = array();
+
+ /**
+ * @see wcf\system\cache\ICacheBuilder::getData()
+ */
+ public function getData($cacheResource) {
+ list($cache, $packageID, $groupIDs) = explode('-', $cacheResource['cache']);
+ $data = array();
+
+ // get all options and filter options with low priority
+ if ($packageID == 0) {
+ // during the installation of the package wcf
+ $sql = "SELECT optionName, optionID
+ FROM wcf".WCF_N."_user_group_option
+ WHERE packageID IS NULL";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute();
+ }
+ else {
+ $sql = "SELECT optionName, optionID
+ FROM wcf".WCF_N."_user_group_option option_table
+ LEFT JOIN wcf".WCF_N."_package_dependency package_dependency
+ ON (package_dependency.dependency = option_table.packageID)
+ WHERE package_dependency.packageID = ?
+ ORDER BY package_dependency.priority ASC";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($packageID));
+ }
+
+ $options = array();
+ while ($row = $statement->fetchArray()) {
+ $options[$row['optionName']] = $row['optionID'];
+ }
+
+ if (count($options) > 0) {
+ // get needed options
+ $conditions = new PreparedStatementConditionBuilder();
+ $conditions->add("option_value.groupID IN (?)", array(explode(',', $groupIDs)));
+ $conditions->add("option_value.optionID IN (?)", array($options));
+
+ $sql = "SELECT option_table.optionName, option_table.optionType, option_value.optionValue
+ FROM wcf".WCF_N."_user_group_option_value option_value
+ LEFT JOIN wcf".WCF_N."_user_group_option option_table
+ ON (option_table.optionID = option_value.optionID)
+ ".$conditions;
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute($conditions->getParameters());
+ while ($row = $statement->fetchArray()) {
+ if (!isset($data[$row['optionName']])) {
+ $data[$row['optionName']] = array('type' => $row['optionType'], 'values' => array());
+ }
+
+ $data[$row['optionName']]['values'][] = $row['optionValue'];
+ }
+
+ // merge values
+ foreach ($data as $optionName => $option) {
+ if (count($option['values']) == 1) {
+ $result = $option['values'][0];
+ }
+ else {
+ $typeObj = $this->getTypeObject($option['type']);
+ $result = $typeObj->merge($option['values']);
+ }
+
+ // unset false values
+ if ($result === false) {
+ unset($data[$optionName]);
+ }
+ else {
+ $data[$optionName] = $result;
+ }
+ }
+ }
+
+ $data['groupIDs'] = $groupIDs;
+ return $data;
+ }
+
+ /**
+ * Returns an object of the requested group option type.
+ *
+ * @param string $type
+ * @return wcf\system\option\group\IGroupOptionType
+ */
+ protected function getTypeObject($type) {
+ if (!isset($this->typeObjects[$type])) {
+ $className = 'wcf\system\option\group\GroupOptionType'.ucfirst($type);
+
+ // validate class
+ if (!class_exists($className)) {
+ throw new SystemException("unable to find class '".$className."'", 11001);
+ }
+ if (!ClassUtil::isInstanceOf($className, 'wcf\system\option\group\IGroupOptionType')) {
+ throw new SystemException("'".$className."' should implement wcf\system\option\group\IGroupOptionType");
+ }
+
+ // create instance
+ $this->typeObjects[$type] = new $className();
+ }
+
+ return $this->typeObjects[$type];
+ }
+}
-<?php\r
-namespace wcf\system\cleanup;\r
-\r
-/**\r
- * Default interface for cleanup adapters.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cleanup\r
- * @category Community Framework\r
- */\r
-interface ICleanupAdapter {\r
- /**\r
- * Executes this adapter.\r
- * \r
- * @param array $objectIDs\r
- */\r
- public function execute(array $objectIDs);\r
+<?php
+namespace wcf\system\cleanup;
+
+/**
+ * Default interface for cleanup adapters.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cleanup
+ * @category Community Framework
+ */
+interface ICleanupAdapter {
+ /**
+ * Executes this adapter.
+ *
+ * @param array $objectIDs
+ */
+ public function execute(array $objectIDs);
}
-<?php\r
-namespace wcf\system\cronjob;\r
-use wcf\system\cleanup\CleanupHandler;\r
-\r
-/**\r
- * Executes cleanup adapters.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cronjob\r
- * @category Community Framework\r
- */\r
-class CleanupListenerCronjob implements ICronjob {\r
- /**\r
- * @see wcf\system\ICronjob::execute()\r
- */\r
- public function execute(array $data) {\r
- CleanupHandler::getInstance()->execute();\r
- }\r
+<?php
+namespace wcf\system\cronjob;
+use wcf\system\cleanup\CleanupHandler;
+
+/**
+ * Executes cleanup adapters.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cronjob
+ * @category Community Framework
+ */
+class CleanupListenerCronjob implements ICronjob {
+ /**
+ * @see wcf\system\ICronjob::execute()
+ */
+ public function execute(array $data) {
+ CleanupHandler::getInstance()->execute();
+ }
}
-<?php\r
-namespace wcf\system\cronjob;\r
-use wcf\acp\package\update\PackageUpdate;\r
-\r
-/**\r
- * Gets update package information.\r
- * \r
- * @author Siegfried Schweizer\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.cronjob\r
- * @category Community Framework\r
- */\r
-class GetUpdateInfoCronjob implements ICronjob {\r
- /**\r
- * @see wcf\system\ICronjob::execute()\r
- * @TODO Change path and move method to lib/system/package\r
- */\r
- public function execute(array $data) {\r
- PackageUpdate::refreshPackageDatabaseAutomatically();\r
- }\r
+<?php
+namespace wcf\system\cronjob;
+use wcf\acp\package\update\PackageUpdate;
+
+/**
+ * Gets update package information.
+ *
+ * @author Siegfried Schweizer
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.cronjob
+ * @category Community Framework
+ */
+class GetUpdateInfoCronjob implements ICronjob {
+ /**
+ * @see wcf\system\ICronjob::execute()
+ * @TODO Change path and move method to lib/system/package
+ */
+ public function execute(array $data) {
+ PackageUpdate::refreshPackageDatabaseAutomatically();
+ }
}
-<?php\r
-namespace wcf\system\cronjob;\r
-\r
-/**\r
- * Any Cronjob should implement this interface.\r
- * \r
- * @author Siegfried Schweizer\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf.data.cronjobs\r
- * @subpackage system.cronjob\r
- * @category Community Framework\r
- */\r
-interface ICronjob {\r
- /**\r
- * To be called when executing the cronjob; the $data array e.g. might be used for passing\r
- * meaningful values to the cronjob in order to reasonably avail multipleExecs.\r
- * \r
- * @param array $data This array should basically contain the dataset \r
- * associated to the executed cronjob, particularly \r
- * the date of the planned execution (the nextExec \r
- * field).\r
- */\r
- public function execute(array $data);\r
+<?php
+namespace wcf\system\cronjob;
+
+/**
+ * Any Cronjob should implement this interface.
+ *
+ * @author Siegfried Schweizer
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf.data.cronjobs
+ * @subpackage system.cronjob
+ * @category Community Framework
+ */
+interface ICronjob {
+ /**
+ * To be called when executing the cronjob; the $data array e.g. might be used for passing
+ * meaningful values to the cronjob in order to reasonably avail multipleExecs.
+ *
+ * @param array $data This array should basically contain the dataset
+ * associated to the executed cronjob, particularly
+ * the date of the planned execution (the nextExec
+ * field).
+ */
+ public function execute(array $data);
}
-<?php\r
-namespace wcf\system\database;\r
-use wcf\system\database\statement\PreparedStatement;\r
-use wcf\data\DatabaseObject;\r
-use wcf\system\SystemException;\r
-\r
-/**\r
- * This is an abstract implementation of a database access class using PDO.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.database\r
- * @category Community Framework\r
- */\r
-abstract class Database {\r
- /**\r
- * Name of the class used for prepared statements.\r
- * @var string\r
- */\r
- protected $preparedStatementClassName = 'wcf\system\database\statement\PreparedStatement';\r
-\r
- /**\r
- * Name of the database editor class\r
- * @var string\r
- */\r
- protected $editorClassName = 'wcf\system\database\editor\DatabaseEditor';\r
- \r
- /**\r
- * sql server hostname\r
- * @var string\r
- */\r
- protected $host = '';\r
- \r
- /**\r
- * sql server post\r
- * @var integer\r
- */\r
- protected $port = 0;\r
- \r
- /**\r
- * sql server login name\r
- * @var string\r
- */\r
- protected $user = '';\r
- \r
- /**\r
- * sql server login password\r
- * @var string\r
- */\r
- protected $password = '';\r
- \r
- /**\r
- * database name\r
- * @var string\r
- */\r
- protected $database = '';\r
- \r
- /**\r
- * number of executed queries\r
- * @var integer\r
- */\r
- protected $queryCount = 0;\r
- \r
- /**\r
- * database editor object\r
- * @var wcf\system\database\editor\DatabaseEditor\r
- */\r
- protected $editor = null;\r
- \r
- /**\r
- * pdo object\r
- * @var \PDO\r
- */\r
- protected $pdo = null;\r
- \r
- /**\r
- * Indicates if there is an open transaction.\r
- * @var boolean\r
- */\r
- protected $hasActiveTransaction = false;\r
- \r
- /**\r
- * Creates a Dabatase Object.\r
- * \r
- * @param string $host SQL database server host address\r
- * @param string $user SQL database server username\r
- * @param string $password SQL database server password\r
- * @param string $database SQL database server database name\r
- * @param integer $port SQL database server port\r
- */\r
- public function __construct($host, $user, $password, $database, $port) {\r
- $this->host = $host;\r
- $this->port = $port;\r
- $this->user = $user;\r
- $this->password = $password;\r
- $this->database = $database;\r
- \r
- // connect database\r
- $this->connect();\r
- }\r
- \r
- /**\r
- * Connects to database server.\r
- */\r
- public abstract function connect();\r
- \r
- /**\r
- * Returns ID from last insert.\r
- *\r
- * @param string $table\r
- * @param string $field\r
- * @return integer last insert ID\r
- */\r
- public function getInsertID($table, $field) {\r
- try {\r
- return $this->pdo->lastInsertId();\r
- }\r
- catch (\PDOException $e) {\r
- throw new DatabaseException("Can not fetch last insert id", $this);\r
- }\r
- }\r
- \r
- /**\r
- * Initiates a transaction.\r
- *\r
- * @return boolean true on success\r
- */\r
- public function beginTransaction() {\r
- try {\r
- if ($this->hasActiveTransaction) {\r
- return false;\r
- }\r
- else {\r
- $this->hasActiveTransaction = $this->pdo->beginTransaction();\r
- return $this->hasActiveTransaction;\r
- }\r
- }\r
- catch (\PDOException $e) {\r
- return false;\r
- }\r
- }\r
- \r
- /**\r
- * Commits a transaction.\r
- *\r
- * @return boolean true on success\r
- */\r
- public function commitTransaction() {\r
- try {\r
- $this->hasActiveTransaction = false;\r
- return $this->pdo->commit();\r
- }\r
- catch (\PDOException $e) {\r
- return false;\r
- }\r
- }\r
- \r
- /**\r
- * Rolls back a transaction.\r
- *\r
- * @return boolean true on success\r
- */\r
- public function rollBackTransaction() {\r
- try {\r
- $this->hasActiveTransaction = false;\r
- return $this->pdo->rollBack();\r
- }\r
- catch (\PDOException $e) {\r
- return false;\r
- }\r
- }\r
- \r
- /**\r
- * Prepares a statement for execution and returns a statement object.\r
- *\r
- * @param string $statement\r
- * @param integer $limit\r
- * @param integer $offset\r
- * @return wcf\system\database\statement\PreparedStatement\r
- */\r
- public function prepareStatement($statement, $limit = 0, $offset = 0) {\r
- $statement = $this->handleLimitParameter($statement, $limit, $offset);\r
- \r
- try {\r
- $pdoStatement = $this->pdo->prepare($statement);\r
- if ($pdoStatement instanceof \PDOStatement) {\r
- return new $this->preparedStatementClassName($this, $pdoStatement);\r
- }\r
- throw new DatabaseException("Can not prepare statement: ".$statement, $this);\r
- }\r
- catch (\PDOException $e) {\r
- throw new DatabaseException("Can not prepare statement: ".$statement, $this);\r
- }\r
- }\r
- \r
- /**\r
- * Handles the limit and offset parameter in SELECT queries.\r
- * This is a default implementation compatible to MySQL and PostgreSQL.\r
- * Other database implementations should override this function. \r
- * \r
- * @param string $query\r
- * @param integer $limit\r
- * @param integer $offset\r
- * @return string $query\r
- */\r
- public function handleLimitParameter($query, $limit = 0, $offset = 0) {\r
- if ($limit != 0) {\r
- $query .= " LIMIT " . $limit . " OFFSET " . $offset;\r
- }\r
-\r
- return $query;\r
- }\r
- \r
- /**\r
- * Returns the number of the last error.\r
- * \r
- * @return integer\r
- */\r
- public function getErrorNumber() {\r
- if ($this->pdo !== null) return $this->pdo->errorCode();\r
- return 0;\r
- }\r
-\r
- /**\r
- * Returns the description of the last error.\r
- * \r
- * @return string\r
- */\r
- public function getErrorDesc() {\r
- if ($this->pdo !== null) {\r
- $errorInfoArray = $this->pdo->errorInfo();\r
- if (isset($errorInfoArray[2])) return $errorInfoArray[2];\r
- }\r
- return '';\r
- }\r
-\r
- /**\r
- * Gets the current database type.\r
- *\r
- * @return string\r
- */\r
- public function getDBType() {\r
- return get_class($this);\r
- }\r
-\r
- /**\r
- * Escapes a string for use in sql query.\r
- * \r
- * @param string $string\r
- * @return string\r
- */\r
- public function escapeString($string) {\r
- return addslashes($string);\r
- }\r
- \r
- /**\r
- * Gets the sql version.\r
- *\r
- * @return string\r
- */\r
- public function getVersion() {\r
- try {\r
- if ($this->pdo !== null) {\r
- return $this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION);\r
- }\r
- }\r
- catch (\PDOException $e) {}\r
- \r
- return 'unknown';\r
- }\r
- \r
- /**\r
- * Gets the database name.\r
- *\r
- * @return string\r
- */\r
- public function getDatabaseName() {\r
- return $this->database;\r
- }\r
- \r
- /**\r
- * Returns the name of the database user.\r
- *\r
- * @param string user name\r
- */\r
- public function getUser() {\r
- return $this->user;\r
- }\r
- \r
- /**\r
- * Returns the amount of executed sql queries.\r
- *\r
- * @return integer\r
- */\r
- public function getQueryCount() {\r
- return $this->queryCount;\r
- }\r
- \r
- /**\r
- * Increments the query counter by one.\r
- */\r
- public function incrementQueryCount() {\r
- $this->queryCount++;\r
- }\r
- \r
- /**\r
- * Returns a database editor object.\r
- *\r
- * @return wcf\system\database\editor\DatabaseEditor\r
- */\r
- public function getEditor() {\r
- if ($this->editor === null) {\r
- $this->editor = new $this->editorClassName($this);\r
- }\r
- \r
- return $this->editor;\r
- }\r
- \r
- /**\r
- * Returns true, if this database type is supported.\r
- *\r
- * @return boolean\r
- */\r
- public static function isSupported() {\r
- return false;\r
- }\r
- \r
- /**\r
- * Sets default connection attributes.\r
- */\r
- protected function setAttributes() {\r
- $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);\r
- $this->pdo->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_NATURAL);\r
- $this->pdo->setAttribute(\PDO::ATTR_STRINGIFY_FETCHES, false);\r
- }\r
+<?php
+namespace wcf\system\database;
+use wcf\system\database\statement\PreparedStatement;
+use wcf\data\DatabaseObject;
+use wcf\system\SystemException;
+
+/**
+ * This is an abstract implementation of a database access class using PDO.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.database
+ * @category Community Framework
+ */
+abstract class Database {
+ /**
+ * Name of the class used for prepared statements.
+ * @var string
+ */
+ protected $preparedStatementClassName = 'wcf\system\database\statement\PreparedStatement';
+
+ /**
+ * Name of the database editor class
+ * @var string
+ */
+ protected $editorClassName = 'wcf\system\database\editor\DatabaseEditor';
+
+ /**
+ * sql server hostname
+ * @var string
+ */
+ protected $host = '';
+
+ /**
+ * sql server post
+ * @var integer
+ */
+ protected $port = 0;
+
+ /**
+ * sql server login name
+ * @var string
+ */
+ protected $user = '';
+
+ /**
+ * sql server login password
+ * @var string
+ */
+ protected $password = '';
+
+ /**
+ * database name
+ * @var string
+ */
+ protected $database = '';
+
+ /**
+ * number of executed queries
+ * @var integer
+ */
+ protected $queryCount = 0;
+
+ /**
+ * database editor object
+ * @var wcf\system\database\editor\DatabaseEditor
+ */
+ protected $editor = null;
+
+ /**
+ * pdo object
+ * @var \PDO
+ */
+ protected $pdo = null;
+
+ /**
+ * Indicates if there is an open transaction.
+ * @var boolean
+ */
+ protected $hasActiveTransaction = false;
+
+ /**
+ * Creates a Dabatase Object.
+ *
+ * @param string $host SQL database server host address
+ * @param string $user SQL database server username
+ * @param string $password SQL database server password
+ * @param string $database SQL database server database name
+ * @param integer $port SQL database server port
+ */
+ public function __construct($host, $user, $password, $database, $port) {
+ $this->host = $host;
+ $this->port = $port;
+ $this->user = $user;
+ $this->password = $password;
+ $this->database = $database;
+
+ // connect database
+ $this->connect();
+ }
+
+ /**
+ * Connects to database server.
+ */
+ public abstract function connect();
+
+ /**
+ * Returns ID from last insert.
+ *
+ * @param string $table
+ * @param string $field
+ * @return integer last insert ID
+ */
+ public function getInsertID($table, $field) {
+ try {
+ return $this->pdo->lastInsertId();
+ }
+ catch (\PDOException $e) {
+ throw new DatabaseException("Can not fetch last insert id", $this);
+ }
+ }
+
+ /**
+ * Initiates a transaction.
+ *
+ * @return boolean true on success
+ */
+ public function beginTransaction() {
+ try {
+ if ($this->hasActiveTransaction) {
+ return false;
+ }
+ else {
+ $this->hasActiveTransaction = $this->pdo->beginTransaction();
+ return $this->hasActiveTransaction;
+ }
+ }
+ catch (\PDOException $e) {
+ return false;
+ }
+ }
+
+ /**
+ * Commits a transaction.
+ *
+ * @return boolean true on success
+ */
+ public function commitTransaction() {
+ try {
+ $this->hasActiveTransaction = false;
+ return $this->pdo->commit();
+ }
+ catch (\PDOException $e) {
+ return false;
+ }
+ }
+
+ /**
+ * Rolls back a transaction.
+ *
+ * @return boolean true on success
+ */
+ public function rollBackTransaction() {
+ try {
+ $this->hasActiveTransaction = false;
+ return $this->pdo->rollBack();
+ }
+ catch (\PDOException $e) {
+ return false;
+ }
+ }
+
+ /**
+ * Prepares a statement for execution and returns a statement object.
+ *
+ * @param string $statement
+ * @param integer $limit
+ * @param integer $offset
+ * @return wcf\system\database\statement\PreparedStatement
+ */
+ public function prepareStatement($statement, $limit = 0, $offset = 0) {
+ $statement = $this->handleLimitParameter($statement, $limit, $offset);
+
+ try {
+ $pdoStatement = $this->pdo->prepare($statement);
+ if ($pdoStatement instanceof \PDOStatement) {
+ return new $this->preparedStatementClassName($this, $pdoStatement);
+ }
+ throw new DatabaseException("Can not prepare statement: ".$statement, $this);
+ }
+ catch (\PDOException $e) {
+ throw new DatabaseException("Can not prepare statement: ".$statement, $this);
+ }
+ }
+
+ /**
+ * Handles the limit and offset parameter in SELECT queries.
+ * This is a default implementation compatible to MySQL and PostgreSQL.
+ * Other database implementations should override this function.
+ *
+ * @param string $query
+ * @param integer $limit
+ * @param integer $offset
+ * @return string $query
+ */
+ public function handleLimitParameter($query, $limit = 0, $offset = 0) {
+ if ($limit != 0) {
+ $query .= " LIMIT " . $limit . " OFFSET " . $offset;
+ }
+
+ return $query;
+ }
+
+ /**
+ * Returns the number of the last error.
+ *
+ * @return integer
+ */
+ public function getErrorNumber() {
+ if ($this->pdo !== null) return $this->pdo->errorCode();
+ return 0;
+ }
+
+ /**
+ * Returns the description of the last error.
+ *
+ * @return string
+ */
+ public function getErrorDesc() {
+ if ($this->pdo !== null) {
+ $errorInfoArray = $this->pdo->errorInfo();
+ if (isset($errorInfoArray[2])) return $errorInfoArray[2];
+ }
+ return '';
+ }
+
+ /**
+ * Gets the current database type.
+ *
+ * @return string
+ */
+ public function getDBType() {
+ return get_class($this);
+ }
+
+ /**
+ * Escapes a string for use in sql query.
+ *
+ * @param string $string
+ * @return string
+ */
+ public function escapeString($string) {
+ return addslashes($string);
+ }
+
+ /**
+ * Gets the sql version.
+ *
+ * @return string
+ */
+ public function getVersion() {
+ try {
+ if ($this->pdo !== null) {
+ return $this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION);
+ }
+ }
+ catch (\PDOException $e) {}
+
+ return 'unknown';
+ }
+
+ /**
+ * Gets the database name.
+ *
+ * @return string
+ */
+ public function getDatabaseName() {
+ return $this->database;
+ }
+
+ /**
+ * Returns the name of the database user.
+ *
+ * @param string user name
+ */
+ public function getUser() {
+ return $this->user;
+ }
+
+ /**
+ * Returns the amount of executed sql queries.
+ *
+ * @return integer
+ */
+ public function getQueryCount() {
+ return $this->queryCount;
+ }
+
+ /**
+ * Increments the query counter by one.
+ */
+ public function incrementQueryCount() {
+ $this->queryCount++;
+ }
+
+ /**
+ * Returns a database editor object.
+ *
+ * @return wcf\system\database\editor\DatabaseEditor
+ */
+ public function getEditor() {
+ if ($this->editor === null) {
+ $this->editor = new $this->editorClassName($this);
+ }
+
+ return $this->editor;
+ }
+
+ /**
+ * Returns true, if this database type is supported.
+ *
+ * @return boolean
+ */
+ public static function isSupported() {
+ return false;
+ }
+
+ /**
+ * Sets default connection attributes.
+ */
+ protected function setAttributes() {
+ $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->pdo->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_NATURAL);
+ $this->pdo->setAttribute(\PDO::ATTR_STRINGIFY_FETCHES, false);
+ }
}
-<?php\r
-namespace wcf\system\database;\r
-use wcf\system\database\statement\PreparedStatement;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * DatabaseException is a specific SystemException for database errors.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.database\r
- * @category Community Framework\r
- */\r
-class DatabaseException extends SystemException {\r
- /**\r
- * error number\r
- * @var integer\r
- */\r
- protected $errorNumber = null;\r
- \r
- /**\r
- * error description\r
- * @var string\r
- */\r
- protected $errorDesc = null;\r
- \r
- /**\r
- * sql version number\r
- * @var string\r
- */\r
- protected $sqlVersion = null;\r
- \r
- /**\r
- * sql type\r
- * @var string\r
- */\r
- protected $DBType = null;\r
- \r
- /**\r
- * Database object\r
- * @var Database\r
- */\r
- protected $db = null;\r
- \r
- /**\r
- * PreparedStatement object\r
- * @var PreparedStatement\r
- */\r
- protected $preparedStatement = null;\r
- \r
- /**\r
- * Creates a new DatabaseException.\r
- * \r
- * @param string $message error message\r
- * @param Database $db affected db object\r
- * @param PreparedStatement $preparedStatement affected prepared statement\r
- */\r
- public function __construct($message, Database $db, PreparedStatement $preparedStatement = null) {\r
- $this->db = $db;\r
- $this->DBType = $db->getDBType();\r
- $this->preparedStatement = $preparedStatement;\r
- \r
- // prefer errors from prepared statement\r
- if (($this->preparedStatement instanceof PreparedStatement) && $this->preparedStatement->getErrorNumber()) {\r
- $this->errorNumber = $this->preparedStatement->getErrorNumber();\r
- $this->errorDesc = $this->preparedStatement->getErrorDesc();\r
- }\r
- else {\r
- $this->errorNumber = $this->db->getErrorNumber();\r
- $this->errorDesc = $this->db->getErrorDesc();\r
- }\r
- \r
- parent::__construct($message, intval($this->errorNumber));\r
- }\r
- \r
- /**\r
- * Returns the error number of this exception.\r
- * \r
- * @return integer\r
- */\r
- public function getErrorNumber() {\r
- return $this->errorNumber;\r
- }\r
- \r
- /**\r
- * Returns the error description of this exception.\r
- * \r
- * @return string\r
- */\r
- public function getErrorDesc() {\r
- return $this->errorDesc;\r
- }\r
- \r
- /**\r
- * Returns the current sql version of the database.\r
- * \r
- * @return string\r
- */\r
- public function getSQLVersion() {\r
- if ($this->sqlVersion === null) {\r
- try {\r
- $this->sqlVersion = $this->db->getVersion();\r
- }\r
- catch (DatabaseException $e) {\r
- $this->sqlVersion = 'unknown';\r
- }\r
- }\r
- \r
- return $this->sqlVersion;\r
- }\r
- \r
- /**\r
- * Returns the sql type of the active database.\r
- * \r
- * @return string \r
- */\r
- public function getDBType() {\r
- return $this->DBType;\r
- }\r
- \r
- /**\r
- * Prints the error page.\r
- */\r
- public function show() {\r
- $this->information .= '<b>sql type:</b> ' . StringUtil::encodeHTML($this->getDBType()) . '<br />';\r
- $this->information .= '<b>sql error:</b> ' . StringUtil::encodeHTML($this->getErrorDesc()) . '<br />';\r
- $this->information .= '<b>sql error number:</b> ' . StringUtil::encodeHTML($this->getErrorNumber()) . '<br />';\r
- $this->information .= '<b>sql version:</b> ' . StringUtil::encodeHTML($this->getSQLVersion()) . '<br />';\r
- \r
- $this->information .= "\n<!-- db error: #".$this->db->getErrorNumber().': '.$this->db->getErrorDesc()." -->\n";\r
- if ($this->preparedStatement !== null) {\r
- $this->information .= "\n<!-- statement error: #".$this->preparedStatement->getErrorNumber().': '.$this->preparedStatement->getErrorDesc()." -->\n";\r
- }\r
- \r
- parent::show();\r
- }\r
+<?php
+namespace wcf\system\database;
+use wcf\system\database\statement\PreparedStatement;
+use wcf\system\exception\SystemException;
+use wcf\util\StringUtil;
+
+/**
+ * DatabaseException is a specific SystemException for database errors.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.database
+ * @category Community Framework
+ */
+class DatabaseException extends SystemException {
+ /**
+ * error number
+ * @var integer
+ */
+ protected $errorNumber = null;
+
+ /**
+ * error description
+ * @var string
+ */
+ protected $errorDesc = null;
+
+ /**
+ * sql version number
+ * @var string
+ */
+ protected $sqlVersion = null;
+
+ /**
+ * sql type
+ * @var string
+ */
+ protected $DBType = null;
+
+ /**
+ * Database object
+ * @var Database
+ */
+ protected $db = null;
+
+ /**
+ * PreparedStatement object
+ * @var PreparedStatement
+ */
+ protected $preparedStatement = null;
+
+ /**
+ * Creates a new DatabaseException.
+ *
+ * @param string $message error message
+ * @param Database $db affected db object
+ * @param PreparedStatement $preparedStatement affected prepared statement
+ */
+ public function __construct($message, Database $db, PreparedStatement $preparedStatement = null) {
+ $this->db = $db;
+ $this->DBType = $db->getDBType();
+ $this->preparedStatement = $preparedStatement;
+
+ // prefer errors from prepared statement
+ if (($this->preparedStatement instanceof PreparedStatement) && $this->preparedStatement->getErrorNumber()) {
+ $this->errorNumber = $this->preparedStatement->getErrorNumber();
+ $this->errorDesc = $this->preparedStatement->getErrorDesc();
+ }
+ else {
+ $this->errorNumber = $this->db->getErrorNumber();
+ $this->errorDesc = $this->db->getErrorDesc();
+ }
+
+ parent::__construct($message, intval($this->errorNumber));
+ }
+
+ /**
+ * Returns the error number of this exception.
+ *
+ * @return integer
+ */
+ public function getErrorNumber() {
+ return $this->errorNumber;
+ }
+
+ /**
+ * Returns the error description of this exception.
+ *
+ * @return string
+ */
+ public function getErrorDesc() {
+ return $this->errorDesc;
+ }
+
+ /**
+ * Returns the current sql version of the database.
+ *
+ * @return string
+ */
+ public function getSQLVersion() {
+ if ($this->sqlVersion === null) {
+ try {
+ $this->sqlVersion = $this->db->getVersion();
+ }
+ catch (DatabaseException $e) {
+ $this->sqlVersion = 'unknown';
+ }
+ }
+
+ return $this->sqlVersion;
+ }
+
+ /**
+ * Returns the sql type of the active database.
+ *
+ * @return string
+ */
+ public function getDBType() {
+ return $this->DBType;
+ }
+
+ /**
+ * Prints the error page.
+ */
+ public function show() {
+ $this->information .= '<b>sql type:</b> ' . StringUtil::encodeHTML($this->getDBType()) . '<br />';
+ $this->information .= '<b>sql error:</b> ' . StringUtil::encodeHTML($this->getErrorDesc()) . '<br />';
+ $this->information .= '<b>sql error number:</b> ' . StringUtil::encodeHTML($this->getErrorNumber()) . '<br />';
+ $this->information .= '<b>sql version:</b> ' . StringUtil::encodeHTML($this->getSQLVersion()) . '<br />';
+
+ $this->information .= "\n<!-- db error: #".$this->db->getErrorNumber().': '.$this->db->getErrorDesc()." -->\n";
+ if ($this->preparedStatement !== null) {
+ $this->information .= "\n<!-- statement error: #".$this->preparedStatement->getErrorNumber().': '.$this->preparedStatement->getErrorDesc()." -->\n";
+ }
+
+ parent::show();
+ }
}
/**
* By default identifiers are case insensitive in PostgreSQL.
- * We need to double quote identifiers here automatically.\r
- * \r
- * @param string $query\r
+ * We need to double quote identifiers here automatically.
+ *
+ * @param string $query
* @return string $query
*/
public static function fixQuery($query) {
-<?php\r
-namespace wcf\system\database\util;\r
-\r
-/**\r
- * Builds a sql query 'where' condition.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.database.util\r
- * @category Community Framework\r
- */\r
-class ConditionBuilder {\r
- /**\r
- * conditions string\r
- * @var string\r
- */\r
- protected $conditions = '';\r
- \r
- /**\r
- * must be true to add the 'WHERE' keyword automatically\r
- * @var boolean\r
- */\r
- protected $addWhereKeyword = true;\r
- \r
- /**\r
- * Creates a new ConditionBuilder object.\r
- *\r
- * @param string $addWhereKeyword\r
- */\r
- public function __construct($addWhereKeyword = true) {\r
- $this->addWhereKeyword = $addWhereKeyword;\r
- }\r
- \r
- /**\r
- * Adds a new condition.\r
- * \r
- * @param mixed $conditions\r
- */\r
- public function add($conditions) {\r
- if (!is_array($conditions)) $conditions = array($conditions);\r
- \r
- foreach ($conditions as $condition) {\r
- if (!empty($this->conditions)) $this->conditions .= " AND ";\r
- else $this->conditions = ($this->addWhereKeyword ? " WHERE " : '');\r
- \r
- $this->conditions .= $condition;\r
- }\r
- }\r
- \r
- /**\r
- * Returns the build condition.\r
- * \r
- * @return string\r
- */\r
- public function __toString() {\r
- return $this->conditions;\r
- }\r
+<?php
+namespace wcf\system\database\util;
+
+/**
+ * Builds a sql query 'where' condition.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.database.util
+ * @category Community Framework
+ */
+class ConditionBuilder {
+ /**
+ * conditions string
+ * @var string
+ */
+ protected $conditions = '';
+
+ /**
+ * must be true to add the 'WHERE' keyword automatically
+ * @var boolean
+ */
+ protected $addWhereKeyword = true;
+
+ /**
+ * Creates a new ConditionBuilder object.
+ *
+ * @param string $addWhereKeyword
+ */
+ public function __construct($addWhereKeyword = true) {
+ $this->addWhereKeyword = $addWhereKeyword;
+ }
+
+ /**
+ * Adds a new condition.
+ *
+ * @param mixed $conditions
+ */
+ public function add($conditions) {
+ if (!is_array($conditions)) $conditions = array($conditions);
+
+ foreach ($conditions as $condition) {
+ if (!empty($this->conditions)) $this->conditions .= " AND ";
+ else $this->conditions = ($this->addWhereKeyword ? " WHERE " : '');
+
+ $this->conditions .= $condition;
+ }
+ }
+
+ /**
+ * Returns the build condition.
+ *
+ * @return string
+ */
+ public function __toString() {
+ return $this->conditions;
+ }
}
-<?php\r
-namespace wcf\system\database\util;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * Builds a sql query 'where' condition for prepared statements.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.database.util\r
- * @category Community Framework\r
- */\r
-class PreparedStatementConditionBuilder extends ConditionBuilder {\r
- /**\r
- * input parameters\r
- * @var array\r
- */\r
- protected $parameters = array();\r
- \r
- /**\r
- * Adds a new condition.\r
- * \r
- * @param string $condition\r
- * @param array $parameters\r
- */\r
- public function add($condition, array $parameters = array()) {\r
- if (count($parameters)) {\r
- $count = 0;\r
- $callback = function ($matches) use (&$count, $parameters) {\r
- if (!isset($parameters[$count])) {\r
- throw new SystemException();\r
- }\r
-\r
- $result = '?';\r
- if (is_array($parameters[$count]) && count($parameters[$count])) {\r
- $result .= str_repeat(',?', count($parameters[$count]) - 1);\r
- }\r
- \r
- $count++;\r
- return $result;\r
- };\r
- \r
- $condition = preg_replace_callback('/\?/', $callback, $condition);\r
- }\r
- \r
- // add condtion\r
- if (!empty($this->conditions)) $this->conditions .= " AND ";\r
- else $this->conditions = ($this->addWhereKeyword ? " WHERE " : '');\r
- $this->conditions .= $condition;\r
- \r
- // parameter handling\r
- if (count($parameters)) {\r
- foreach ($parameters as $parameter) {\r
- if (is_array($parameter)) {\r
- foreach ($parameter as $value) {\r
- $this->parameters[] = $value;\r
- }\r
- }\r
- else {\r
- $this->parameters[] = $parameter;\r
- }\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Returns the input parameters.\r
- * \r
- * @return array\r
- */\r
- public function getParameters() {\r
- return $this->parameters;\r
- }\r
+<?php
+namespace wcf\system\database\util;
+use wcf\system\exception\SystemException;
+
+/**
+ * Builds a sql query 'where' condition for prepared statements.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.database.util
+ * @category Community Framework
+ */
+class PreparedStatementConditionBuilder extends ConditionBuilder {
+ /**
+ * input parameters
+ * @var array
+ */
+ protected $parameters = array();
+
+ /**
+ * Adds a new condition.
+ *
+ * @param string $condition
+ * @param array $parameters
+ */
+ public function add($condition, array $parameters = array()) {
+ if (count($parameters)) {
+ $count = 0;
+ $callback = function ($matches) use (&$count, $parameters) {
+ if (!isset($parameters[$count])) {
+ throw new SystemException();
+ }
+
+ $result = '?';
+ if (is_array($parameters[$count]) && count($parameters[$count])) {
+ $result .= str_repeat(',?', count($parameters[$count]) - 1);
+ }
+
+ $count++;
+ return $result;
+ };
+
+ $condition = preg_replace_callback('/\?/', $callback, $condition);
+ }
+
+ // add condtion
+ if (!empty($this->conditions)) $this->conditions .= " AND ";
+ else $this->conditions = ($this->addWhereKeyword ? " WHERE " : '');
+ $this->conditions .= $condition;
+
+ // parameter handling
+ if (count($parameters)) {
+ foreach ($parameters as $parameter) {
+ if (is_array($parameter)) {
+ foreach ($parameter as $value) {
+ $this->parameters[] = $value;
+ }
+ }
+ else {
+ $this->parameters[] = $parameter;
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the input parameters.
+ *
+ * @return array
+ */
+ public function getParameters() {
+ return $this->parameters;
+ }
}
-<?php\r
-namespace wcf\system\event;\r
-use wcf\system\cache\CacheHandler;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\SingletonFactory;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * EventHandler executes all registered actions for a specific event.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.event\r
- * @category Community Framework\r
- */\r
-class EventHandler extends SingletonFactory {\r
- /**\r
- * Registerd actions.\r
- *\r
- * @var array\r
- */\r
- protected $actions = null;\r
- \r
- /**\r
- * Registerd inherit actions.\r
- *\r
- * @var array\r
- */\r
- protected $inheritedActions = null;\r
- \r
- /**\r
- * Instances of registerd actions.\r
- *\r
- * @var array\r
- */\r
- protected $actionsObjects = array();\r
- \r
- /**\r
- * Instances of registerd inherit actions.\r
- *\r
- * @var array\r
- */\r
- protected $inheritedActionsObjects = array();\r
- \r
- /**\r
- * Instances of action objects.\r
- *\r
- * @var array\r
- */\r
- protected $listenerObjects = array();\r
- \r
- /**\r
- * Loads all registered actions of the active package.\r
- */\r
- protected function loadActions() {\r
- CacheHandler::getInstance()->addResource('eventListener-'.PACKAGE_ID, WCF_DIR.'cache/cache.eventListener-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderEventListener');\r
- $cache = CacheHandler::getInstance()->get('eventListener-'.PACKAGE_ID);\r
- if (isset($cache['actions'])) $this->actions = $cache['actions'];\r
- if (isset($cache['inheritedActions'])) $this->inheritedActions = $cache['inheritedActions'];\r
- unset($cache);\r
- if (!is_array($this->actions)) $this->actions = array();\r
- if (!is_array($this->inheritedActions)) $this->inheritedActions = array();\r
- }\r
- \r
- /**\r
- * Executes all inherited listeners for the given event.\r
- *\r
- * @param mixed $eventObj\r
- * @param string $eventName\r
- * @param string $className\r
- * @param string $name\r
- */\r
- protected function executeInheritedActions($eventObj, $eventName, $className, $name) {\r
- // create objects of the actions\r
- if (!isset($this->inheritedActionsObjects[$name]) || !is_array($this->inheritedActionsObjects[$name])) {\r
- $this->inheritedActionsObjects[$name] = array();\r
-\r
- // get parent classes\r
- $familyTree = array();\r
- $member = (is_object($eventObj) ? get_class($eventObj) : $eventObj);\r
- while ($member != false) {\r
- $familyTree[] = $member;\r
- $member = get_parent_class($member);\r
- }\r
-\r
- foreach ($familyTree as $member) {\r
- if (isset($this->inheritedActions[$member])) {\r
- $actions = $this->inheritedActions[$member];\r
- if (isset($actions[$eventName]) && count($actions[$eventName]) > 0) {\r
- foreach ($actions[$eventName] as $action) {\r
- if (isset($this->inheritedActionsObjects[$name][$action['listenerClassName']])) continue;\r
-\r
- // get class object\r
- if (isset($this->listenerObjects[$action['listenerClassName']])) {\r
- $object = $this->listenerObjects[$action['listenerClassName']];\r
- }\r
- else {\r
- $object = null;\r
- // instance action object\r
- if (!class_exists($action['listenerClassName'])) {\r
- throw new SystemException("Unable to find class '".$action['listenerClassName']."'", 11001);\r
- }\r
- if (!ClassUtil::isInstanceOf($action['listenerClassName'], 'wcf\system\event\IEventListener')) {\r
- throw new SystemException("'".$action['listenerClassName']."' should implement interface wcf\system\event\IEventListener");\r
- }\r
- \r
- $object = new $action['listenerClassName'];\r
- $this->listenerObjects[] = $object;\r
- }\r
- \r
- if ($object !== null) $this->inheritedActionsObjects[$name][$action['listenerClassName']] = $object;\r
- }\r
- }\r
- }\r
- }\r
- }\r
- \r
- // execute actions\r
- foreach ($this->inheritedActionsObjects[$name] as $actionObj) {\r
- $actionObj->execute($eventObj, $className, $eventName);\r
- }\r
- }\r
- \r
- /**\r
- * Executes all registered listeners for the given event.\r
- *\r
- * @param mixed $eventObj\r
- * @param string $eventName\r
- */\r
- public function fireAction($eventObj, $eventName) {\r
- // get class name\r
- if (is_object($eventObj)) $className = get_class($eventObj);\r
- else $className = $eventObj;\r
- \r
- // load actions from cache if necessary\r
- if ($this->actions === null && $this->inheritedActions === null) {\r
- $this->loadActions();\r
- }\r
- \r
- // generate action name\r
- $name = self::generateKey($className, $eventName);\r
-\r
- // execute inherited actions first\r
- if (count($this->inheritedActions) > 0) {\r
- $this->executeInheritedActions($eventObj, $eventName, $className, $name);\r
- }\r
- \r
- // create objects of the actions\r
- if (!isset($this->actionsObjects[$name]) || !is_array($this->actionsObjects[$name])) {\r
- if (!isset($this->actions[$name]) || !is_array($this->actions[$name])) {\r
- // no action registered\r
- return false;\r
- }\r
- \r
- $this->actionsObjects[$name] = array();\r
- foreach ($this->actions[$name] as $action) {\r
- if (isset($this->actionsObjects[$name][$action['listenerClassName']])) continue;\r
-\r
- // get class object\r
- if (isset($this->listenerObjects[$action['listenerClassName']])) {\r
- $object = $this->listenerObjects[$action['listenerClassName']];\r
- }\r
- else {\r
- // instance action object\r
- if (!class_exists($action['listenerClassName'])) {\r
- throw new SystemException("Unable to find class '".$action['listenerClassName']."'", 11001);\r
- }\r
- if (!ClassUtil::isInstanceOf($action['listenerClassName'], 'wcf\system\event\IEventListener')) {\r
- throw new SystemException("'".$action['listenerClassName']."' should implement interface wcf\system\event\IEventListener");\r
- }\r
- \r
- $object = new $action['listenerClassName'];\r
- $this->listenerObjects[$path] = $object;\r
- }\r
- \r
- $this->actionsObjects[$name][$action['listenerClassName']] = $object;\r
- }\r
- }\r
- \r
- // execute actions\r
- foreach ($this->actionsObjects[$name] as $actionObj) {\r
- $actionObj->execute($eventObj, $className, $eventName);\r
- }\r
- }\r
- \r
- /**\r
- * Generates an unique name for an action.\r
- *\r
- * @param string $className\r
- * @param string $eventName\r
- */\r
- public static function generateKey($className, $eventName) {\r
- return $eventName.'@'.$className;\r
- }\r
-}\r
+<?php
+namespace wcf\system\event;
+use wcf\system\cache\CacheHandler;
+use wcf\system\exception\SystemException;
+use wcf\system\SingletonFactory;
+use wcf\util\ClassUtil;
+
+/**
+ * EventHandler executes all registered actions for a specific event.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.event
+ * @category Community Framework
+ */
+class EventHandler extends SingletonFactory {
+ /**
+ * Registerd actions.
+ *
+ * @var array
+ */
+ protected $actions = null;
+
+ /**
+ * Registerd inherit actions.
+ *
+ * @var array
+ */
+ protected $inheritedActions = null;
+
+ /**
+ * Instances of registerd actions.
+ *
+ * @var array
+ */
+ protected $actionsObjects = array();
+
+ /**
+ * Instances of registerd inherit actions.
+ *
+ * @var array
+ */
+ protected $inheritedActionsObjects = array();
+
+ /**
+ * Instances of action objects.
+ *
+ * @var array
+ */
+ protected $listenerObjects = array();
+
+ /**
+ * Loads all registered actions of the active package.
+ */
+ protected function loadActions() {
+ CacheHandler::getInstance()->addResource('eventListener-'.PACKAGE_ID, WCF_DIR.'cache/cache.eventListener-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderEventListener');
+ $cache = CacheHandler::getInstance()->get('eventListener-'.PACKAGE_ID);
+ if (isset($cache['actions'])) $this->actions = $cache['actions'];
+ if (isset($cache['inheritedActions'])) $this->inheritedActions = $cache['inheritedActions'];
+ unset($cache);
+ if (!is_array($this->actions)) $this->actions = array();
+ if (!is_array($this->inheritedActions)) $this->inheritedActions = array();
+ }
+
+ /**
+ * Executes all inherited listeners for the given event.
+ *
+ * @param mixed $eventObj
+ * @param string $eventName
+ * @param string $className
+ * @param string $name
+ */
+ protected function executeInheritedActions($eventObj, $eventName, $className, $name) {
+ // create objects of the actions
+ if (!isset($this->inheritedActionsObjects[$name]) || !is_array($this->inheritedActionsObjects[$name])) {
+ $this->inheritedActionsObjects[$name] = array();
+
+ // get parent classes
+ $familyTree = array();
+ $member = (is_object($eventObj) ? get_class($eventObj) : $eventObj);
+ while ($member != false) {
+ $familyTree[] = $member;
+ $member = get_parent_class($member);
+ }
+
+ foreach ($familyTree as $member) {
+ if (isset($this->inheritedActions[$member])) {
+ $actions = $this->inheritedActions[$member];
+ if (isset($actions[$eventName]) && count($actions[$eventName]) > 0) {
+ foreach ($actions[$eventName] as $action) {
+ if (isset($this->inheritedActionsObjects[$name][$action['listenerClassName']])) continue;
+
+ // get class object
+ if (isset($this->listenerObjects[$action['listenerClassName']])) {
+ $object = $this->listenerObjects[$action['listenerClassName']];
+ }
+ else {
+ $object = null;
+ // instance action object
+ if (!class_exists($action['listenerClassName'])) {
+ throw new SystemException("Unable to find class '".$action['listenerClassName']."'", 11001);
+ }
+ if (!ClassUtil::isInstanceOf($action['listenerClassName'], 'wcf\system\event\IEventListener')) {
+ throw new SystemException("'".$action['listenerClassName']."' should implement interface wcf\system\event\IEventListener");
+ }
+
+ $object = new $action['listenerClassName'];
+ $this->listenerObjects[] = $object;
+ }
+
+ if ($object !== null) $this->inheritedActionsObjects[$name][$action['listenerClassName']] = $object;
+ }
+ }
+ }
+ }
+ }
+
+ // execute actions
+ foreach ($this->inheritedActionsObjects[$name] as $actionObj) {
+ $actionObj->execute($eventObj, $className, $eventName);
+ }
+ }
+
+ /**
+ * Executes all registered listeners for the given event.
+ *
+ * @param mixed $eventObj
+ * @param string $eventName
+ */
+ public function fireAction($eventObj, $eventName) {
+ // get class name
+ if (is_object($eventObj)) $className = get_class($eventObj);
+ else $className = $eventObj;
+
+ // load actions from cache if necessary
+ if ($this->actions === null && $this->inheritedActions === null) {
+ $this->loadActions();
+ }
+
+ // generate action name
+ $name = self::generateKey($className, $eventName);
+
+ // execute inherited actions first
+ if (count($this->inheritedActions) > 0) {
+ $this->executeInheritedActions($eventObj, $eventName, $className, $name);
+ }
+
+ // create objects of the actions
+ if (!isset($this->actionsObjects[$name]) || !is_array($this->actionsObjects[$name])) {
+ if (!isset($this->actions[$name]) || !is_array($this->actions[$name])) {
+ // no action registered
+ return false;
+ }
+
+ $this->actionsObjects[$name] = array();
+ foreach ($this->actions[$name] as $action) {
+ if (isset($this->actionsObjects[$name][$action['listenerClassName']])) continue;
+
+ // get class object
+ if (isset($this->listenerObjects[$action['listenerClassName']])) {
+ $object = $this->listenerObjects[$action['listenerClassName']];
+ }
+ else {
+ // instance action object
+ if (!class_exists($action['listenerClassName'])) {
+ throw new SystemException("Unable to find class '".$action['listenerClassName']."'", 11001);
+ }
+ if (!ClassUtil::isInstanceOf($action['listenerClassName'], 'wcf\system\event\IEventListener')) {
+ throw new SystemException("'".$action['listenerClassName']."' should implement interface wcf\system\event\IEventListener");
+ }
+
+ $object = new $action['listenerClassName'];
+ $this->listenerObjects[$path] = $object;
+ }
+
+ $this->actionsObjects[$name][$action['listenerClassName']] = $object;
+ }
+ }
+
+ // execute actions
+ foreach ($this->actionsObjects[$name] as $actionObj) {
+ $actionObj->execute($eventObj, $className, $eventName);
+ }
+ }
+
+ /**
+ * Generates an unique name for an action.
+ *
+ * @param string $className
+ * @param string $eventName
+ */
+ public static function generateKey($className, $eventName) {
+ return $eventName.'@'.$className;
+ }
+}
-<?php\r
-namespace wcf\system\event;\r
-use wcf\data\DatabaseObjectProcessor;\r
-\r
-/**\r
- * EventListeners can be registered for a specific event in many controller objects.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.event\r
- * @category Community Framework\r
- */\r
-interface IEventListener {\r
- /**\r
- * Executes this action.\r
- * \r
- * @param object $eventObj\r
- * @param string $className\r
- * @param string $eventName\r
- */\r
- public function execute($eventObj, $className, $eventName);\r
+<?php
+namespace wcf\system\event;
+use wcf\data\DatabaseObjectProcessor;
+
+/**
+ * EventListeners can be registered for a specific event in many controller objects.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.event
+ * @category Community Framework
+ */
+interface IEventListener {
+ /**
+ * Executes this action.
+ *
+ * @param object $eventObj
+ * @param string $className
+ * @param string $eventName
+ */
+ public function execute($eventObj, $className, $eventName);
}
-<?php\r
-namespace wcf\system\exception;\r
-use wcf\util\JSON;\r
-\r
-/**\r
- * AJAXException provides JSON-encoded exceptions.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category Community Framework\r
- */\r
-class AJAXException extends \Exception {\r
- /**\r
- * Throws a JSON-encoded error message\r
- * \r
- * @param string $message\r
- */\r
- public function __construct($message) {\r
- //header('HTTP/1.0 418 I\'m a Teapot');\r
- header('HTTP/1.0 503 Service Unavailable');\r
- header('Content-type: application/json');\r
- echo JSON::encode(array(\r
- 'message' => $message\r
- ));\r
- exit;\r
- }\r
+<?php
+namespace wcf\system\exception;
+use wcf\util\JSON;
+
+/**
+ * AJAXException provides JSON-encoded exceptions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.exception
+ * @category Community Framework
+ */
+class AJAXException extends \Exception {
+ /**
+ * Throws a JSON-encoded error message
+ *
+ * @param string $message
+ */
+ public function __construct($message) {
+ //header('HTTP/1.0 418 I\'m a Teapot');
+ header('HTTP/1.0 503 Service Unavailable');
+ header('Content-type: application/json');
+ echo JSON::encode(array(
+ 'message' => $message
+ ));
+ exit;
+ }
}
-<?php\r
-namespace wcf\system\exception;\r
-\r
-/**\r
- * WCF::handleException() calls the show method on exceptions that implement this interface.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category Community Framework\r
- */\r
-interface IPrintableException {\r
- /**\r
- * Prints this exception.\r
- * This method is called by WCF::handleException().\r
- */\r
- public function show();\r
+<?php
+namespace wcf\system\exception;
+
+/**
+ * WCF::handleException() calls the show method on exceptions that implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.exception
+ * @category Community Framework
+ */
+interface IPrintableException {
+ /**
+ * Prints this exception.
+ * This method is called by WCF::handleException().
+ */
+ public function show();
}
-<?php\r
-namespace wcf\system\exception;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * IllegalLinkException shows the unknown link error page.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category Community Framework\r
- */\r
-class IllegalLinkException extends NamedUserException {\r
- /**\r
- * Creates a new IllegalLinkException object.\r
- */\r
- public function __construct() {\r
- parent::__construct(WCF::getLanguage()->get('wcf.global.error.illegalLink'));\r
- }\r
- \r
- /**\r
- * @see NamedUserException::show();\r
- */\r
- public function show() {\r
- @header('HTTP/1.0 404 Not Found');\r
- parent::show();\r
- }\r
+<?php
+namespace wcf\system\exception;
+use wcf\system\WCF;
+
+/**
+ * IllegalLinkException shows the unknown link error page.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.exception
+ * @category Community Framework
+ */
+class IllegalLinkException extends NamedUserException {
+ /**
+ * Creates a new IllegalLinkException object.
+ */
+ public function __construct() {
+ parent::__construct(WCF::getLanguage()->get('wcf.global.error.illegalLink'));
+ }
+
+ /**
+ * @see NamedUserException::show();
+ */
+ public function show() {
+ @header('HTTP/1.0 404 Not Found');
+ parent::show();
+ }
}
-<?php\r
-namespace wcf\system\exception;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * NamedUserException shows a (well) styled page with the given error message.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category Community Framework\r
- */\r
-class NamedUserException extends UserException {\r
- /**\r
- * Creates a new NamedUserException object.\r
- * \r
- * @param string $message\r
- */\r
- public function __construct($message) {\r
- parent::__construct($message);\r
- }\r
- \r
- /**\r
- * Shows a styled page with the given error message.\r
- */\r
- public function show() {\r
- WCF::getTPL()->assign(array(\r
- 'name' => get_class($this),\r
- 'file' => $this->getFile(),\r
- 'line' => $this->getLine(),\r
- 'message' => $this->getMessage(),\r
- 'stacktrace' => $this->getTraceAsString()\r
- ));\r
- WCF::getTPL()->display('userException');\r
- }\r
+<?php
+namespace wcf\system\exception;
+use wcf\system\WCF;
+
+/**
+ * NamedUserException shows a (well) styled page with the given error message.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.exception
+ * @category Community Framework
+ */
+class NamedUserException extends UserException {
+ /**
+ * Creates a new NamedUserException object.
+ *
+ * @param string $message
+ */
+ public function __construct($message) {
+ parent::__construct($message);
+ }
+
+ /**
+ * Shows a styled page with the given error message.
+ */
+ public function show() {
+ WCF::getTPL()->assign(array(
+ 'name' => get_class($this),
+ 'file' => $this->getFile(),
+ 'line' => $this->getLine(),
+ 'message' => $this->getMessage(),
+ 'stacktrace' => $this->getTraceAsString()
+ ));
+ WCF::getTPL()->display('userException');
+ }
}
-<?php\r
-namespace wcf\system\exception;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * A PermissionDeniedException is thrown when a user has no permission to access to a specific area.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category Community Framework\r
- */\r
-class PermissionDeniedException extends UserException {\r
- /**\r
- * Creates a new IllegalLinkException object.\r
- */\r
- public function __construct() {\r
- parent::__construct(WCF::getLanguage()->get('wcf.global.error.permissionDenied'));\r
- }\r
-\r
- /**\r
- * Prints a permission denied exception.\r
- */\r
- public function show() {\r
- @header('HTTP/1.0 403 Forbidden');\r
- WCF::getTPL()->display('permissionDenied');\r
- }\r
+<?php
+namespace wcf\system\exception;
+use wcf\system\WCF;
+
+/**
+ * A PermissionDeniedException is thrown when a user has no permission to access to a specific area.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.exception
+ * @category Community Framework
+ */
+class PermissionDeniedException extends UserException {
+ /**
+ * Creates a new IllegalLinkException object.
+ */
+ public function __construct() {
+ parent::__construct(WCF::getLanguage()->get('wcf.global.error.permissionDenied'));
+ }
+
+ /**
+ * Prints a permission denied exception.
+ */
+ public function show() {
+ @header('HTTP/1.0 403 Forbidden');
+ WCF::getTPL()->display('permissionDenied');
+ }
}
-<?php\r
-namespace wcf\system\exception;\r
-\r
-/**\r
- * A UserException is thrown when a user gives invalid input data.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category Community Framework\r
- */\r
-abstract class UserException extends \Exception implements IPrintableException {\r
- /**\r
- * @see wcf\system\exception\IPrintableException::show()\r
- */\r
- public function show() {\r
- echo '<pre>' . $this->getTraceAsString() . '</pre>';\r
- }\r
+<?php
+namespace wcf\system\exception;
+
+/**
+ * A UserException is thrown when a user gives invalid input data.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.exception
+ * @category Community Framework
+ */
+abstract class UserException extends \Exception implements IPrintableException {
+ /**
+ * @see wcf\system\exception\IPrintableException::show()
+ */
+ public function show() {
+ echo '<pre>' . $this->getTraceAsString() . '</pre>';
+ }
}
-<?php\r
-namespace wcf\system\exception;\r
-\r
-/**\r
- * UserInputException handles all formular input errors.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.exception\r
- * @category Community Framework\r
- */\r
-class UserInputException extends UserException {\r
- /**\r
- * Name of error field.\r
- *\r
- * @var string\r
- */\r
- protected $field = null;\r
- \r
- /**\r
- * Error type.\r
- *\r
- * @var string\r
- */\r
- protected $type = null;\r
- \r
- /**\r
- * Creates a new UserInputException.\r
- * \r
- * @param string $field affected formular field\r
- * @param string $type kind of this error\r
- */\r
- public function __construct($field = '', $type = 'empty') {\r
- $this->field = $field;\r
- $this->type = $type;\r
- \r
- parent::__construct();\r
- }\r
- \r
- /**\r
- * Returns the affected formular field of this error.\r
- * \r
- * @return string\r
- */\r
- public function getField() {\r
- return $this->field;\r
- }\r
- \r
- /**\r
- * Returns the kind of this error.\r
- * \r
- * @return string\r
- */\r
- public function getType() {\r
- return $this->type;\r
- }\r
+<?php
+namespace wcf\system\exception;
+
+/**
+ * UserInputException handles all formular input errors.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.exception
+ * @category Community Framework
+ */
+class UserInputException extends UserException {
+ /**
+ * Name of error field.
+ *
+ * @var string
+ */
+ protected $field = null;
+
+ /**
+ * Error type.
+ *
+ * @var string
+ */
+ protected $type = null;
+
+ /**
+ * Creates a new UserInputException.
+ *
+ * @param string $field affected formular field
+ * @param string $type kind of this error
+ */
+ public function __construct($field = '', $type = 'empty') {
+ $this->field = $field;
+ $this->type = $type;
+
+ parent::__construct();
+ }
+
+ /**
+ * Returns the affected formular field of this error.
+ *
+ * @return string
+ */
+ public function getField() {
+ return $this->field;
+ }
+
+ /**
+ * Returns the kind of this error.
+ *
+ * @return string
+ */
+ public function getType() {
+ return $this->type;
+ }
}
-<?php\r
-namespace wcf\system\exception;\r
-\r
-/**\r
- * @todo Ableitung von welcher Exception und wie soll die\r
- * konkrete Anzeige sein, wenn diese Exception nicht\r
- * ordnungsgemäß abgefangen wird?\r
- */\r
-class ValidateActionException extends \Exception {\r
- public function __construct($message) {\r
- die($message);\r
- }\r
+<?php
+namespace wcf\system\exception;
+
+/**
+ * @todo Ableitung von welcher Exception und wie soll die
+ * konkrete Anzeige sein, wenn diese Exception nicht
+ * ordnungsgemäß abgefangen wird?
+ */
+class ValidateActionException extends \Exception {
+ public function __construct($message) {
+ die($message);
+ }
}
-<?php\r
-namespace wcf\system\form;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * FormDocument holds the page structure based upon form element containers.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-class FormDocument {\r
- /**\r
- * list of FormElementContainer objects\r
- *\r
- * @var array<wcf\system\form\IFormElementContainer>\r
- */\r
- protected $containers = array();\r
- \r
- /**\r
- * form document name\r
- *\r
- * @var string\r
- */\r
- protected $name = '';\r
- \r
- /**\r
- * Creates a new instance of FormDocument.\r
- *\r
- * @param string $name\r
- */\r
- public function __construct($name) {\r
- $this->name = StringUtil::trim($name);\r
- }\r
- \r
- /**\r
- * Returns form document name.\r
- *\r
- * @return string\r
- */\r
- public function getName() {\r
- return $this->name;\r
- }\r
- \r
- /**\r
- * Appends a FormElementContainer object.\r
- *\r
- * @param wcf\system\form\IFormElementContainer $container\r
- */\r
- public function appendContainer(IFormElementContainer $container) {\r
- $this->containers[] = $container;\r
- }\r
- \r
- /**\r
- * Prepends a FormElementContainer object.\r
- *\r
- * @param wcf\system\form\IFormElementContainer $container\r
- */\r
- public function prependContainer(IFormElementContainer $container) {\r
- array_unshift($this->containers, $container);\r
- }\r
- \r
- /**\r
- * Returns assigned FormElementContainer objects.\r
- *\r
- * @return array<wcf\system\form\IFormElementContainer>\r
- */\r
- public function getContainers() {\r
- return $this->containers;\r
- }\r
- \r
- /**\r
- * Returns the value of container's child element with given name.\r
- *\r
- * @param string $key\r
- * @return mixed\r
- */\r
- public function getValue($key) {\r
- foreach ($this->containers as $container) {\r
- $value = $container->getValue($key);\r
- if ($value !== null) {\r
- return $value;\r
- }\r
- }\r
- \r
- return null;\r
- }\r
- \r
- /**\r
- * Returns HTML-representation of current document.\r
- *\r
- * @return string\r
- */\r
- public function getHTML() {\r
- $content = '';\r
- \r
- foreach ($this->containers as $container) {\r
- $content .= $container->getHTML($this->getName().'_');\r
- }\r
- \r
- return $content;\r
- }\r
- \r
- /**\r
- * Handles request input variables.\r
- */\r
- public function handleRequest() {\r
- $variables = array();\r
- \r
- foreach ($_REQUEST as $key => $value) {\r
- if (StringUtil::indexOf($key, $this->getName().'_') !== false) {\r
- $key = StringUtil::replace($this->getName().'_', '', $key);\r
- $variables[$key] = $value;\r
- }\r
- }\r
- \r
- if (!empty($variables)) {\r
- foreach ($this->containers as $container) {\r
- $container->handleRequest($variables);\r
- }\r
- }\r
- }\r
+<?php
+namespace wcf\system\form;
+use wcf\util\StringUtil;
+
+/**
+ * FormDocument holds the page structure based upon form element containers.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+class FormDocument {
+ /**
+ * list of FormElementContainer objects
+ *
+ * @var array<wcf\system\form\IFormElementContainer>
+ */
+ protected $containers = array();
+
+ /**
+ * form document name
+ *
+ * @var string
+ */
+ protected $name = '';
+
+ /**
+ * Creates a new instance of FormDocument.
+ *
+ * @param string $name
+ */
+ public function __construct($name) {
+ $this->name = StringUtil::trim($name);
+ }
+
+ /**
+ * Returns form document name.
+ *
+ * @return string
+ */
+ public function getName() {
+ return $this->name;
+ }
+
+ /**
+ * Appends a FormElementContainer object.
+ *
+ * @param wcf\system\form\IFormElementContainer $container
+ */
+ public function appendContainer(IFormElementContainer $container) {
+ $this->containers[] = $container;
+ }
+
+ /**
+ * Prepends a FormElementContainer object.
+ *
+ * @param wcf\system\form\IFormElementContainer $container
+ */
+ public function prependContainer(IFormElementContainer $container) {
+ array_unshift($this->containers, $container);
+ }
+
+ /**
+ * Returns assigned FormElementContainer objects.
+ *
+ * @return array<wcf\system\form\IFormElementContainer>
+ */
+ public function getContainers() {
+ return $this->containers;
+ }
+
+ /**
+ * Returns the value of container's child element with given name.
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function getValue($key) {
+ foreach ($this->containers as $container) {
+ $value = $container->getValue($key);
+ if ($value !== null) {
+ return $value;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns HTML-representation of current document.
+ *
+ * @return string
+ */
+ public function getHTML() {
+ $content = '';
+
+ foreach ($this->containers as $container) {
+ $content .= $container->getHTML($this->getName().'_');
+ }
+
+ return $content;
+ }
+
+ /**
+ * Handles request input variables.
+ */
+ public function handleRequest() {
+ $variables = array();
+
+ foreach ($_REQUEST as $key => $value) {
+ if (StringUtil::indexOf($key, $this->getName().'_') !== false) {
+ $key = StringUtil::replace($this->getName().'_', '', $key);
+ $variables[$key] = $value;
+ }
+ }
+
+ if (!empty($variables)) {
+ foreach ($this->containers as $container) {
+ $container->handleRequest($variables);
+ }
+ }
+ }
}
-<?php\r
-namespace wcf\system\form;\r
-\r
-/**\r
- * Interface for form elements.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-interface IFormElement {\r
- /**\r
- * Creates a new object of type FormElement.\r
- *\r
- * @param wcf\system\form\IFormElementContainer $parent\r
- */\r
- public function __construct(IFormElementContainer $parent);\r
- \r
- /**\r
- * Returns help message.\r
- *\r
- * @return string\r
- */\r
- public function getDescription();\r
- \r
- /**\r
- * Sets help message.\r
- *\r
- * @param string $description\r
- */\r
- public function setDescription($description);\r
- \r
- /**\r
- * Returns label.\r
- *\r
- * @return string\r
- */\r
- public function getLabel();\r
- \r
- /**\r
- * Sets label.\r
- *\r
- * @param string $label\r
- */\r
- public function setLabel($label);\r
- \r
- /**\r
- * Returns element's parent container element.\r
- *\r
- * @return wcf\system\form\IFormElementContainer\r
- */\r
- public function getParent();\r
- \r
- /**\r
- * Returns HTML-representation of current form element.\r
- *\r
- * @param string $formName\r
- * @return string\r
- */\r
- public function getHTML($formName);\r
+<?php
+namespace wcf\system\form;
+
+/**
+ * Interface for form elements.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+interface IFormElement {
+ /**
+ * Creates a new object of type FormElement.
+ *
+ * @param wcf\system\form\IFormElementContainer $parent
+ */
+ public function __construct(IFormElementContainer $parent);
+
+ /**
+ * Returns help message.
+ *
+ * @return string
+ */
+ public function getDescription();
+
+ /**
+ * Sets help message.
+ *
+ * @param string $description
+ */
+ public function setDescription($description);
+
+ /**
+ * Returns label.
+ *
+ * @return string
+ */
+ public function getLabel();
+
+ /**
+ * Sets label.
+ *
+ * @param string $label
+ */
+ public function setLabel($label);
+
+ /**
+ * Returns element's parent container element.
+ *
+ * @return wcf\system\form\IFormElementContainer
+ */
+ public function getParent();
+
+ /**
+ * Returns HTML-representation of current form element.
+ *
+ * @param string $formName
+ * @return string
+ */
+ public function getHTML($formName);
}
-<?php\r
-namespace wcf\system\form;\r
-\r
-/**\r
- * Interface for form element containers.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-interface IFormElementContainer {\r
- /**\r
- * Returns help message.\r
- *\r
- * @return string\r
- */\r
- public function getDescription();\r
- \r
- /**\r
- * Sets help message.\r
- *\r
- * @param string $description\r
- */\r
- public function setDescription($description);\r
- \r
- /**\r
- * Returns label.\r
- *\r
- * @return string\r
- */\r
- public function getLabel();\r
- \r
- /**\r
- * Sets label.\r
- *\r
- * @param string $label\r
- */\r
- public function setLabel($label);\r
- \r
- /**\r
- * Returns the value of child element with given name.\r
- *\r
- * @param string $key\r
- * @return mixed\r
- */\r
- public function getValue($key);\r
- \r
- /**\r
- * Returns a list of child elements.\r
- *\r
- * @return array<wcf\system\form\IFormElement>\r
- */\r
- public function getChildren();\r
- \r
- /**\r
- * Appends a new child to stack.\r
- *\r
- * @param wcf\system\form\IFormElement $element\r
- */\r
- public function appendChild(IFormElement $element);\r
- \r
- /**\r
- * Preprens a new child to stack.\r
- *\r
- * @param wcf\system\form\IFormElement $element\r
- */\r
- public function prependChild(IFormElement $element);\r
- \r
- /**\r
- * Handles a POST or GET request.\r
- *\r
- * @param array $variables\r
- */\r
- public function handleRequest(array $variables);\r
- \r
- /**\r
- * Returns HTML-representation of current form element container.\r
- *\r
- * @param string $formName\r
- * @return string\r
- */\r
- public function getHTML($formName);\r
+<?php
+namespace wcf\system\form;
+
+/**
+ * Interface for form element containers.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+interface IFormElementContainer {
+ /**
+ * Returns help message.
+ *
+ * @return string
+ */
+ public function getDescription();
+
+ /**
+ * Sets help message.
+ *
+ * @param string $description
+ */
+ public function setDescription($description);
+
+ /**
+ * Returns label.
+ *
+ * @return string
+ */
+ public function getLabel();
+
+ /**
+ * Sets label.
+ *
+ * @param string $label
+ */
+ public function setLabel($label);
+
+ /**
+ * Returns the value of child element with given name.
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function getValue($key);
+
+ /**
+ * Returns a list of child elements.
+ *
+ * @return array<wcf\system\form\IFormElement>
+ */
+ public function getChildren();
+
+ /**
+ * Appends a new child to stack.
+ *
+ * @param wcf\system\form\IFormElement $element
+ */
+ public function appendChild(IFormElement $element);
+
+ /**
+ * Preprens a new child to stack.
+ *
+ * @param wcf\system\form\IFormElement $element
+ */
+ public function prependChild(IFormElement $element);
+
+ /**
+ * Handles a POST or GET request.
+ *
+ * @param array $variables
+ */
+ public function handleRequest(array $variables);
+
+ /**
+ * Returns HTML-representation of current form element container.
+ *
+ * @param string $formName
+ * @return string
+ */
+ public function getHTML($formName);
}
-<?php\r
-namespace wcf\system\form\container;\r
-use wcf\system\form\IFormElement;\r
-use wcf\system\form\IFormElementContainer;\r
-use wcf\system\form\element\AbstractNamedFormElement;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Basic implementation for form element containers.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-abstract class AbstractFormElementContainer implements IFormElementContainer {\r
- /**\r
- * list of FormElement objects\r
- *\r
- * @var array<wcf\system\form\IFormElement>\r
- */\r
- protected $children = array();\r
- \r
- /**\r
- * element description or help text\r
- *\r
- * @var string\r
- */\r
- protected $description = '';\r
- \r
- /**\r
- * element label\r
- *\r
- * @var string\r
- */\r
- protected $label = '';\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::setDescription()\r
- */\r
- public function setDescription($description) {\r
- $this->description = StringUtil::trim($description);\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::getDescription()\r
- */\r
- public function getDescription() {\r
- return $this->description;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::setLabel()\r
- */\r
- public function setLabel($label) {\r
- $this->label = StringUtil::trim($label);\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::getLabel()\r
- */\r
- public function getLabel() {\r
- return $this->label;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::appendChild()\r
- */\r
- public function appendChild(IFormElement $element) {\r
- $this->children[] = $element;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::prependChild()\r
- */\r
- public function prependChild(IFormElement $element) {\r
- array_unshift($this->children, $element);\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::getChildren()\r
- */\r
- public function getChildren() {\r
- return $this->children;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::getValue()\r
- */\r
- public function getValue($key) {\r
- foreach ($this->children as $element) {\r
- if ($element instanceof AbstractNamedFormElement) {\r
- if ($element->getName() == $key) {\r
- return $element->getValue();\r
- }\r
- }\r
- }\r
- \r
- return null;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::handleRequest()\r
- */\r
- public function handleRequest(array $variables) {\r
- foreach ($this->children as $element) {\r
- if (!($element instanceof AbstractNamedFormElement)) {\r
- return;\r
- }\r
- \r
- if (isset($variables[$element->getName()])) {\r
- $element->setValue($variables[$element->getName()]);\r
- }\r
- }\r
- }\r
+<?php
+namespace wcf\system\form\container;
+use wcf\system\form\IFormElement;
+use wcf\system\form\IFormElementContainer;
+use wcf\system\form\element\AbstractNamedFormElement;
+use wcf\util\StringUtil;
+
+/**
+ * Basic implementation for form element containers.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+abstract class AbstractFormElementContainer implements IFormElementContainer {
+ /**
+ * list of FormElement objects
+ *
+ * @var array<wcf\system\form\IFormElement>
+ */
+ protected $children = array();
+
+ /**
+ * element description or help text
+ *
+ * @var string
+ */
+ protected $description = '';
+
+ /**
+ * element label
+ *
+ * @var string
+ */
+ protected $label = '';
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::setDescription()
+ */
+ public function setDescription($description) {
+ $this->description = StringUtil::trim($description);
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::getDescription()
+ */
+ public function getDescription() {
+ return $this->description;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::setLabel()
+ */
+ public function setLabel($label) {
+ $this->label = StringUtil::trim($label);
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::getLabel()
+ */
+ public function getLabel() {
+ return $this->label;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::appendChild()
+ */
+ public function appendChild(IFormElement $element) {
+ $this->children[] = $element;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::prependChild()
+ */
+ public function prependChild(IFormElement $element) {
+ array_unshift($this->children, $element);
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::getChildren()
+ */
+ public function getChildren() {
+ return $this->children;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::getValue()
+ */
+ public function getValue($key) {
+ foreach ($this->children as $element) {
+ if ($element instanceof AbstractNamedFormElement) {
+ if ($element->getName() == $key) {
+ return $element->getValue();
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::handleRequest()
+ */
+ public function handleRequest(array $variables) {
+ foreach ($this->children as $element) {
+ if (!($element instanceof AbstractNamedFormElement)) {
+ return;
+ }
+
+ if (isset($variables[$element->getName()])) {
+ $element->setValue($variables[$element->getName()]);
+ }
+ }
+ }
}
-<?php\r
-namespace wcf\system\form\container;\r
-\r
-/**\r
- * Provides a group form element container.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-class GroupFormElementContainer extends AbstractFormElementContainer {\r
- /**\r
- * @see wcf\system\form\IFormElementContainer::getHTML()\r
- */\r
- public function getHTML($formName) {\r
- $content = '';\r
- foreach ($this->children as $element) {\r
- $content .= $element->getHTML($formName);\r
- }\r
- \r
- return <<<HTML\r
-<fieldset>\r
- <legend>{$this->getLabel()}</legend>\r
- \r
- <p class="description">{$this->getDescription()}</p>\r
- \r
- {$content}\r
-</fieldset>\r
-HTML;\r
- }\r
+<?php
+namespace wcf\system\form\container;
+
+/**
+ * Provides a group form element container.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+class GroupFormElementContainer extends AbstractFormElementContainer {
+ /**
+ * @see wcf\system\form\IFormElementContainer::getHTML()
+ */
+ public function getHTML($formName) {
+ $content = '';
+ foreach ($this->children as $element) {
+ $content .= $element->getHTML($formName);
+ }
+
+ return <<<HTML
+<fieldset>
+ <legend>{$this->getLabel()}</legend>
+
+ <p class="description">{$this->getDescription()}</p>
+
+ {$content}
+</fieldset>
+HTML;
+ }
}
-<?php\r
-namespace wcf\system\form\container;\r
-\r
-/**\r
- * Provides a multiple selection form element container.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-class MultipleSelectionFormElementContainer extends SelectionFormElementContainer {\r
- /**\r
- * container value\r
- *\r
- * @var array\r
- */\r
- protected $value = array();\r
- \r
- /**\r
- * Sets container value.\r
- *\r
- * @param array $value\r
- */\r
- public function setValue(array $value) {\r
- $this->value = $value;\r
- }\r
- \r
- /**\r
- * Returns container value.\r
- *\r
- * @return array\r
- */\r
- public function getValue() {\r
- return $this->value;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::getHTML()\r
- */\r
- public function getHTML($formName) {\r
- $content = '';\r
- foreach ($this->getChildren() as $element) {\r
- $content .= $element->getHTML($formName);\r
- }\r
- \r
- return <<<HTML\r
-<div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{$this->getLabel()}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{$this->getLabel()}</legend>\r
- \r
- <div class="formField">\r
- {$content}\r
- </div>\r
- </fieldset>\r
- </div>\r
- <div class="formGroupFieldDesc">\r
- <p>{$this->getDescription()}</p>\r
- </div>\r
-</div>\r
-HTML;\r
- }\r
+<?php
+namespace wcf\system\form\container;
+
+/**
+ * Provides a multiple selection form element container.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+class MultipleSelectionFormElementContainer extends SelectionFormElementContainer {
+ /**
+ * container value
+ *
+ * @var array
+ */
+ protected $value = array();
+
+ /**
+ * Sets container value.
+ *
+ * @param array $value
+ */
+ public function setValue(array $value) {
+ $this->value = $value;
+ }
+
+ /**
+ * Returns container value.
+ *
+ * @return array
+ */
+ public function getValue() {
+ return $this->value;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::getHTML()
+ */
+ public function getHTML($formName) {
+ $content = '';
+ foreach ($this->getChildren() as $element) {
+ $content .= $element->getHTML($formName);
+ }
+
+ return <<<HTML
+<div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{$this->getLabel()}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{$this->getLabel()}</legend>
+
+ <div class="formField">
+ {$content}
+ </div>
+ </fieldset>
+ </div>
+ <div class="formGroupFieldDesc">
+ <p>{$this->getDescription()}</p>
+ </div>
+</div>
+HTML;
+ }
}
-<?php\r
-namespace wcf\system\form\container;\r
-\r
-/**\r
- * Basic implementation for form selection element containers.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-abstract class SelectionFormElementContainer extends AbstractFormElementContainer {\r
- /**\r
- * container name\r
- *\r
- * @var string\r
- */\r
- protected $name = '';\r
- \r
- /**\r
- * Sets container name.\r
- *\r
- * @param string $name\r
- */\r
- public function setName($name) {\r
- $this->name = StringUtil::trim($name);\r
- }\r
- \r
- /**\r
- * Returns container name\r
- *\r
- * @return string\r
- */\r
- public function getName() {\r
- return $this->name;\r
- }\r
+<?php
+namespace wcf\system\form\container;
+
+/**
+ * Basic implementation for form selection element containers.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+abstract class SelectionFormElementContainer extends AbstractFormElementContainer {
+ /**
+ * container name
+ *
+ * @var string
+ */
+ protected $name = '';
+
+ /**
+ * Sets container name.
+ *
+ * @param string $name
+ */
+ public function setName($name) {
+ $this->name = StringUtil::trim($name);
+ }
+
+ /**
+ * Returns container name
+ *
+ * @return string
+ */
+ public function getName() {
+ return $this->name;
+ }
}
-<?php\r
-namespace wcf\system\form\container;\r
-\r
-/**\r
- * Provides a single selection form element container.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-class SingleSelectionFormElementContainer extends SelectionFormElementContainer {\r
- /**\r
- * container value\r
- *\r
- * @var string\r
- */\r
- protected $value = '';\r
- \r
- /**\r
- * Sets container value.\r
- *\r
- * @param string $value\r
- */\r
- public function setValue($value) {\r
- $this->value = StringUtil::trim($value);\r
- }\r
- \r
- /**\r
- * Returns container value.\r
- *\r
- * @return string\r
- */\r
- public function getValue() {\r
- return $this->value;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElementContainer::getHTML()\r
- */\r
- public function getHTML($formName) {\r
- $content = '';\r
- foreach ($this->getChildren() as $element) {\r
- $content .= $element->getHTML($formName);\r
- }\r
- \r
- return <<<HTML\r
-<div class="formGroup">\r
- <div class="formGroupLabel">\r
- <label>{$this->getLabel()}</label>\r
- </div>\r
- <div class="formGroupField">\r
- <fieldset>\r
- <legend>{$this->getLabel()}</legend>\r
- \r
- <div class="formField">\r
- {$content}\r
- </div>\r
- </fieldset>\r
- </div>\r
- <div class="formGroupFieldDesc">\r
- <p>{$this->getDescription()}</p>\r
- </div>\r
-</div>\r
-HTML;\r
- }\r
+<?php
+namespace wcf\system\form\container;
+
+/**
+ * Provides a single selection form element container.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+class SingleSelectionFormElementContainer extends SelectionFormElementContainer {
+ /**
+ * container value
+ *
+ * @var string
+ */
+ protected $value = '';
+
+ /**
+ * Sets container value.
+ *
+ * @param string $value
+ */
+ public function setValue($value) {
+ $this->value = StringUtil::trim($value);
+ }
+
+ /**
+ * Returns container value.
+ *
+ * @return string
+ */
+ public function getValue() {
+ return $this->value;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElementContainer::getHTML()
+ */
+ public function getHTML($formName) {
+ $content = '';
+ foreach ($this->getChildren() as $element) {
+ $content .= $element->getHTML($formName);
+ }
+
+ return <<<HTML
+<div class="formGroup">
+ <div class="formGroupLabel">
+ <label>{$this->getLabel()}</label>
+ </div>
+ <div class="formGroupField">
+ <fieldset>
+ <legend>{$this->getLabel()}</legend>
+
+ <div class="formField">
+ {$content}
+ </div>
+ </fieldset>
+ </div>
+ <div class="formGroupFieldDesc">
+ <p>{$this->getDescription()}</p>
+ </div>
+</div>
+HTML;
+ }
}
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\system\form\IFormElement;\r
-use wcf\system\form\IFormElementContainer;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Basic implementation for form elements.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-abstract class AbstractFormElement implements IFormElement {\r
- /**\r
- * element description or help text\r
- *\r
- * @var string\r
- */\r
- protected $description = '';\r
- \r
- /**\r
- * element label\r
- *\r
- * @var string\r
- */\r
- protected $label = '';\r
- \r
- /**\r
- * FormElementContainer object\r
- *\r
- * @var wcf\system\form\IFormElementContainer\r
- */\r
- protected $parent = null;\r
- \r
- /**\r
- * @see wcf\system\form\IFormElement::__construct()\r
- */\r
- public function __construct(IFormElementContainer $parent) {\r
- $this->parent = $parent;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElement::setDescription()\r
- */\r
- public function setDescription($description) {\r
- $this->description = StringUtil::trim($description);\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElement::getDescription()\r
- */\r
- public function getDescription() {\r
- return $this->description;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElement::setLabel()\r
- */\r
- public function setLabel($label) {\r
- $this->label = StringUtil::trim($label);\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElement::getLabel()\r
- */\r
- public function getLabel() {\r
- return $this->label;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElement::getParent()\r
- */\r
- public function getParent() {\r
- return $this->parent;\r
- }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\system\form\IFormElement;
+use wcf\system\form\IFormElementContainer;
+use wcf\util\StringUtil;
+
+/**
+ * Basic implementation for form elements.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+abstract class AbstractFormElement implements IFormElement {
+ /**
+ * element description or help text
+ *
+ * @var string
+ */
+ protected $description = '';
+
+ /**
+ * element label
+ *
+ * @var string
+ */
+ protected $label = '';
+
+ /**
+ * FormElementContainer object
+ *
+ * @var wcf\system\form\IFormElementContainer
+ */
+ protected $parent = null;
+
+ /**
+ * @see wcf\system\form\IFormElement::__construct()
+ */
+ public function __construct(IFormElementContainer $parent) {
+ $this->parent = $parent;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElement::setDescription()
+ */
+ public function setDescription($description) {
+ $this->description = StringUtil::trim($description);
+ }
+
+ /**
+ * @see wcf\system\form\IFormElement::getDescription()
+ */
+ public function getDescription() {
+ return $this->description;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElement::setLabel()
+ */
+ public function setLabel($label) {
+ $this->label = StringUtil::trim($label);
+ }
+
+ /**
+ * @see wcf\system\form\IFormElement::getLabel()
+ */
+ public function getLabel() {
+ return $this->label;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElement::getParent()
+ */
+ public function getParent() {
+ return $this->parent;
+ }
}
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Basic implementation for named form elements.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-abstract class AbstractNamedFormElement extends AbstractFormElement {\r
- /**\r
- * element name\r
- *\r
- * @var string\r
- */\r
- protected $name = '';\r
- \r
- /**\r
- * element value\r
- *\r
- * @var string\r
- */\r
- protected $value = '';\r
- \r
- /**\r
- * Sets element name.\r
- *\r
- * @param string $name\r
- */\r
- public function setName($name) {\r
- $this->name = StringUtil::trim($name);\r
- }\r
- \r
- /**\r
- * Returns element name\r
- *\r
- * @return string\r
- */\r
- public function getName() {\r
- return $this->name;\r
- }\r
- \r
- /**\r
- * Sets element value.\r
- *\r
- * @param string $value\r
- */\r
- public function setValue($value) {\r
- $this->value = StringUtil::trim($value);\r
- }\r
- \r
- /**\r
- * Returns element value.\r
- *\r
- * @return string\r
- */\r
- public function getValue() {\r
- return $this->value;\r
- }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\util\StringUtil;
+
+/**
+ * Basic implementation for named form elements.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+abstract class AbstractNamedFormElement extends AbstractFormElement {
+ /**
+ * element name
+ *
+ * @var string
+ */
+ protected $name = '';
+
+ /**
+ * element value
+ *
+ * @var string
+ */
+ protected $value = '';
+
+ /**
+ * Sets element name.
+ *
+ * @param string $name
+ */
+ public function setName($name) {
+ $this->name = StringUtil::trim($name);
+ }
+
+ /**
+ * Returns element name
+ *
+ * @return string
+ */
+ public function getName() {
+ return $this->name;
+ }
+
+ /**
+ * Sets element value.
+ *
+ * @param string $value
+ */
+ public function setValue($value) {
+ $this->value = StringUtil::trim($value);
+ }
+
+ /**
+ * Returns element value.
+ *
+ * @return string
+ */
+ public function getValue() {
+ return $this->value;
+ }
}
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\system\util\StringUtil;\r
-\r
-/**\r
- * Provides a label form element.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-class LabelFormElement extends AbstractFormElement {\r
- /**\r
- * element text\r
- *\r
- * @var string\r
- */\r
- protected $text = '';\r
- \r
- /**\r
- * Sets element text.\r
- *\r
- * @param string $text\r
- */\r
- public function setText($text) {\r
- $text->text = StringUtil::trim($text);\r
- }\r
- \r
- /**\r
- * Returns element text.\r
- *\r
- * @return string\r
- */\r
- public function getText() {\r
- return $this->text;\r
- }\r
- \r
- /**\r
- * @see wcf\system\form\IFormElement::getHTML()\r
- */\r
- public function getHTML($formName) {\r
- return <<<HTML\r
-<div class="formElement">\r
- <div class="formFieldLabel">\r
- <label>{$this->getLabel()}</label>\r
- </div>\r
- <div class="formField">\r
- {$this->getText()}\r
- </div>\r
- <div class="formFieldDesc">\r
- <p>{$this->getDescription()}</p>\r
- </div>\r
-</div>\r
-HTML;\r
- }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\system\util\StringUtil;
+
+/**
+ * Provides a label form element.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+class LabelFormElement extends AbstractFormElement {
+ /**
+ * element text
+ *
+ * @var string
+ */
+ protected $text = '';
+
+ /**
+ * Sets element text.
+ *
+ * @param string $text
+ */
+ public function setText($text) {
+ $text->text = StringUtil::trim($text);
+ }
+
+ /**
+ * Returns element text.
+ *
+ * @return string
+ */
+ public function getText() {
+ return $this->text;
+ }
+
+ /**
+ * @see wcf\system\form\IFormElement::getHTML()
+ */
+ public function getHTML($formName) {
+ return <<<HTML
+<div class="formElement">
+ <div class="formFieldLabel">
+ <label>{$this->getLabel()}</label>
+ </div>
+ <div class="formField">
+ {$this->getText()}
+ </div>
+ <div class="formFieldDesc">
+ <p>{$this->getDescription()}</p>
+ </div>
+</div>
+HTML;
+ }
}
-<?php\r
-namespace wcf\system\form\element;\r
-\r
-/**\r
- * Provides a radio form element.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-class MultipleSelectionFormElement extends AbstractNamedFormElement {\r
- /**\r
- * @see wcf\system\form\IFormElement::getHTML()\r
- */\r
- public function getHTML($formName) {\r
- return <<<HTML\r
-<label><input type="checkbox" name="{$formName}{$this->getParent()->getName()}[]" value="{$this->getValue()}" /> {$this->getLabel()}</label>\r
-HTML;\r
- }\r
+<?php
+namespace wcf\system\form\element;
+
+/**
+ * Provides a radio form element.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+class MultipleSelectionFormElement extends AbstractNamedFormElement {
+ /**
+ * @see wcf\system\form\IFormElement::getHTML()
+ */
+ public function getHTML($formName) {
+ return <<<HTML
+<label><input type="checkbox" name="{$formName}{$this->getParent()->getName()}[]" value="{$this->getValue()}" /> {$this->getLabel()}</label>
+HTML;
+ }
}
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Provides a password input form element.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-class PasswordInputFormElement extends AbstractNamedFormElement {\r
- /**\r
- * @see wcf\system\form\IFormElement::getHTML()\r
- */\r
- public function getHTML($formName) {\r
- return <<<HTML\r
-<div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="{$this->getName()}">{$this->getLabel()}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="password" name="{$formName}{$this->getName()}" id="{$this->getName()}" value="{$this->getValue()}" />\r
- </div>\r
- <div class="formFieldDesc">\r
- <p>{$this->getDescription()}</p>\r
- </div>\r
-</div>\r
-HTML;\r
- }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\util\StringUtil;
+
+/**
+ * Provides a password input form element.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+class PasswordInputFormElement extends AbstractNamedFormElement {
+ /**
+ * @see wcf\system\form\IFormElement::getHTML()
+ */
+ public function getHTML($formName) {
+ return <<<HTML
+<div class="formElement">
+ <div class="formFieldLabel">
+ <label for="{$this->getName()}">{$this->getLabel()}</label>
+ </div>
+ <div class="formField">
+ <input type="password" name="{$formName}{$this->getName()}" id="{$this->getName()}" value="{$this->getValue()}" />
+ </div>
+ <div class="formFieldDesc">
+ <p>{$this->getDescription()}</p>
+ </div>
+</div>
+HTML;
+ }
}
-<?php\r
-namespace wcf\system\form\element;\r
-\r
-/**\r
- * Provides a checkbox form element.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-class SingleSelectionFormElement extends AbstractNamedFormElement {\r
- /**\r
- * @see wcf\system\form\IFormElement::getHTML()\r
- */\r
- public function getHTML($formName) {\r
- return <<<HTML\r
-<label><input type="radio" name="{$formName}{$this->getParent()->getName()}" value="{$this->getValue()}" /> {$this->getLabel()}</label>\r
-HTML;\r
- }\r
+<?php
+namespace wcf\system\form\element;
+
+/**
+ * Provides a checkbox form element.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+class SingleSelectionFormElement extends AbstractNamedFormElement {
+ /**
+ * @see wcf\system\form\IFormElement::getHTML()
+ */
+ public function getHTML($formName) {
+ return <<<HTML
+<label><input type="radio" name="{$formName}{$this->getParent()->getName()}" value="{$this->getValue()}" /> {$this->getLabel()}</label>
+HTML;
+ }
}
-<?php\r
-namespace wcf\system\form\element;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Provides a text input form element.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.form\r
- * @category Community Framework\r
- */\r
-class TextInputFormElement extends AbstractNamedFormElement {\r
- /**\r
- * @see wcf\system\form\IFormElement::getHTML()\r
- */\r
- public function getHTML($formName) {\r
- return <<<HTML\r
-<div class="formElement">\r
- <div class="formFieldLabel">\r
- <label for="{$this->getName()}">{$this->getLabel()}</label>\r
- </div>\r
- <div class="formField">\r
- <input type="text" name="{$formName}{$this->getName()}" id="{$this->getName()}" value="{$this->getValue()}" />\r
- </div>\r
- <div class="formFieldDesc">\r
- <p>{$this->getDescription()}</p>\r
- </div>\r
-</div>\r
-HTML;\r
- }\r
+<?php
+namespace wcf\system\form\element;
+use wcf\util\StringUtil;
+
+/**
+ * Provides a text input form element.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.form
+ * @category Community Framework
+ */
+class TextInputFormElement extends AbstractNamedFormElement {
+ /**
+ * @see wcf\system\form\IFormElement::getHTML()
+ */
+ public function getHTML($formName) {
+ return <<<HTML
+<div class="formElement">
+ <div class="formFieldLabel">
+ <label for="{$this->getName()}">{$this->getLabel()}</label>
+ </div>
+ <div class="formField">
+ <input type="text" name="{$formName}{$this->getName()}" id="{$this->getName()}" value="{$this->getValue()}" />
+ </div>
+ <div class="formFieldDesc">
+ <p>{$this->getDescription()}</p>
+ </div>
+</div>
+HTML;
+ }
}
-<?php\r
-namespace wcf\system\image;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Generates a thumbnail of given source file image.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.image\r
- * @category Community Framework\r
- */\r
-class Thumbnail {\r
- /**\r
- * path to source file\r
- *\r
- * @var string\r
- */\r
- protected $sourceFile = '';\r
- \r
- /**\r
- * maximum image width\r
- *\r
- * @var integer\r
- */\r
- protected $maxWidth = 0;\r
- \r
- /**\r
- * maximum image height\r
- *\r
- * @var integer\r
- */\r
- protected $maxHeight = 0;\r
- \r
- /**\r
- * true, to show source information in thumbnail\r
- *\r
- * @var boolean\r
- */\r
- protected $appendSourceInfo = false;\r
- \r
- /**\r
- * true, to prefer embedded thumbnails\r
- *\r
- * @var boolean\r
- */\r
- protected $useEmbedded = true;\r
- \r
- /**\r
- * true, to generate quadratic thumbnails\r
- * \r
- * @var boolean\r
- */\r
- protected $quadratic = false;\r
- \r
- /**\r
- * mime type of the thumbnail\r
- *\r
- * @var string\r
- */\r
- protected $mimeType = '';\r
- \r
- /**\r
- * name of the source image\r
- *\r
- * @var string\r
- */\r
- protected $sourceName = '';\r
- \r
- /**\r
- * width of the source image\r
- * \r
- * @var integer\r
- */\r
- protected $sourceWidth = 0;\r
- \r
- /**\r
- * height of the source image\r
- * \r
- * @var integer\r
- */\r
- protected $sourceHeight = 0;\r
- \r
- /**\r
- * file size of the source image\r
- * \r
- * @var integer\r
- */\r
- protected $sourceSize = 0;\r
- \r
- /**\r
- * height of the source information\r
- * \r
- * @var integer\r
- */\r
- protected static $sourceInfoLineHeight = 16;\r
- \r
- /**\r
- * image type of the source image\r
- * \r
- * @var integer\r
- */\r
- protected $imageType = 0;\r
- \r
- /**\r
- * Creates a new Thumbnail object.\r
- * \r
- * @param string $sourceFile\r
- * @param integer $maxWidth\r
- * @param integer $maxHeight\r
- * @param boolean $appendSourceInfo\r
- */\r
- public function __construct($sourceFile, $maxWidth = 100, $maxHeight = 100, $appendSourceInfo = false, $sourceName = null, $useEmbedded = true, $quadratic = false) {\r
- $this->sourceFile = $sourceFile;\r
- $this->maxWidth = $maxWidth;\r
- $this->maxHeight = $maxHeight;\r
- $this->appendSourceInfo = $appendSourceInfo;\r
- $this->useEmbedded = $useEmbedded;\r
- $this->quadratic = $quadratic;\r
- if ($this->appendSourceInfo) {\r
- // get source info\r
- if ($sourceName != null) $this->sourceName = $sourceName;\r
- else $this->sourceName = basename($this->sourceFile);\r
- list($this->sourceWidth, $this->sourceHeight, $type) = @getImageSize($this->sourceFile);\r
- $this->sourceSize = @filesize($sourceFile);\r
- }\r
- }\r
- \r
- /** \r
- * Creates a thumbnail picture (jpg/png) of a big image\r
- * \r
- * @param boolean $rescale\r
- * @return string thumbnail \r
- */\r
- public function makeThumbnail($rescale = false) {\r
- list($width, $height, $this->imageType) = @getImageSize($this->sourceFile);\r
- \r
- // check image size\r
- if ($this->checkSize($width, $height, $rescale)) {\r
- return false; \r
- }\r
-\r
- // try to extract the embedded thumbnail first (faster)\r
- $thumbnail = false;\r
- if (!$rescale && $this->useEmbedded) {\r
- $thumbnail = $this->extractEmbeddedThumbnail();\r
- }\r
- if (!$thumbnail) {\r
- // calculate uncompressed filesize\r
- // and cancel to avoid a memory_limit error\r
- $memoryLimit = ini_get('memory_limit');\r
- if ($memoryLimit != '') {\r
- $memoryLimit = substr($memoryLimit, 0, -1) * 1024 * 1024;\r
- $fileSize = $width * $height * ($this->imageType == 3 ? 4 : 3);\r
- \r
- if (($fileSize * 2.1) + memory_get_usage() > ($memoryLimit)) {\r
- return false;\r
- }\r
- }\r
- \r
- // calculate new picture size\r
- $x = $y = 0;\r
- if ($this->quadratic) {\r
- $newWidth = $newHeight = $this->maxWidth;\r
- if ($this->appendSourceInfo) $newHeight -= self::$sourceInfoLineHeight * 2;\r
- \r
- if ($width > $height) {\r
- $x = ceil(($width - $height) / 2);\r
- $width = $height;\r
- }\r
- else {\r
- $y = ceil(($height - $width) / 2);\r
- $height = $width;\r
- }\r
- }\r
- else {\r
- $maxHeight = $this->maxHeight;\r
- if ($this->appendSourceInfo) $maxHeight -= self::$sourceInfoLineHeight * 2;\r
- if ($this->maxWidth / $width < $maxHeight / $height) {\r
- $newWidth = $this->maxWidth;\r
- $newHeight = round($height * ($newWidth / $width));\r
- }\r
- else {\r
- $newHeight = $maxHeight; \r
- $newWidth = round($width * ($newHeight / $height));\r
- }\r
- }\r
- \r
- // resize image\r
- $imageResource = false;\r
- \r
- // jpeg image\r
- if ($this->imageType == 2 && function_exists('imagecreatefromjpeg')) {\r
- $imageResource = @imageCreateFromJPEG($this->sourceFile);\r
- }\r
- // gif image\r
- if ($this->imageType == 1 && function_exists('imagecreatefromgif')) {\r
- $imageResource = @imageCreateFromGIF($this->sourceFile);\r
- }\r
- // png image\r
- if ($this->imageType == 3 && function_exists('imagecreatefrompng')) {\r
- $imageResource = @imageCreateFromPNG($this->sourceFile);\r
- }\r
- \r
- // could not create image\r
- if (!$imageResource) {\r
- return false;\r
- }\r
- \r
- // resize image\r
- if (function_exists('imageCreateTrueColor') && function_exists('imageCopyResampled')) {\r
- $imageNew = @imageCreateTrueColor($newWidth, $newHeight);\r
- imageAlphaBlending($imageNew, false);\r
- @imageCopyResampled($imageNew, $imageResource, 0, 0, $x, $y, $newWidth, $newHeight, $width, $height);\r
- imageSaveAlpha($imageNew, true);\r
- }\r
- else if (function_exists('imageCreate') && function_exists('imageCopyResized')) {\r
- $imageNew = @imageCreate($newWidth, $newHeight);\r
- imageAlphaBlending($imageNew, false);\r
- @imageCopyResized($imageNew, $imageResource, 0, 0, $x, $y, $newWidth, $newHeight, $width, $height);\r
- imageSaveAlpha($imageNew, true);\r
- }\r
- else return false;\r
- \r
- // create thumbnail\r
- ob_start();\r
- \r
- if ($this->imageType == 1 && function_exists('imageGIF')) {\r
- @imageGIF($imageNew);\r
- $this->mimeType = 'image/gif';\r
- }\r
- else if (($this->imageType == 1 || $this->imageType == 3) && function_exists('imagePNG')) {\r
- @imagePNG($imageNew);\r
- $this->mimeType = 'image/png';\r
- }\r
- else if (function_exists('imageJPEG')) {\r
- @imageJPEG($imageNew, '', 90);\r
- $this->mimeType = 'image/jpeg';\r
- }\r
- else {\r
- return false;\r
- }\r
- \r
- @imageDestroy($imageNew);\r
- $thumbnail = ob_get_contents();\r
- ob_end_clean();\r
- }\r
- \r
- if ($thumbnail && $this->appendSourceInfo && !$rescale) {\r
- $thumbnail = $this->appendSourceInfo($thumbnail);\r
- }\r
- \r
- return $thumbnail;\r
- }\r
- \r
- /**\r
- * Appends information about the source image to the thumbnail.\r
- * \r
- * @param string $thumbnail\r
- * @return string\r
- */\r
- protected function appendSourceInfo($thumbnail) {\r
- if (!function_exists('imageCreateFromString') || !function_exists('imageCreateTrueColor')) {\r
- return $thumbnail;\r
- }\r
- \r
- $imageSrc = imageCreateFromString($thumbnail);\r
- \r
- // get image size\r
- $width = imageSX($imageSrc);\r
- $height = imageSY($imageSrc);\r
- \r
- // increase height\r
- $heightDst = $height + self::$sourceInfoLineHeight * 2;\r
- \r
- // create new image\r
- $imageDst = imageCreateTrueColor($width, $heightDst);\r
- imageAlphaBlending($imageDst, false);\r
- \r
- // set background color\r
- $background = imageColorAllocate($imageDst, 102, 102, 102);\r
- imageFill($imageDst, 0, 0, $background);\r
-\r
- // copy image\r
- imageCopy($imageDst, $imageSrc, 0, 0, 0, 0, $width, $height);\r
- imageSaveAlpha($imageDst, true);\r
- \r
- // get font size\r
- $font = 2;\r
- $fontWidth = imageFontWidth($font);\r
- $fontHeight = imageFontHeight($font);\r
- $fontColor = imageColorAllocate($imageDst, 255, 255, 255);\r
- \r
- // write source info\r
- $line1 = $this->sourceName;\r
- \r
- // imageString supports only ISO-8859-1 encoded strings\r
- $line1 = StringUtil::convertEncoding('UTF-8', 'ISO-8859-1', $line1);\r
- \r
- // truncate text if necessary\r
- $maxChars = floor($width / $fontWidth);\r
- if (strlen($line1) > $maxChars) {\r
- $line1 = $this->truncateSourceName($line1, $maxChars);\r
- }\r
- \r
- $line2 = $this->sourceWidth.'x'.$this->sourceHeight.' '.FileUtil::formatFilesize($this->sourceSize);\r
- \r
- // write line 1\r
- // calculate text position\r
- $textX = 0;\r
- $textY = 0;\r
- \r
- if ($fontHeight < self::$sourceInfoLineHeight) {\r
- $textY = intval(round((self::$sourceInfoLineHeight - $fontHeight) / 2));\r
- }\r
- if (strlen($line1) * $fontWidth < $width) {\r
- $textX = intval(round(($width - strlen($line1) * $fontWidth) / 2));\r
- }\r
- \r
- imageString($imageDst, $font, $textX, $height + $textY, $line1, $fontColor);\r
- \r
- // write line 2\r
- // calculate text position\r
- $textX = 0;\r
- $textY = 0;\r
- \r
- if ($fontHeight < self::$sourceInfoLineHeight) {\r
- $textY = self::$sourceInfoLineHeight + intval(round((self::$sourceInfoLineHeight - $fontHeight) / 2));\r
- }\r
- if (strlen($line2) * $fontWidth < $width) {\r
- $textX = intval(round(($width - strlen($line2) * $fontWidth) / 2));\r
- }\r
- \r
- imageString($imageDst, $font, $textX, $height + $textY, $line2, $fontColor);\r
- \r
- \r
- // output image\r
- ob_start();\r
- \r
- if ($this->imageType == 1 && function_exists('imageGIF')) {\r
- @imageGIF($imageDst);\r
- $this->mimeType = 'image/gif';\r
- }\r
- else if (($this->imageType == 1 || $this->imageType == 3) && function_exists('imagePNG')) {\r
- @imagePNG($imageDst);\r
- $this->mimeType = 'image/png';\r
- }\r
- else if (function_exists('imageJPEG')) {\r
- @imageJPEG($imageDst, '', 90);\r
- $this->mimeType = 'image/jpeg';\r
- }\r
- else {\r
- return false;\r
- }\r
- \r
- @imageDestroy($imageDst);\r
- $thumbnail = ob_get_contents();\r
- ob_end_clean();\r
- \r
- return $thumbnail;\r
- }\r
- \r
- \r
- /** \r
- * Extracts the embedded thumbnail picture of a jpeg or tiff image\r
- * \r
- * @return string thumbnail \r
- */\r
- protected function extractEmbeddedThumbnail() {\r
- if (!function_exists('exif_thumbnail')) {\r
- return false;\r
- }\r
-\r
- $width = $height = $type = 0;\r
- $thumbnail = @exif_thumbnail($this->sourceFile, $width, $height, $type);\r
- if ($thumbnail && $type && $width && $height) {\r
- // resize the extracted thumbnail again if necessary\r
- // (normally the thumbnail size is set to 160px\r
- // which is recommended in EXIF >2.1 and DCF)\r
- $this->mimeType = image_type_to_mime_type($type);\r
- if (!$this->checkSize($width, $height)) {\r
- // get temporary file name\r
- $this->sourceFile = FileUtil::getTemporaryFilename('thumbnail_');\r
- \r
- // create tmp file\r
- $tmpFile = new File($this->sourceFile);\r
- $tmpFile->write($thumbnail);\r
- $tmpFile->close();\r
- unset($thumbnail, $tmpFile);\r
- \r
- // resize tmp file again\r
- return $this->makeThumbnail(true);\r
- }\r
- \r
- return $thumbnail;\r
- }\r
- \r
- return false;\r
- }\r
- \r
- /**\r
- * Checks the size of an image.\r
- */\r
- protected function checkSize($width, $height, $rescale = true) {\r
- $maxHeight = $this->maxHeight;\r
- if ($this->appendSourceInfo && $rescale) {\r
- $maxHeight -= self::$sourceInfoLineHeight * 2;\r
- }\r
- \r
- if ($width > $this->maxWidth || $height > $maxHeight) {\r
- return false;\r
- }\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * Returns the mime type of the generated thumbnail.\r
- * \r
- * @return string\r
- */\r
- public function getMimeType() {\r
- return $this->mimeType;\r
- }\r
- \r
- /**\r
- * Truncates the given file name to needed length.\r
- * \r
- * @param string $name\r
- * @param string $maxChars\r
- * @return string\r
- */\r
- protected static function truncateSourceName($name, $maxChars) {\r
- $extension = '';\r
- $lastPosition = strrpos($name, '.');\r
- if ($lastPosition !== null) {\r
- $extension = substr($name, $lastPosition);\r
- $name = substr($name, 0, $lastPosition);\r
- $maxChars -= strlen($extension);\r
- }\r
- \r
- return substr($name, 0, $maxChars - 3) . '...' . $extension;\r
- }\r
+<?php
+namespace wcf\system\image;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Generates a thumbnail of given source file image.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.image
+ * @category Community Framework
+ */
+class Thumbnail {
+ /**
+ * path to source file
+ *
+ * @var string
+ */
+ protected $sourceFile = '';
+
+ /**
+ * maximum image width
+ *
+ * @var integer
+ */
+ protected $maxWidth = 0;
+
+ /**
+ * maximum image height
+ *
+ * @var integer
+ */
+ protected $maxHeight = 0;
+
+ /**
+ * true, to show source information in thumbnail
+ *
+ * @var boolean
+ */
+ protected $appendSourceInfo = false;
+
+ /**
+ * true, to prefer embedded thumbnails
+ *
+ * @var boolean
+ */
+ protected $useEmbedded = true;
+
+ /**
+ * true, to generate quadratic thumbnails
+ *
+ * @var boolean
+ */
+ protected $quadratic = false;
+
+ /**
+ * mime type of the thumbnail
+ *
+ * @var string
+ */
+ protected $mimeType = '';
+
+ /**
+ * name of the source image
+ *
+ * @var string
+ */
+ protected $sourceName = '';
+
+ /**
+ * width of the source image
+ *
+ * @var integer
+ */
+ protected $sourceWidth = 0;
+
+ /**
+ * height of the source image
+ *
+ * @var integer
+ */
+ protected $sourceHeight = 0;
+
+ /**
+ * file size of the source image
+ *
+ * @var integer
+ */
+ protected $sourceSize = 0;
+
+ /**
+ * height of the source information
+ *
+ * @var integer
+ */
+ protected static $sourceInfoLineHeight = 16;
+
+ /**
+ * image type of the source image
+ *
+ * @var integer
+ */
+ protected $imageType = 0;
+
+ /**
+ * Creates a new Thumbnail object.
+ *
+ * @param string $sourceFile
+ * @param integer $maxWidth
+ * @param integer $maxHeight
+ * @param boolean $appendSourceInfo
+ */
+ public function __construct($sourceFile, $maxWidth = 100, $maxHeight = 100, $appendSourceInfo = false, $sourceName = null, $useEmbedded = true, $quadratic = false) {
+ $this->sourceFile = $sourceFile;
+ $this->maxWidth = $maxWidth;
+ $this->maxHeight = $maxHeight;
+ $this->appendSourceInfo = $appendSourceInfo;
+ $this->useEmbedded = $useEmbedded;
+ $this->quadratic = $quadratic;
+ if ($this->appendSourceInfo) {
+ // get source info
+ if ($sourceName != null) $this->sourceName = $sourceName;
+ else $this->sourceName = basename($this->sourceFile);
+ list($this->sourceWidth, $this->sourceHeight, $type) = @getImageSize($this->sourceFile);
+ $this->sourceSize = @filesize($sourceFile);
+ }
+ }
+
+ /**
+ * Creates a thumbnail picture (jpg/png) of a big image
+ *
+ * @param boolean $rescale
+ * @return string thumbnail
+ */
+ public function makeThumbnail($rescale = false) {
+ list($width, $height, $this->imageType) = @getImageSize($this->sourceFile);
+
+ // check image size
+ if ($this->checkSize($width, $height, $rescale)) {
+ return false;
+ }
+
+ // try to extract the embedded thumbnail first (faster)
+ $thumbnail = false;
+ if (!$rescale && $this->useEmbedded) {
+ $thumbnail = $this->extractEmbeddedThumbnail();
+ }
+ if (!$thumbnail) {
+ // calculate uncompressed filesize
+ // and cancel to avoid a memory_limit error
+ $memoryLimit = ini_get('memory_limit');
+ if ($memoryLimit != '') {
+ $memoryLimit = substr($memoryLimit, 0, -1) * 1024 * 1024;
+ $fileSize = $width * $height * ($this->imageType == 3 ? 4 : 3);
+
+ if (($fileSize * 2.1) + memory_get_usage() > ($memoryLimit)) {
+ return false;
+ }
+ }
+
+ // calculate new picture size
+ $x = $y = 0;
+ if ($this->quadratic) {
+ $newWidth = $newHeight = $this->maxWidth;
+ if ($this->appendSourceInfo) $newHeight -= self::$sourceInfoLineHeight * 2;
+
+ if ($width > $height) {
+ $x = ceil(($width - $height) / 2);
+ $width = $height;
+ }
+ else {
+ $y = ceil(($height - $width) / 2);
+ $height = $width;
+ }
+ }
+ else {
+ $maxHeight = $this->maxHeight;
+ if ($this->appendSourceInfo) $maxHeight -= self::$sourceInfoLineHeight * 2;
+ if ($this->maxWidth / $width < $maxHeight / $height) {
+ $newWidth = $this->maxWidth;
+ $newHeight = round($height * ($newWidth / $width));
+ }
+ else {
+ $newHeight = $maxHeight;
+ $newWidth = round($width * ($newHeight / $height));
+ }
+ }
+
+ // resize image
+ $imageResource = false;
+
+ // jpeg image
+ if ($this->imageType == 2 && function_exists('imagecreatefromjpeg')) {
+ $imageResource = @imageCreateFromJPEG($this->sourceFile);
+ }
+ // gif image
+ if ($this->imageType == 1 && function_exists('imagecreatefromgif')) {
+ $imageResource = @imageCreateFromGIF($this->sourceFile);
+ }
+ // png image
+ if ($this->imageType == 3 && function_exists('imagecreatefrompng')) {
+ $imageResource = @imageCreateFromPNG($this->sourceFile);
+ }
+
+ // could not create image
+ if (!$imageResource) {
+ return false;
+ }
+
+ // resize image
+ if (function_exists('imageCreateTrueColor') && function_exists('imageCopyResampled')) {
+ $imageNew = @imageCreateTrueColor($newWidth, $newHeight);
+ imageAlphaBlending($imageNew, false);
+ @imageCopyResampled($imageNew, $imageResource, 0, 0, $x, $y, $newWidth, $newHeight, $width, $height);
+ imageSaveAlpha($imageNew, true);
+ }
+ else if (function_exists('imageCreate') && function_exists('imageCopyResized')) {
+ $imageNew = @imageCreate($newWidth, $newHeight);
+ imageAlphaBlending($imageNew, false);
+ @imageCopyResized($imageNew, $imageResource, 0, 0, $x, $y, $newWidth, $newHeight, $width, $height);
+ imageSaveAlpha($imageNew, true);
+ }
+ else return false;
+
+ // create thumbnail
+ ob_start();
+
+ if ($this->imageType == 1 && function_exists('imageGIF')) {
+ @imageGIF($imageNew);
+ $this->mimeType = 'image/gif';
+ }
+ else if (($this->imageType == 1 || $this->imageType == 3) && function_exists('imagePNG')) {
+ @imagePNG($imageNew);
+ $this->mimeType = 'image/png';
+ }
+ else if (function_exists('imageJPEG')) {
+ @imageJPEG($imageNew, '', 90);
+ $this->mimeType = 'image/jpeg';
+ }
+ else {
+ return false;
+ }
+
+ @imageDestroy($imageNew);
+ $thumbnail = ob_get_contents();
+ ob_end_clean();
+ }
+
+ if ($thumbnail && $this->appendSourceInfo && !$rescale) {
+ $thumbnail = $this->appendSourceInfo($thumbnail);
+ }
+
+ return $thumbnail;
+ }
+
+ /**
+ * Appends information about the source image to the thumbnail.
+ *
+ * @param string $thumbnail
+ * @return string
+ */
+ protected function appendSourceInfo($thumbnail) {
+ if (!function_exists('imageCreateFromString') || !function_exists('imageCreateTrueColor')) {
+ return $thumbnail;
+ }
+
+ $imageSrc = imageCreateFromString($thumbnail);
+
+ // get image size
+ $width = imageSX($imageSrc);
+ $height = imageSY($imageSrc);
+
+ // increase height
+ $heightDst = $height + self::$sourceInfoLineHeight * 2;
+
+ // create new image
+ $imageDst = imageCreateTrueColor($width, $heightDst);
+ imageAlphaBlending($imageDst, false);
+
+ // set background color
+ $background = imageColorAllocate($imageDst, 102, 102, 102);
+ imageFill($imageDst, 0, 0, $background);
+
+ // copy image
+ imageCopy($imageDst, $imageSrc, 0, 0, 0, 0, $width, $height);
+ imageSaveAlpha($imageDst, true);
+
+ // get font size
+ $font = 2;
+ $fontWidth = imageFontWidth($font);
+ $fontHeight = imageFontHeight($font);
+ $fontColor = imageColorAllocate($imageDst, 255, 255, 255);
+
+ // write source info
+ $line1 = $this->sourceName;
+
+ // imageString supports only ISO-8859-1 encoded strings
+ $line1 = StringUtil::convertEncoding('UTF-8', 'ISO-8859-1', $line1);
+
+ // truncate text if necessary
+ $maxChars = floor($width / $fontWidth);
+ if (strlen($line1) > $maxChars) {
+ $line1 = $this->truncateSourceName($line1, $maxChars);
+ }
+
+ $line2 = $this->sourceWidth.'x'.$this->sourceHeight.' '.FileUtil::formatFilesize($this->sourceSize);
+
+ // write line 1
+ // calculate text position
+ $textX = 0;
+ $textY = 0;
+
+ if ($fontHeight < self::$sourceInfoLineHeight) {
+ $textY = intval(round((self::$sourceInfoLineHeight - $fontHeight) / 2));
+ }
+ if (strlen($line1) * $fontWidth < $width) {
+ $textX = intval(round(($width - strlen($line1) * $fontWidth) / 2));
+ }
+
+ imageString($imageDst, $font, $textX, $height + $textY, $line1, $fontColor);
+
+ // write line 2
+ // calculate text position
+ $textX = 0;
+ $textY = 0;
+
+ if ($fontHeight < self::$sourceInfoLineHeight) {
+ $textY = self::$sourceInfoLineHeight + intval(round((self::$sourceInfoLineHeight - $fontHeight) / 2));
+ }
+ if (strlen($line2) * $fontWidth < $width) {
+ $textX = intval(round(($width - strlen($line2) * $fontWidth) / 2));
+ }
+
+ imageString($imageDst, $font, $textX, $height + $textY, $line2, $fontColor);
+
+
+ // output image
+ ob_start();
+
+ if ($this->imageType == 1 && function_exists('imageGIF')) {
+ @imageGIF($imageDst);
+ $this->mimeType = 'image/gif';
+ }
+ else if (($this->imageType == 1 || $this->imageType == 3) && function_exists('imagePNG')) {
+ @imagePNG($imageDst);
+ $this->mimeType = 'image/png';
+ }
+ else if (function_exists('imageJPEG')) {
+ @imageJPEG($imageDst, '', 90);
+ $this->mimeType = 'image/jpeg';
+ }
+ else {
+ return false;
+ }
+
+ @imageDestroy($imageDst);
+ $thumbnail = ob_get_contents();
+ ob_end_clean();
+
+ return $thumbnail;
+ }
+
+
+ /**
+ * Extracts the embedded thumbnail picture of a jpeg or tiff image
+ *
+ * @return string thumbnail
+ */
+ protected function extractEmbeddedThumbnail() {
+ if (!function_exists('exif_thumbnail')) {
+ return false;
+ }
+
+ $width = $height = $type = 0;
+ $thumbnail = @exif_thumbnail($this->sourceFile, $width, $height, $type);
+ if ($thumbnail && $type && $width && $height) {
+ // resize the extracted thumbnail again if necessary
+ // (normally the thumbnail size is set to 160px
+ // which is recommended in EXIF >2.1 and DCF)
+ $this->mimeType = image_type_to_mime_type($type);
+ if (!$this->checkSize($width, $height)) {
+ // get temporary file name
+ $this->sourceFile = FileUtil::getTemporaryFilename('thumbnail_');
+
+ // create tmp file
+ $tmpFile = new File($this->sourceFile);
+ $tmpFile->write($thumbnail);
+ $tmpFile->close();
+ unset($thumbnail, $tmpFile);
+
+ // resize tmp file again
+ return $this->makeThumbnail(true);
+ }
+
+ return $thumbnail;
+ }
+
+ return false;
+ }
+
+ /**
+ * Checks the size of an image.
+ */
+ protected function checkSize($width, $height, $rescale = true) {
+ $maxHeight = $this->maxHeight;
+ if ($this->appendSourceInfo && $rescale) {
+ $maxHeight -= self::$sourceInfoLineHeight * 2;
+ }
+
+ if ($width > $this->maxWidth || $height > $maxHeight) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns the mime type of the generated thumbnail.
+ *
+ * @return string
+ */
+ public function getMimeType() {
+ return $this->mimeType;
+ }
+
+ /**
+ * Truncates the given file name to needed length.
+ *
+ * @param string $name
+ * @param string $maxChars
+ * @return string
+ */
+ protected static function truncateSourceName($name, $maxChars) {
+ $extension = '';
+ $lastPosition = strrpos($name, '.');
+ if ($lastPosition !== null) {
+ $extension = substr($name, $lastPosition);
+ $name = substr($name, 0, $lastPosition);
+ $maxChars -= strlen($extension);
+ }
+
+ return substr($name, 0, $maxChars - 3) . '...' . $extension;
+ }
}
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The FTP class handles all ftp operations.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category Community Framework\r
- */\r
-class FTP {\r
- /**\r
- * file pointer resource\r
- * @var resource\r
- */\r
- protected $resource = null;\r
-\r
- /**\r
- * Opens a new ftp connection to given host.\r
- * \r
- * @param string $host\r
- * @param string $port\r
- * @param integer $timeout\r
- */\r
- public function __construct($host = 'localhost', $port = 21, $timeout = 30) {\r
- $this->resource = ftp_connect($host, $port, $timeout);\r
- if ($this->resource === false) {\r
- throw new SystemException('Can not connect to ' . $host, 11008);\r
- }\r
- }\r
-\r
- /**\r
- * Calls the specified function on the open ftp connection.\r
- * \r
- * @param string $function\r
- * @param array $arguments\r
- */\r
- public function __call($function, $arguments) {\r
- array_unshift($arguments, $this->resource);\r
- if (!function_exists('ftp_'.$function)) {\r
- throw new SystemException('Can not call method ' . $function, 11003);\r
- }\r
- \r
- return call_user_func_array('ftp_' . $function, $arguments);\r
- }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+
+/**
+ * The FTP class handles all ftp operations.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.io
+ * @category Community Framework
+ */
+class FTP {
+ /**
+ * file pointer resource
+ * @var resource
+ */
+ protected $resource = null;
+
+ /**
+ * Opens a new ftp connection to given host.
+ *
+ * @param string $host
+ * @param string $port
+ * @param integer $timeout
+ */
+ public function __construct($host = 'localhost', $port = 21, $timeout = 30) {
+ $this->resource = ftp_connect($host, $port, $timeout);
+ if ($this->resource === false) {
+ throw new SystemException('Can not connect to ' . $host, 11008);
+ }
+ }
+
+ /**
+ * Calls the specified function on the open ftp connection.
+ *
+ * @param string $function
+ * @param array $arguments
+ */
+ public function __call($function, $arguments) {
+ array_unshift($arguments, $this->resource);
+ if (!function_exists('ftp_'.$function)) {
+ throw new SystemException('Can not call method ' . $function, 11003);
+ }
+
+ return call_user_func_array('ftp_' . $function, $arguments);
+ }
}
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The File class handles all file operations.\r
- * \r
- * Example:\r
- * using php functions:\r
- * $fp = fopen('filename', 'wb');\r
- * fwrite($fp, '...');\r
- * fclose($fp);\r
- * \r
- * using this class:\r
- * $file = new File('filename');\r
- * $file->write('...');\r
- * $file->close();\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category Community Framework\r
- */\r
-class File {\r
- /**\r
- * file pointer resource\r
- * @var resource\r
- */\r
- protected $resource = null;\r
- \r
- /**\r
- * filename\r
- * @var string\r
- */\r
- protected $filename = '';\r
- \r
- /**\r
- * Opens a new file.\r
- * \r
- * @param string $filename\r
- * @param string $mode\r
- * @param array $options\r
- */\r
- public function __construct($filename, $mode = 'wb', $options = array()) {\r
- $this->filename = $filename;\r
- if (count($options)) {\r
- $context = stream_context_create($options);\r
- $this->resource = fopen($filename, $mode, false, $context);\r
- }\r
- else {\r
- $this->resource = fopen($filename, $mode);\r
- }\r
- if ($this->resource === false) {\r
- throw new SystemException('Can not open file ' . $filename, 11012);\r
- }\r
- }\r
- \r
- /**\r
- * Calls the specified function on the open file.\r
- * Do not call this function directly. Use $file->write('') instead.\r
- * \r
- * @param string $function\r
- * @param array $arguments\r
- */\r
- public function __call($function, $arguments) {\r
- if (function_exists('f' . $function)) {\r
- array_unshift($arguments, $this->resource);\r
- return call_user_func_array('f' . $function, $arguments);\r
- }\r
- else if (function_exists($function)) {\r
- array_unshift($arguments, $this->filename);\r
- return call_user_func_array($function, $arguments);\r
- }\r
- else {\r
- throw new SystemException('Can not call file method ' . $function, 11003);\r
- }\r
- }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+
+/**
+ * The File class handles all file operations.
+ *
+ * Example:
+ * using php functions:
+ * $fp = fopen('filename', 'wb');
+ * fwrite($fp, '...');
+ * fclose($fp);
+ *
+ * using this class:
+ * $file = new File('filename');
+ * $file->write('...');
+ * $file->close();
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.io
+ * @category Community Framework
+ */
+class File {
+ /**
+ * file pointer resource
+ * @var resource
+ */
+ protected $resource = null;
+
+ /**
+ * filename
+ * @var string
+ */
+ protected $filename = '';
+
+ /**
+ * Opens a new file.
+ *
+ * @param string $filename
+ * @param string $mode
+ * @param array $options
+ */
+ public function __construct($filename, $mode = 'wb', $options = array()) {
+ $this->filename = $filename;
+ if (count($options)) {
+ $context = stream_context_create($options);
+ $this->resource = fopen($filename, $mode, false, $context);
+ }
+ else {
+ $this->resource = fopen($filename, $mode);
+ }
+ if ($this->resource === false) {
+ throw new SystemException('Can not open file ' . $filename, 11012);
+ }
+ }
+
+ /**
+ * Calls the specified function on the open file.
+ * Do not call this function directly. Use $file->write('') instead.
+ *
+ * @param string $function
+ * @param array $arguments
+ */
+ public function __call($function, $arguments) {
+ if (function_exists('f' . $function)) {
+ array_unshift($arguments, $this->resource);
+ return call_user_func_array('f' . $function, $arguments);
+ }
+ else if (function_exists($function)) {
+ array_unshift($arguments, $this->filename);
+ return call_user_func_array($function, $arguments);
+ }
+ else {
+ throw new SystemException('Can not call file method ' . $function, 11003);
+ }
+ }
}
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The File class handles all file operations on a gzip file.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category Community Framework\r
- */\r
-class GZipFile extends File {\r
- /**\r
- * Opens a gzip file.\r
- * \r
- * @param string $filename\r
- * @param string $mode\r
- */\r
- public function __construct($filename, $mode = 'wb') {\r
- $this->filename = $filename;\r
- $this->resource = gzopen($filename, $mode);\r
- if ($this->resource === false) {\r
- throw new SystemException('Can not open file ' . $filename, 11012);\r
- }\r
- }\r
- \r
- /**\r
- * Calls the specified function on the open file.\r
- * \r
- * @param string $function\r
- * @param array $arguments\r
- */\r
- public function __call($function, $arguments) {\r
- if (function_exists('gz' . $function)) {\r
- array_unshift($arguments, $this->resource);\r
- return call_user_func_array('gz' . $function, $arguments);\r
- }\r
- else if (function_exists($function)) {\r
- array_unshift($arguments, $this->filename);\r
- return call_user_func_array($function, $arguments);\r
- }\r
- else {\r
- throw new SystemException('Can not call method ' . $function, 11003);\r
- }\r
- }\r
- \r
- /**\r
- * Returns the filesize of the unzipped file.\r
- * \r
- * @return integer\r
- */\r
- public function getFileSize() {\r
- $byteBlock = 1<<14;\r
- $eof = $byteBlock;\r
- \r
- // the correction is for zip files that are too small \r
- // to get in the first while loop \r
- $correction = 1;\r
- while ($this->seek($eof) == 0) {\r
- $eof += $byteBlock;\r
- $correction = 0;\r
- }\r
- \r
- while ($byteBlock > 1) {\r
- $byteBlock >>= 1;\r
- $eof += $byteBlock * ($this->seek($eof) ? -1 : 1);\r
- }\r
- \r
- if ($this->seek($eof) == -1) $eof -= 1;\r
- \r
- $this->rewind();\r
- return $eof - $correction;\r
- }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+
+/**
+ * The File class handles all file operations on a gzip file.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.io
+ * @category Community Framework
+ */
+class GZipFile extends File {
+ /**
+ * Opens a gzip file.
+ *
+ * @param string $filename
+ * @param string $mode
+ */
+ public function __construct($filename, $mode = 'wb') {
+ $this->filename = $filename;
+ $this->resource = gzopen($filename, $mode);
+ if ($this->resource === false) {
+ throw new SystemException('Can not open file ' . $filename, 11012);
+ }
+ }
+
+ /**
+ * Calls the specified function on the open file.
+ *
+ * @param string $function
+ * @param array $arguments
+ */
+ public function __call($function, $arguments) {
+ if (function_exists('gz' . $function)) {
+ array_unshift($arguments, $this->resource);
+ return call_user_func_array('gz' . $function, $arguments);
+ }
+ else if (function_exists($function)) {
+ array_unshift($arguments, $this->filename);
+ return call_user_func_array($function, $arguments);
+ }
+ else {
+ throw new SystemException('Can not call method ' . $function, 11003);
+ }
+ }
+
+ /**
+ * Returns the filesize of the unzipped file.
+ *
+ * @return integer
+ */
+ public function getFileSize() {
+ $byteBlock = 1<<14;
+ $eof = $byteBlock;
+
+ // the correction is for zip files that are too small
+ // to get in the first while loop
+ $correction = 1;
+ while ($this->seek($eof) == 0) {
+ $eof += $byteBlock;
+ $correction = 0;
+ }
+
+ while ($byteBlock > 1) {
+ $byteBlock >>= 1;
+ $eof += $byteBlock * ($this->seek($eof) ? -1 : 1);
+ }
+
+ if ($this->seek($eof) == -1) $eof -= 1;
+
+ $this->rewind();
+ return $eof - $correction;
+ }
}
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The RemoteFile class opens a connection to a remote host as a file.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category Community Framework\r
- */\r
-class RemoteFile extends File {\r
- /**\r
- * host address\r
- * @var string\r
- */\r
- protected $host = '';\r
- \r
- /**\r
- * port\r
- * @var integer\r
- */\r
- protected $port = 0;\r
- \r
- /**\r
- * error number\r
- * @var integer\r
- */\r
- protected $errorNumber = 0;\r
- \r
- /**\r
- * error description\r
- * @var string\r
- */\r
- protected $errorDesc = '';\r
- \r
- /**\r
- * Opens a new connection to a remote host.\r
- * \r
- * @param string $host\r
- * @param integer $port\r
- * @param integer $timeout\r
- * @param array $options\r
- */\r
- public function __construct($host, $port, $timeout = 30, $options = array()) {\r
- $this->host = $host;\r
- $this->port = $port;\r
- if (count($options)) {\r
- $context = stream_context_create($options);\r
- $this->resource = fsockopen($host, $port, $this->errorNumber, $this->errorDesc, $timeout, $context);\r
- }\r
- else {\r
- $this->resource = fsockopen($host, $port, $this->errorNumber, $this->errorDesc, $timeout);\r
- }\r
- if ($this->resource === false) {\r
- throw new SystemException('Can not connect to ' . $host, 14000);\r
- }\r
- }\r
- \r
- /**\r
- * Returns the error number of the last error.\r
- * \r
- * @return integer\r
- */\r
- public function getErrorNumber() {\r
- return $this->errorNumber;\r
- }\r
- \r
- /**\r
- * Returns the error description of the last error.\r
- * \r
- * @return string\r
- */\r
- public function getErrorDesc() {\r
- return $this->errorDesc;\r
- }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+
+/**
+ * The RemoteFile class opens a connection to a remote host as a file.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.io
+ * @category Community Framework
+ */
+class RemoteFile extends File {
+ /**
+ * host address
+ * @var string
+ */
+ protected $host = '';
+
+ /**
+ * port
+ * @var integer
+ */
+ protected $port = 0;
+
+ /**
+ * error number
+ * @var integer
+ */
+ protected $errorNumber = 0;
+
+ /**
+ * error description
+ * @var string
+ */
+ protected $errorDesc = '';
+
+ /**
+ * Opens a new connection to a remote host.
+ *
+ * @param string $host
+ * @param integer $port
+ * @param integer $timeout
+ * @param array $options
+ */
+ public function __construct($host, $port, $timeout = 30, $options = array()) {
+ $this->host = $host;
+ $this->port = $port;
+ if (count($options)) {
+ $context = stream_context_create($options);
+ $this->resource = fsockopen($host, $port, $this->errorNumber, $this->errorDesc, $timeout, $context);
+ }
+ else {
+ $this->resource = fsockopen($host, $port, $this->errorNumber, $this->errorDesc, $timeout);
+ }
+ if ($this->resource === false) {
+ throw new SystemException('Can not connect to ' . $host, 14000);
+ }
+ }
+
+ /**
+ * Returns the error number of the last error.
+ *
+ * @return integer
+ */
+ public function getErrorNumber() {
+ return $this->errorNumber;
+ }
+
+ /**
+ * Returns the error description of the last error.
+ *
+ * @return string
+ */
+ public function getErrorDesc() {
+ return $this->errorDesc;
+ }
}
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\FileUtil;\r
-\r
-/**\r
- * Opens tar or tar.gz archives.\r
- * \r
- * Usage:\r
- * ------\r
- * $tar = new Tar('archive.tar');\r
- * $contentList = $tar->getContentList();\r
- * foreach ($contentList as $key => $val) {\r
- * $tar->extract($key, DESTINATION);\r
- * }\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category Community Framework\r
- */\r
-class Tar {\r
- protected $archiveName = '';\r
- protected $contentList = array();\r
- protected $opened = false;\r
- protected $read = false;\r
- protected $file = null;\r
- protected $isZipped = false;\r
- protected $mode = 'rb';\r
- \r
- /**\r
- * Creates a new Tar object.\r
- * archiveName must be tarball or gzipped tarball\r
- * \r
- * @param string $archiveName\r
- */\r
- public function __construct($archiveName) {\r
- $match = array();\r
- if (!is_file($archiveName)) {\r
- throw new SystemException("unable to find tar archive '".$archiveName."'", 11002);\r
- }\r
- \r
- $this->archiveName = $archiveName;\r
- $this->open();\r
- $this->readContent();\r
- }\r
- \r
- /**\r
- * Destructor of this class, closes tar archive.\r
- */\r
- public function __destruct() {\r
- $this->close();\r
- }\r
- \r
- /**\r
- * Opens the tar archive and stores filehandle.\r
- */\r
- public function open() {\r
- if (!$this->opened) {\r
- if ($this->isZipped) $this->file = new GZipFile($this->archiveName, $this->mode);\r
- else {\r
- // test compression\r
- $this->file = new File($this->archiveName, $this->mode);\r
- if ($this->file->read(2) == "\37\213") {\r
- $this->file->close();\r
- $this->isZipped = true;\r
- $this->file = new GZipFile($this->archiveName, $this->mode);\r
- }\r
- else {\r
- $this->file->seek(0);\r
- }\r
- }\r
- $this->opened = true;\r
- }\r
- }\r
-\r
- /**\r
- * Closes the opened file.\r
- */\r
- public function close() {\r
- if ($this->opened) {\r
- $this->file->close();\r
- $this->opened = false;\r
- }\r
- }\r
- \r
- /** \r
- * Returns the table of contents (TOC) list for this tar archive.\r
- * \r
- * @return array list of content\r
- */\r
- public function getContentList() {\r
- if (!$this->read) {\r
- $this->open();\r
- $this->readContent();\r
- }\r
- return $this->contentList;\r
- }\r
- \r
- /**\r
- * Returns an associative array with information\r
- * about a specific file in the archive.\r
- *\r
- * @param mixed $fileindex index or name of the requested file\r
- * @return array $fileInfo\r
- */\r
- public function getFileInfo($fileIndex) {\r
- if (!is_int($fileIndex)) {\r
- $fileIndex = $this->getIndexByFilename($fileIndex);\r
- }\r
- \r
- if (!isset($this->contentList[$fileIndex])) {\r
- throw new SystemException("Tar: could find file '".$fileIndex."' in archive", 11013);\r
- }\r
- return $this->contentList[$fileIndex];\r
- }\r
- \r
- /**\r
- * Searchs a file in the tar archive\r
- * and returns the numeric fileindex.\r
- * Returns false if not found.\r
- *\r
- * @param string $filename\r
- * @return integer index of the requested file\r
- */\r
- public function getIndexByFilename($filename) {\r
- foreach ($this->contentList as $index => $file) {\r
- if ($file['filename'] == $filename) {\r
- return $index;\r
- }\r
- }\r
- return false;\r
- }\r
- \r
- /**\r
- * Extracts a specific file and returns the content as string.\r
- * Returns false if extraction failed.\r
- * \r
- * @param mixed $index index or name of the requested file\r
- * @return string content of the requested file\r
- */\r
- public function extractToString($index) {\r
- if (!$this->read) {\r
- $this->open();\r
- $this->readContent();\r
- }\r
- $header = $this->getFileInfo($index);\r
- \r
- // can not extract a folder\r
- if ($header['type'] != 'file') {\r
- return false;\r
- }\r
- \r
- // seek to offset\r
- $this->file->seek($header['offset']);\r
- \r
- // read data\r
- $content = '';\r
- $n = floor($header['size'] / 512);\r
- for ($i = 0; $i < $n; $i++) {\r
- $content .= $this->file->read(512);\r
- }\r
- if (($header['size'] % 512) != 0) {\r
- $buffer = $this->file->read(512);\r
- $content .= substr($buffer, 0, ($header['size'] % 512));\r
- }\r
- \r
- return $content;\r
- }\r
- \r
- /**\r
- * Extracts a specific file and writes it's content\r
- * to the file specified with $destination.\r
- * \r
- * @param mixed $index index or name of the requested file\r
- * @param string $destination\r
- * @return boolean $success\r
- */\r
- public function extract($index, $destination) {\r
- if (!$this->read) {\r
- $this->open();\r
- $this->readContent();\r
- }\r
- $header = $this->getFileInfo($index);\r
- \r
- // can not extract a folder\r
- if ($header['type'] != 'file') {\r
- return false;\r
- }\r
- \r
- // seek to offset\r
- $this->file->seek($header['offset']);\r
- \r
- $targetFile = new File($destination);\r
- \r
- // read data\r
- $n = floor($header['size'] / 512);\r
- for ($i = 0; $i < $n; $i++) {\r
- $content = $this->file->read(512);\r
- $targetFile->write($content, 512);\r
- }\r
- if (($header['size'] % 512) != 0) {\r
- $content = $this->file->read(512);\r
- $targetFile->write($content, ($header['size'] % 512));\r
- }\r
- \r
- $targetFile->close();\r
- if (FileUtil::isApacheModule() || !@$targetFile->is_writable()) {\r
- @$targetFile->chmod(0777);\r
- }\r
- else {\r
- @$targetFile->chmod(0755);\r
- }\r
- \r
- if ($header['mtime']) {\r
- @$targetFile->touch($header['mtime']);\r
- }\r
- \r
- // check filesize\r
- if (filesize($destination) != $header['size']) {\r
- throw new SystemException("Could not untar file '".$header['filename']."' to '".$destination."'. Maybe disk quota exceeded in folder '".dirname($destination)."'.", 11015);\r
- }\r
- \r
- return true;\r
- } \r
- \r
- /**\r
- * Reads table of contents (TOC) from tar archive.\r
- * This does not get the entire to memory but only parts of it.\r
- */\r
- protected function readContent() {\r
- $this->contentList = array();\r
- $this->read = true;\r
- $i = 0;\r
- \r
- // Read the 512 bytes header\r
- while (strlen($binaryData = $this->file->read(512)) != 0) {\r
- // read header\r
- $header = $this->readHeader($binaryData);\r
- if ($header === false) {\r
- continue; \r
- }\r
- $this->contentList[$i] = $header;\r
- $this->contentList[$i]['index'] = $i;\r
- $i++;\r
- \r
- $this->file->seek($this->file->tell() + (512 * ceil(($header['size'] / 512))));\r
- }\r
- }\r
- \r
- /**\r
- * Unpacks file header for one file entry.\r
- *\r
- * @param string $binaryData\r
- * @return array $fileheader\r
- */\r
- protected function readHeader($binaryData) {\r
- if (strlen($binaryData) != 512) {\r
- return false; \r
- }\r
-\r
- $header = array();\r
- $checksum = 0;\r
- // First part of the header\r
- for ($i = 0; $i < 148; $i++) {\r
- $checksum += ord(substr($binaryData, $i, 1));\r
- }\r
- // Calculate the checksum\r
- // Ignore the checksum value and replace it by ' ' (space)\r
- for ($i = 148; $i < 156; $i++) {\r
- $checksum += ord(' ');\r
- }\r
- // Last part of the header\r
- for ($i = 156; $i < 512; $i++) {\r
- $checksum += ord(substr($binaryData, $i, 1));\r
- }\r
-\r
- // Extract the values\r
- //$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $binaryData);\r
- $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $binaryData);\r
- \r
- // Extract the properties\r
- $header['checksum'] = octDec(trim($data['checksum']));\r
- if ($header['checksum'] == $checksum) {\r
- $header['filename'] = trim($data['filename']);\r
- $header['mode'] = octDec(trim($data['mode']));\r
- $header['uid'] = octDec(trim($data['uid']));\r
- $header['gid'] = octDec(trim($data['gid']));\r
- $header['size'] = octDec(trim($data['size']));\r
- $header['mtime'] = octDec(trim($data['mtime']));\r
- $header['prefix'] = trim($data['prefix']);\r
- if ($header['prefix']) {\r
- $header['filename'] = $header['prefix'].'/'.$header['filename'];\r
- }\r
- if (($header['typeflag'] = $data['typeflag']) == '5') {\r
- $header['size'] = 0;\r
- $header['type'] = 'folder';\r
- }\r
- else {\r
- $header['type'] = 'file';\r
- }\r
- $header['offset'] = $this->file->tell();\r
- \r
- return $header;\r
- }\r
- else {\r
- return false;\r
- }\r
- }\r
- \r
- /**\r
- * Returns true, if this tar is (g)zipped.\r
- * \r
- * @return boolean\r
- */\r
- public function isZipped() {\r
- return $this->isZipped;\r
- }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+use wcf\util\FileUtil;
+
+/**
+ * Opens tar or tar.gz archives.
+ *
+ * Usage:
+ * ------
+ * $tar = new Tar('archive.tar');
+ * $contentList = $tar->getContentList();
+ * foreach ($contentList as $key => $val) {
+ * $tar->extract($key, DESTINATION);
+ * }
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.io
+ * @category Community Framework
+ */
+class Tar {
+ protected $archiveName = '';
+ protected $contentList = array();
+ protected $opened = false;
+ protected $read = false;
+ protected $file = null;
+ protected $isZipped = false;
+ protected $mode = 'rb';
+
+ /**
+ * Creates a new Tar object.
+ * archiveName must be tarball or gzipped tarball
+ *
+ * @param string $archiveName
+ */
+ public function __construct($archiveName) {
+ $match = array();
+ if (!is_file($archiveName)) {
+ throw new SystemException("unable to find tar archive '".$archiveName."'", 11002);
+ }
+
+ $this->archiveName = $archiveName;
+ $this->open();
+ $this->readContent();
+ }
+
+ /**
+ * Destructor of this class, closes tar archive.
+ */
+ public function __destruct() {
+ $this->close();
+ }
+
+ /**
+ * Opens the tar archive and stores filehandle.
+ */
+ public function open() {
+ if (!$this->opened) {
+ if ($this->isZipped) $this->file = new GZipFile($this->archiveName, $this->mode);
+ else {
+ // test compression
+ $this->file = new File($this->archiveName, $this->mode);
+ if ($this->file->read(2) == "\37\213") {
+ $this->file->close();
+ $this->isZipped = true;
+ $this->file = new GZipFile($this->archiveName, $this->mode);
+ }
+ else {
+ $this->file->seek(0);
+ }
+ }
+ $this->opened = true;
+ }
+ }
+
+ /**
+ * Closes the opened file.
+ */
+ public function close() {
+ if ($this->opened) {
+ $this->file->close();
+ $this->opened = false;
+ }
+ }
+
+ /**
+ * Returns the table of contents (TOC) list for this tar archive.
+ *
+ * @return array list of content
+ */
+ public function getContentList() {
+ if (!$this->read) {
+ $this->open();
+ $this->readContent();
+ }
+ return $this->contentList;
+ }
+
+ /**
+ * Returns an associative array with information
+ * about a specific file in the archive.
+ *
+ * @param mixed $fileindex index or name of the requested file
+ * @return array $fileInfo
+ */
+ public function getFileInfo($fileIndex) {
+ if (!is_int($fileIndex)) {
+ $fileIndex = $this->getIndexByFilename($fileIndex);
+ }
+
+ if (!isset($this->contentList[$fileIndex])) {
+ throw new SystemException("Tar: could find file '".$fileIndex."' in archive", 11013);
+ }
+ return $this->contentList[$fileIndex];
+ }
+
+ /**
+ * Searchs a file in the tar archive
+ * and returns the numeric fileindex.
+ * Returns false if not found.
+ *
+ * @param string $filename
+ * @return integer index of the requested file
+ */
+ public function getIndexByFilename($filename) {
+ foreach ($this->contentList as $index => $file) {
+ if ($file['filename'] == $filename) {
+ return $index;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Extracts a specific file and returns the content as string.
+ * Returns false if extraction failed.
+ *
+ * @param mixed $index index or name of the requested file
+ * @return string content of the requested file
+ */
+ public function extractToString($index) {
+ if (!$this->read) {
+ $this->open();
+ $this->readContent();
+ }
+ $header = $this->getFileInfo($index);
+
+ // can not extract a folder
+ if ($header['type'] != 'file') {
+ return false;
+ }
+
+ // seek to offset
+ $this->file->seek($header['offset']);
+
+ // read data
+ $content = '';
+ $n = floor($header['size'] / 512);
+ for ($i = 0; $i < $n; $i++) {
+ $content .= $this->file->read(512);
+ }
+ if (($header['size'] % 512) != 0) {
+ $buffer = $this->file->read(512);
+ $content .= substr($buffer, 0, ($header['size'] % 512));
+ }
+
+ return $content;
+ }
+
+ /**
+ * Extracts a specific file and writes it's content
+ * to the file specified with $destination.
+ *
+ * @param mixed $index index or name of the requested file
+ * @param string $destination
+ * @return boolean $success
+ */
+ public function extract($index, $destination) {
+ if (!$this->read) {
+ $this->open();
+ $this->readContent();
+ }
+ $header = $this->getFileInfo($index);
+
+ // can not extract a folder
+ if ($header['type'] != 'file') {
+ return false;
+ }
+
+ // seek to offset
+ $this->file->seek($header['offset']);
+
+ $targetFile = new File($destination);
+
+ // read data
+ $n = floor($header['size'] / 512);
+ for ($i = 0; $i < $n; $i++) {
+ $content = $this->file->read(512);
+ $targetFile->write($content, 512);
+ }
+ if (($header['size'] % 512) != 0) {
+ $content = $this->file->read(512);
+ $targetFile->write($content, ($header['size'] % 512));
+ }
+
+ $targetFile->close();
+ if (FileUtil::isApacheModule() || !@$targetFile->is_writable()) {
+ @$targetFile->chmod(0777);
+ }
+ else {
+ @$targetFile->chmod(0755);
+ }
+
+ if ($header['mtime']) {
+ @$targetFile->touch($header['mtime']);
+ }
+
+ // check filesize
+ if (filesize($destination) != $header['size']) {
+ throw new SystemException("Could not untar file '".$header['filename']."' to '".$destination."'. Maybe disk quota exceeded in folder '".dirname($destination)."'.", 11015);
+ }
+
+ return true;
+ }
+
+ /**
+ * Reads table of contents (TOC) from tar archive.
+ * This does not get the entire to memory but only parts of it.
+ */
+ protected function readContent() {
+ $this->contentList = array();
+ $this->read = true;
+ $i = 0;
+
+ // Read the 512 bytes header
+ while (strlen($binaryData = $this->file->read(512)) != 0) {
+ // read header
+ $header = $this->readHeader($binaryData);
+ if ($header === false) {
+ continue;
+ }
+ $this->contentList[$i] = $header;
+ $this->contentList[$i]['index'] = $i;
+ $i++;
+
+ $this->file->seek($this->file->tell() + (512 * ceil(($header['size'] / 512))));
+ }
+ }
+
+ /**
+ * Unpacks file header for one file entry.
+ *
+ * @param string $binaryData
+ * @return array $fileheader
+ */
+ protected function readHeader($binaryData) {
+ if (strlen($binaryData) != 512) {
+ return false;
+ }
+
+ $header = array();
+ $checksum = 0;
+ // First part of the header
+ for ($i = 0; $i < 148; $i++) {
+ $checksum += ord(substr($binaryData, $i, 1));
+ }
+ // Calculate the checksum
+ // Ignore the checksum value and replace it by ' ' (space)
+ for ($i = 148; $i < 156; $i++) {
+ $checksum += ord(' ');
+ }
+ // Last part of the header
+ for ($i = 156; $i < 512; $i++) {
+ $checksum += ord(substr($binaryData, $i, 1));
+ }
+
+ // Extract the values
+ //$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $binaryData);
+ $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $binaryData);
+
+ // Extract the properties
+ $header['checksum'] = octDec(trim($data['checksum']));
+ if ($header['checksum'] == $checksum) {
+ $header['filename'] = trim($data['filename']);
+ $header['mode'] = octDec(trim($data['mode']));
+ $header['uid'] = octDec(trim($data['uid']));
+ $header['gid'] = octDec(trim($data['gid']));
+ $header['size'] = octDec(trim($data['size']));
+ $header['mtime'] = octDec(trim($data['mtime']));
+ $header['prefix'] = trim($data['prefix']);
+ if ($header['prefix']) {
+ $header['filename'] = $header['prefix'].'/'.$header['filename'];
+ }
+ if (($header['typeflag'] = $data['typeflag']) == '5') {
+ $header['size'] = 0;
+ $header['type'] = 'folder';
+ }
+ else {
+ $header['type'] = 'file';
+ }
+ $header['offset'] = $this->file->tell();
+
+ return $header;
+ }
+ else {
+ return false;
+ }
+ }
+
+ /**
+ * Returns true, if this tar is (g)zipped.
+ *
+ * @return boolean
+ */
+ public function isZipped() {
+ return $this->isZipped;
+ }
}
-<?php\r
-namespace wcf\system\io;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\FileUtil;\r
-\r
-/**\r
- * Creates a tar file archive.\r
- * \r
- * Usage:\r
- * ------\r
- * $tar = new TarWriter('archive.tar', true);\r
- * $tar->add(array('file1', 'file2'));\r
- * $tar->create();\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category Community Framework\r
- */\r
-class TarWriter extends Tar {\r
- protected $mode = 'wb+';\r
- \r
- /**\r
- * Creates a new TarWriter object.\r
- * \r
- * @param string $archiveName\r
- * @param boolean $compress enables gzip compression\r
- */\r
- public function __construct($archiveName, $compress = false) {\r
- $this->archiveName = $archiveName;\r
- $this->isZipped = $compress;\r
- if ($compress) $this->mode = 'wb9'; // set compression level\r
- $this->open();\r
- }\r
- \r
- /**\r
- * Writes the last 0 filled block for end of archive.\r
- */\r
- protected function writeFooter() {\r
- $this->file->write(pack('a512', ''));\r
- }\r
- \r
- /**\r
- * Creates the tar archive.\r
- */\r
- public function create() {\r
- $this->writeFooter();\r
- $this->close();\r
- }\r
- \r
- /**\r
- * Adds a string to the tar archive.\r
- * \r
- * @param string $filename\r
- * @param string $string file content\r
- * @return boolean result\r
- */\r
- public function addString($filename, $string) {\r
- if (empty($filename)) return false;\r
- \r
- $filename = FileUtil::unifyDirSeperator($filename);\r
-\r
- if (!$this->writeHeaderBlock($filename, strlen($string), TIME_NOW, 33279)) {\r
- return false;\r
- }\r
-\r
- $i = 0;\r
- while (($buffer = substr($string, (($i++) * 512), 512)) != '') {\r
- $this->file->write(pack("a512", $buffer));\r
- }\r
-\r
- return true;\r
- }\r
- \r
- /**\r
- * Adds a list of files or directories to the tar archive.\r
- * \r
- * @param mixed $files\r
- * @param string $addDir\r
- * @param string $removeDir\r
- * @return boolean result\r
- */\r
- public function add($files, $addDir = '', $removeDir = '') {\r
- if (!is_array($files)) $files = array($files);\r
- if (!count($files)) return false;\r
- \r
- $result = true;\r
- \r
- // unify dir seperator\r
- $addDir = FileUtil::unifyDirSeperator($addDir);\r
- $removeDir = FileUtil::unifyDirSeperator($removeDir);\r
-\r
- foreach ($files as $filename) {\r
- if (!$result) {\r
- break;\r
- }\r
-\r
- if (!$filename || $filename == $this->archiveName) {\r
- continue;\r
- }\r
-\r
- if (!file_exists($filename)) {\r
- throw new SystemException("Unable to find file '".$filename."'", 11002);\r
- }\r
-\r
- // add file\r
- if (!$this->addFile($filename, $addDir, $removeDir)) {\r
- return false;\r
- }\r
-\r
- // handle directories\r
- if (@is_dir($filename)) {\r
- $handle = opendir($filename);\r
-\r
- while (($dirFile = readdir($handle)) !== false) {\r
- if (($dirFile != '.') && ($dirFile != '..')) {\r
- if ($filename != ".") $dirFile = $filename.'/'.$dirFile;\r
- $result = $this->add($dirFile, $addDir, $removeDir);\r
- }\r
- }\r
- \r
- closedir($handle);\r
- }\r
- }\r
-\r
- return $result;\r
- }\r
-\r
- /**\r
- * Adds a file to the tar archive.\r
- * \r
- * @param string $filename\r
- * @param string $addDir\r
- * @param string $removeDir\r
- * @return boolean result\r
- */\r
- protected function addFile($filename, $addDir, $removeDir) {\r
- $filename = FileUtil::unifyDirSeperator($filename);\r
- $storedFilename = $filename;\r
- if (!empty($removeDir)) $storedFilename = StringUtil::replaceIgnoreCase($removeDir, '', $filename);\r
- if (!empty($addDir)) $storedFilename = $addDir . $storedFilename;\r
- if (is_file($filename)) {\r
- // open file\r
- $file = new File($filename, 'rb');\r
- \r
- // write header\r
- if (!$this->writeFileHeader($filename, $storedFilename)) {\r
- return false;\r
- }\r
- \r
- // write file content\r
- while (($buffer = $file->read(512)) != '') {\r
- $this->file->write(pack('a512', $buffer));\r
- }\r
- \r
- // close file\r
- $file->close();\r
- }\r
- else {\r
- // only directory header\r
- if (!$this->writeFileHeader($filename, $storedFilename)) {\r
- return false;\r
- }\r
- }\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * Writes the file header.\r
- * \r
- * @param string $filename\r
- * @param string $storedFilename\r
- * @return boolean result\r
- */\r
- protected function writeFileHeader($filename, $storedFilename) {\r
- $fileInfo = stat($filename);\r
- $permissions = fileperms($filename);\r
- $mtime = filemtime($filename);\r
- if (@is_dir($filename)) {\r
- $typeFlag = '5';\r
- $size = 0;\r
- }\r
- else {\r
- $typeFlag = '';\r
- clearstatcache();\r
- $size = filesize($filename);\r
- }\r
- \r
- return $this->writeHeaderBlock($storedFilename, $size, $mtime, $permissions, $typeFlag, $fileInfo[4], $fileInfo[5]);\r
- }\r
- \r
- /**\r
- * Writes header block.\r
- * \r
- * @param string $filename\r
- * @param integer $size\r
- * @param integer $mtime\r
- * @param integer $permissions\r
- * @param string $typeFlag\r
- * @param integer $uid\r
- * @param integer $gid\r
- * @return boolean result\r
- */\r
- public function writeHeaderBlock($filename, $size, $mtime = 0, $permissions = 0, $typeFlag = '', $uid = 0, $gid = 0) {\r
- if (strlen($filename) > 99) {\r
- if (!$this->writeLongHeaderBlock($filename)) {\r
- return false;\r
- }\r
- }\r
-\r
- if ($typeFlag == "5") {\r
- $size = sprintf("%11s ", decOct(0));\r
- }\r
- else {\r
- $size = sprintf("%11s ", decOct($size));\r
- }\r
-\r
- $uid = sprintf("%6s ", decOct($uid));\r
- $gid = sprintf("%6s ", decOct($gid));\r
- $permissions = sprintf("%6s ", decOct($permissions));\r
- $mtime = sprintf("%11s", decOct($mtime));\r
-\r
- $binaryDataFirst = pack('a100a8a8a8a12A12', $filename, $permissions, $uid, $gid, $size, $mtime);\r
- $binaryDataLast = pack('a1a100a6a2a32a32a8a8a155a12', $typeFlag, '', '', '', '', '', '', '', '', '');\r
-\r
- // calculate the checksum\r
- $checksum = 0;\r
- for ($i = 0; $i < 148; $i++) $checksum += ord(substr($binaryDataFirst, $i, 1));\r
- for ($i = 148; $i < 156; $i++) $checksum += ord(' ');\r
- for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($binaryDataLast, $j, 1));\r
- \r
- $this->file->write($binaryDataFirst, 148);\r
- $this->file->write(pack("a8", sprintf("%6s ", decOct($checksum))), 8); // write the checksum\r
- $this->file->write($binaryDataLast, 356);\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * Writes a long header block.\r
- * \r
- * @param string $filename\r
- * @return boolean\r
- */\r
- protected function writeLongHeaderBlock($filename) {\r
- $size = sprintf("%11s ", decOct(strlen($filename)));\r
- $typeFlag = 'L';\r
- $binaryDataFirst = pack("a100a8a8a8a12A12", '././@LongLink', 0, 0, 0, $size, 0);\r
- $binaryDataLast = pack("a1a100a6a2a32a32a8a8a155a12", $typeFlag, '', '', '', '', '', '', '', '', '');\r
-\r
- // calculate the checksum\r
- $checksum = 0;\r
- for ($i = 0; $i < 148; $i++) $checksum += ord(substr($binaryDataFirst, $i, 1));\r
- for ($i = 148; $i < 156; $i++) $checksum += ord(' ');\r
- for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($binaryDataLast, $j, 1));\r
-\r
- $this->file->write($binaryDataFirst, 148);\r
- $this->file->write(pack("a8", sprintf("%6s ", decOct($checksum))), 8); // write the checksum\r
- $this->file->write($binaryDataLast, 356);\r
-\r
- $i = 0;\r
- while (($buffer = substr($filename, (($i++) * 512), 512)) != '') {\r
- $this->file->write(pack("a512", $buffer));\r
- }\r
-\r
- return true;\r
- }\r
+<?php
+namespace wcf\system\io;
+use wcf\system\exception\SystemException;
+use wcf\util\FileUtil;
+
+/**
+ * Creates a tar file archive.
+ *
+ * Usage:
+ * ------
+ * $tar = new TarWriter('archive.tar', true);
+ * $tar->add(array('file1', 'file2'));
+ * $tar->create();
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.io
+ * @category Community Framework
+ */
+class TarWriter extends Tar {
+ protected $mode = 'wb+';
+
+ /**
+ * Creates a new TarWriter object.
+ *
+ * @param string $archiveName
+ * @param boolean $compress enables gzip compression
+ */
+ public function __construct($archiveName, $compress = false) {
+ $this->archiveName = $archiveName;
+ $this->isZipped = $compress;
+ if ($compress) $this->mode = 'wb9'; // set compression level
+ $this->open();
+ }
+
+ /**
+ * Writes the last 0 filled block for end of archive.
+ */
+ protected function writeFooter() {
+ $this->file->write(pack('a512', ''));
+ }
+
+ /**
+ * Creates the tar archive.
+ */
+ public function create() {
+ $this->writeFooter();
+ $this->close();
+ }
+
+ /**
+ * Adds a string to the tar archive.
+ *
+ * @param string $filename
+ * @param string $string file content
+ * @return boolean result
+ */
+ public function addString($filename, $string) {
+ if (empty($filename)) return false;
+
+ $filename = FileUtil::unifyDirSeperator($filename);
+
+ if (!$this->writeHeaderBlock($filename, strlen($string), TIME_NOW, 33279)) {
+ return false;
+ }
+
+ $i = 0;
+ while (($buffer = substr($string, (($i++) * 512), 512)) != '') {
+ $this->file->write(pack("a512", $buffer));
+ }
+
+ return true;
+ }
+
+ /**
+ * Adds a list of files or directories to the tar archive.
+ *
+ * @param mixed $files
+ * @param string $addDir
+ * @param string $removeDir
+ * @return boolean result
+ */
+ public function add($files, $addDir = '', $removeDir = '') {
+ if (!is_array($files)) $files = array($files);
+ if (!count($files)) return false;
+
+ $result = true;
+
+ // unify dir seperator
+ $addDir = FileUtil::unifyDirSeperator($addDir);
+ $removeDir = FileUtil::unifyDirSeperator($removeDir);
+
+ foreach ($files as $filename) {
+ if (!$result) {
+ break;
+ }
+
+ if (!$filename || $filename == $this->archiveName) {
+ continue;
+ }
+
+ if (!file_exists($filename)) {
+ throw new SystemException("Unable to find file '".$filename."'", 11002);
+ }
+
+ // add file
+ if (!$this->addFile($filename, $addDir, $removeDir)) {
+ return false;
+ }
+
+ // handle directories
+ if (@is_dir($filename)) {
+ $handle = opendir($filename);
+
+ while (($dirFile = readdir($handle)) !== false) {
+ if (($dirFile != '.') && ($dirFile != '..')) {
+ if ($filename != ".") $dirFile = $filename.'/'.$dirFile;
+ $result = $this->add($dirFile, $addDir, $removeDir);
+ }
+ }
+
+ closedir($handle);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Adds a file to the tar archive.
+ *
+ * @param string $filename
+ * @param string $addDir
+ * @param string $removeDir
+ * @return boolean result
+ */
+ protected function addFile($filename, $addDir, $removeDir) {
+ $filename = FileUtil::unifyDirSeperator($filename);
+ $storedFilename = $filename;
+ if (!empty($removeDir)) $storedFilename = StringUtil::replaceIgnoreCase($removeDir, '', $filename);
+ if (!empty($addDir)) $storedFilename = $addDir . $storedFilename;
+ if (is_file($filename)) {
+ // open file
+ $file = new File($filename, 'rb');
+
+ // write header
+ if (!$this->writeFileHeader($filename, $storedFilename)) {
+ return false;
+ }
+
+ // write file content
+ while (($buffer = $file->read(512)) != '') {
+ $this->file->write(pack('a512', $buffer));
+ }
+
+ // close file
+ $file->close();
+ }
+ else {
+ // only directory header
+ if (!$this->writeFileHeader($filename, $storedFilename)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Writes the file header.
+ *
+ * @param string $filename
+ * @param string $storedFilename
+ * @return boolean result
+ */
+ protected function writeFileHeader($filename, $storedFilename) {
+ $fileInfo = stat($filename);
+ $permissions = fileperms($filename);
+ $mtime = filemtime($filename);
+ if (@is_dir($filename)) {
+ $typeFlag = '5';
+ $size = 0;
+ }
+ else {
+ $typeFlag = '';
+ clearstatcache();
+ $size = filesize($filename);
+ }
+
+ return $this->writeHeaderBlock($storedFilename, $size, $mtime, $permissions, $typeFlag, $fileInfo[4], $fileInfo[5]);
+ }
+
+ /**
+ * Writes header block.
+ *
+ * @param string $filename
+ * @param integer $size
+ * @param integer $mtime
+ * @param integer $permissions
+ * @param string $typeFlag
+ * @param integer $uid
+ * @param integer $gid
+ * @return boolean result
+ */
+ public function writeHeaderBlock($filename, $size, $mtime = 0, $permissions = 0, $typeFlag = '', $uid = 0, $gid = 0) {
+ if (strlen($filename) > 99) {
+ if (!$this->writeLongHeaderBlock($filename)) {
+ return false;
+ }
+ }
+
+ if ($typeFlag == "5") {
+ $size = sprintf("%11s ", decOct(0));
+ }
+ else {
+ $size = sprintf("%11s ", decOct($size));
+ }
+
+ $uid = sprintf("%6s ", decOct($uid));
+ $gid = sprintf("%6s ", decOct($gid));
+ $permissions = sprintf("%6s ", decOct($permissions));
+ $mtime = sprintf("%11s", decOct($mtime));
+
+ $binaryDataFirst = pack('a100a8a8a8a12A12', $filename, $permissions, $uid, $gid, $size, $mtime);
+ $binaryDataLast = pack('a1a100a6a2a32a32a8a8a155a12', $typeFlag, '', '', '', '', '', '', '', '', '');
+
+ // calculate the checksum
+ $checksum = 0;
+ for ($i = 0; $i < 148; $i++) $checksum += ord(substr($binaryDataFirst, $i, 1));
+ for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
+ for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($binaryDataLast, $j, 1));
+
+ $this->file->write($binaryDataFirst, 148);
+ $this->file->write(pack("a8", sprintf("%6s ", decOct($checksum))), 8); // write the checksum
+ $this->file->write($binaryDataLast, 356);
+
+ return true;
+ }
+
+ /**
+ * Writes a long header block.
+ *
+ * @param string $filename
+ * @return boolean
+ */
+ protected function writeLongHeaderBlock($filename) {
+ $size = sprintf("%11s ", decOct(strlen($filename)));
+ $typeFlag = 'L';
+ $binaryDataFirst = pack("a100a8a8a8a12A12", '././@LongLink', 0, 0, 0, $size, 0);
+ $binaryDataLast = pack("a1a100a6a2a32a32a8a8a155a12", $typeFlag, '', '', '', '', '', '', '', '', '');
+
+ // calculate the checksum
+ $checksum = 0;
+ for ($i = 0; $i < 148; $i++) $checksum += ord(substr($binaryDataFirst, $i, 1));
+ for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
+ for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($binaryDataLast, $j, 1));
+
+ $this->file->write($binaryDataFirst, 148);
+ $this->file->write(pack("a8", sprintf("%6s ", decOct($checksum))), 8); // write the checksum
+ $this->file->write($binaryDataLast, 356);
+
+ $i = 0;
+ while (($buffer = substr($filename, (($i++) * 512), 512)) != '') {
+ $this->file->write(pack("a512", $buffer));
+ }
+
+ return true;
+ }
}
-<?php\r
-namespace wcf\system\io;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Creates a Zip file archive.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.io\r
- * @category Community Framework\r
- */\r
-class ZipWriter {\r
- protected $headers = array();\r
- protected $data = array();\r
- protected $endOfData = "\x50\x4b\x05\x06\x00\x00\x00\x00";\r
- protected $lastOffset = 0;\r
-\r
- /**\r
- * Adds a folder to the Zip archive.\r
- * \r
- * @param string $name dirname\r
- */\r
- public function addDir($name) {\r
- // replace backward slashes with forward slashes in the dirname\r
- $name = StringUtil::replace("\\", "/", $name);\r
-\r
- // construct the general header information for the directory\r
- $header = "\x50\x4b\x03\x04";\r
- $header .= "\x0a\x00\x00\x00";\r
- $header .= "\x00\x00\x00\x00";\r
- $header .= "\x00\x00";\r
-\r
- // construct the directory header specific information\r
- $header .= pack("V", 0);\r
- $header .= pack("V", 0);\r
- $header .= pack("V", 0);\r
- $header .= pack("v", strlen($name));\r
- $header .= pack("v", 0);\r
- $header .= $name;\r
- $header .= pack("V", 0);\r
- $header .= pack("V", 0);\r
- $header .= pack("V", 0);\r
-\r
- // store the complete header information into the $headers array\r
- $this->headers[] = $header;\r
-\r
- // calculate the new offset that will be used the next time a segment is added\r
- $newOffset = strlen(implode('', $this->headers));\r
-\r
- // construct the general header for the central index record\r
- $record = "\x50\x4b\x01\x02";\r
- $record .= "\x00\x00\x0a\x00";\r
- $record .= "\x00\x00\x00\x00";\r
- $record .= "\x00\x00\x00\x00";\r
- $record .= pack("V", 0);\r
- $record .= pack("V", 0);\r
- $record .= pack("V", 0);\r
- $record .= pack("v", strlen($name));\r
- $record .= pack("v", 0);\r
- $record .= pack("v", 0);\r
- $record .= pack("v", 0);\r
- $record .= pack("v", 0);\r
- //$ext = "\x00\x00\x10\x00";\r
- //$ext = "\xff\xff\xff\xff";\r
- $record .= pack("V", 16 );\r
- $record .= pack("V", $this->lastOffset);\r
- $record .= $name;\r
-\r
- // save the central index record in the array $data\r
- $this->data[] = $record;\r
- $this->lastOffset = $newOffset;\r
- }\r
-\r
- /**\r
- * Adds a file to the Zip archive.\r
- * \r
- * @param string $data content of the file\r
- * @param string $name filename\r
- * @param integer $date file creation time as unix timestamp\r
- */\r
- public function addFile($data, $name, $date = 0) {\r
- // replace backward slashes with forward slashes in the filename\r
- $name = StringUtil::replace("\\", "/", $name);\r
- \r
- // calculate the size of the file being uncompressed\r
- $sizeUncompressed = strlen($data);\r
- \r
- // get data checksum\r
- $crc = crc32($data);\r
- \r
- // compress the file data\r
- $compressedData = gzcompress($data);\r
- \r
- // calculate the size of the file being compressed\r
- $compressedData = substr($compressedData, 2, - 4);\r
- $sizeCompressed = strlen($compressedData);\r
-\r
- // construct the general header for the file record complete with checksum information, etc.\r
- $header = "\x50\x4b\x03\x04";\r
- $header .= "\x14\x00\x00\x00";\r
- $header .= "\x08\x00\x00\x00";\r
- $header .= "\x00\x00";\r
- $header .= pack("V", $crc);\r
- $header .= pack("V", $sizeCompressed);\r
- $header .= pack("V", $sizeUncompressed);\r
- $header .= pack("v", strlen($name));\r
- $header .= pack("v", 0);\r
- $header .= $name;\r
- \r
- // store the compressed data immediately following the file header\r
- $header .= $compressedData;\r
- \r
- // complete the file record by adding an additional footer directly following the file data\r
- //$header .= pack("V", $crc);\r
- //$header .= pack("V", $sizeCompressed);\r
- //$header .= pack("V", $sizeUncompressed);\r
-\r
- // store the completed file record in the $headers array\r
- $this->headers[] = $header;\r
-\r
- // calculate the new offset for the central index record\r
- $newOffset = strlen(implode('', $this->headers));\r
- \r
- // construct the record\r
- $record = "\x50\x4b\x01\x02";\r
- $record .= "\x00\x00\x14\x00";\r
- $record .= "\x00\x00\x08\x00";\r
- $record .= $this->getDosDatetime($date);\r
- $record .= pack("V", $crc);\r
- $record .= pack("V", $sizeCompressed);\r
- $record .= pack("V", $sizeUncompressed);\r
- $record .= pack("v", strlen($name));\r
- $record .= pack("v", 0);\r
- $record .= pack("v", 0);\r
- $record .= pack("v", 0);\r
- $record .= pack("v", 0);\r
- $record .= pack("V", 32);\r
- $record .= pack("V", $this->lastOffset);\r
-\r
- // update the offset for the next record to be stored\r
- $this->lastOffset = $newOffset;\r
-\r
- $record .= $name;\r
-\r
- // store the record in the $data array\r
- $this->data[] = $record;\r
- }\r
-\r
- /**\r
- * Constructs the final Zip file structure and return it.\r
- * \r
- * @return string\r
- */\r
- public function getFile() {\r
- // implode the $headers array into a single string\r
- $headers = implode('', $this->headers);\r
- \r
- // implode the $data array into a single string\r
- $data = implode('', $this->data);\r
-\r
- // construct the final Zip file structure and return it\r
- return\r
- $headers.\r
- $data.\r
- $this->endOfData.\r
- pack("v", sizeof($this->data)).\r
- pack("v", sizeof($this->data)).\r
- pack("V", strlen($data)).\r
- pack("V", strlen($headers)).\r
- "\x00\x00";\r
- }\r
- \r
- /**\r
- * Converts an unix timestamp to Zip file time.\r
- * \r
- * @param integer $date unix timestamp\r
- * @return string\r
- */\r
- protected static function getDosDatetime($date = 0) {\r
- $day = gmdate('d', $date);\r
- $month = gmdate('m', $date);\r
- $year = gmdate('Y', $date);\r
- $year -= 1980;\r
- $hour = gmdate('H', $date);\r
- $minute = gmdate('i', $date);\r
- $second = gmdate('s', $date);\r
- \r
- // calculate time\r
- $time = $hour;\r
- $time = ($time << 6) + $minute;\r
- $time = ($time << 5) + number_format($second / 2, 0);\r
- $timeRight = $time >> 8;\r
- $timeLeft = $time - ($timeRight << 8);\r
- \r
- // calculate date\r
- $date = $year;\r
- $date = ($date << 4) + $month;\r
- $date = ($date << 5) + $day;\r
- $dateRight = $date >> 8;\r
- $dateLeft = $date - ($dateRight << 8);\r
- \r
- $timeLeft = sprintf("%02x", $timeLeft);\r
- $timeRight = sprintf("%02x", $timeRight);\r
- $dateLeft = sprintf("%02x", $dateLeft);\r
- $dateRight = sprintf("%02x", $dateRight);\r
- \r
- return pack("H*H*H*H*", $timeLeft, $timeRight, $dateLeft, $dateRight);\r
- }\r
+<?php
+namespace wcf\system\io;
+use wcf\util\StringUtil;
+
+/**
+ * Creates a Zip file archive.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.io
+ * @category Community Framework
+ */
+class ZipWriter {
+ protected $headers = array();
+ protected $data = array();
+ protected $endOfData = "\x50\x4b\x05\x06\x00\x00\x00\x00";
+ protected $lastOffset = 0;
+
+ /**
+ * Adds a folder to the Zip archive.
+ *
+ * @param string $name dirname
+ */
+ public function addDir($name) {
+ // replace backward slashes with forward slashes in the dirname
+ $name = StringUtil::replace("\\", "/", $name);
+
+ // construct the general header information for the directory
+ $header = "\x50\x4b\x03\x04";
+ $header .= "\x0a\x00\x00\x00";
+ $header .= "\x00\x00\x00\x00";
+ $header .= "\x00\x00";
+
+ // construct the directory header specific information
+ $header .= pack("V", 0);
+ $header .= pack("V", 0);
+ $header .= pack("V", 0);
+ $header .= pack("v", strlen($name));
+ $header .= pack("v", 0);
+ $header .= $name;
+ $header .= pack("V", 0);
+ $header .= pack("V", 0);
+ $header .= pack("V", 0);
+
+ // store the complete header information into the $headers array
+ $this->headers[] = $header;
+
+ // calculate the new offset that will be used the next time a segment is added
+ $newOffset = strlen(implode('', $this->headers));
+
+ // construct the general header for the central index record
+ $record = "\x50\x4b\x01\x02";
+ $record .= "\x00\x00\x0a\x00";
+ $record .= "\x00\x00\x00\x00";
+ $record .= "\x00\x00\x00\x00";
+ $record .= pack("V", 0);
+ $record .= pack("V", 0);
+ $record .= pack("V", 0);
+ $record .= pack("v", strlen($name));
+ $record .= pack("v", 0);
+ $record .= pack("v", 0);
+ $record .= pack("v", 0);
+ $record .= pack("v", 0);
+ //$ext = "\x00\x00\x10\x00";
+ //$ext = "\xff\xff\xff\xff";
+ $record .= pack("V", 16 );
+ $record .= pack("V", $this->lastOffset);
+ $record .= $name;
+
+ // save the central index record in the array $data
+ $this->data[] = $record;
+ $this->lastOffset = $newOffset;
+ }
+
+ /**
+ * Adds a file to the Zip archive.
+ *
+ * @param string $data content of the file
+ * @param string $name filename
+ * @param integer $date file creation time as unix timestamp
+ */
+ public function addFile($data, $name, $date = 0) {
+ // replace backward slashes with forward slashes in the filename
+ $name = StringUtil::replace("\\", "/", $name);
+
+ // calculate the size of the file being uncompressed
+ $sizeUncompressed = strlen($data);
+
+ // get data checksum
+ $crc = crc32($data);
+
+ // compress the file data
+ $compressedData = gzcompress($data);
+
+ // calculate the size of the file being compressed
+ $compressedData = substr($compressedData, 2, - 4);
+ $sizeCompressed = strlen($compressedData);
+
+ // construct the general header for the file record complete with checksum information, etc.
+ $header = "\x50\x4b\x03\x04";
+ $header .= "\x14\x00\x00\x00";
+ $header .= "\x08\x00\x00\x00";
+ $header .= "\x00\x00";
+ $header .= pack("V", $crc);
+ $header .= pack("V", $sizeCompressed);
+ $header .= pack("V", $sizeUncompressed);
+ $header .= pack("v", strlen($name));
+ $header .= pack("v", 0);
+ $header .= $name;
+
+ // store the compressed data immediately following the file header
+ $header .= $compressedData;
+
+ // complete the file record by adding an additional footer directly following the file data
+ //$header .= pack("V", $crc);
+ //$header .= pack("V", $sizeCompressed);
+ //$header .= pack("V", $sizeUncompressed);
+
+ // store the completed file record in the $headers array
+ $this->headers[] = $header;
+
+ // calculate the new offset for the central index record
+ $newOffset = strlen(implode('', $this->headers));
+
+ // construct the record
+ $record = "\x50\x4b\x01\x02";
+ $record .= "\x00\x00\x14\x00";
+ $record .= "\x00\x00\x08\x00";
+ $record .= $this->getDosDatetime($date);
+ $record .= pack("V", $crc);
+ $record .= pack("V", $sizeCompressed);
+ $record .= pack("V", $sizeUncompressed);
+ $record .= pack("v", strlen($name));
+ $record .= pack("v", 0);
+ $record .= pack("v", 0);
+ $record .= pack("v", 0);
+ $record .= pack("v", 0);
+ $record .= pack("V", 32);
+ $record .= pack("V", $this->lastOffset);
+
+ // update the offset for the next record to be stored
+ $this->lastOffset = $newOffset;
+
+ $record .= $name;
+
+ // store the record in the $data array
+ $this->data[] = $record;
+ }
+
+ /**
+ * Constructs the final Zip file structure and return it.
+ *
+ * @return string
+ */
+ public function getFile() {
+ // implode the $headers array into a single string
+ $headers = implode('', $this->headers);
+
+ // implode the $data array into a single string
+ $data = implode('', $this->data);
+
+ // construct the final Zip file structure and return it
+ return
+ $headers.
+ $data.
+ $this->endOfData.
+ pack("v", sizeof($this->data)).
+ pack("v", sizeof($this->data)).
+ pack("V", strlen($data)).
+ pack("V", strlen($headers)).
+ "\x00\x00";
+ }
+
+ /**
+ * Converts an unix timestamp to Zip file time.
+ *
+ * @param integer $date unix timestamp
+ * @return string
+ */
+ protected static function getDosDatetime($date = 0) {
+ $day = gmdate('d', $date);
+ $month = gmdate('m', $date);
+ $year = gmdate('Y', $date);
+ $year -= 1980;
+ $hour = gmdate('H', $date);
+ $minute = gmdate('i', $date);
+ $second = gmdate('s', $date);
+
+ // calculate time
+ $time = $hour;
+ $time = ($time << 6) + $minute;
+ $time = ($time << 5) + number_format($second / 2, 0);
+ $timeRight = $time >> 8;
+ $timeLeft = $time - ($timeRight << 8);
+
+ // calculate date
+ $date = $year;
+ $date = ($date << 4) + $month;
+ $date = ($date << 5) + $day;
+ $dateRight = $date >> 8;
+ $dateLeft = $date - ($dateRight << 8);
+
+ $timeLeft = sprintf("%02x", $timeLeft);
+ $timeRight = sprintf("%02x", $timeRight);
+ $dateLeft = sprintf("%02x", $dateLeft);
+ $dateRight = sprintf("%02x", $dateRight);
+
+ return pack("H*H*H*H*", $timeLeft, $timeRight, $dateLeft, $dateRight);
+ }
}
-<?php\r
-namespace wcf\system\mail;\r
-use wcf\sytem\io\File;\r
-\r
-/**\r
- * DebugMailSender is a debug implementation of mailsender.\r
- * It writes e-mails in a log file.\r
- * \r
- * @author Michael Schaefer\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category Community Framework\r
- */\r
-class DebugMailSender extends MailSender {\r
- protected $log = null;\r
- \r
- /**\r
- * Writes the given e-mail in a log file.\r
- * \r
- * @param Mail $mail\r
- */\r
- public function sendMail(Mail $mail) {\r
- if ($this->log === null) {\r
- $this->log = new File(MAIL_DEBUG_LOGFILE_PATH.'mail.log', 'ab');\r
- }\r
- \r
- $this->log->write($this->printMail($mail));\r
- }\r
- \r
- /**\r
- * Prints the given mail.\r
- * \r
- * @param Mail $mail\r
- * @return string\r
- */\r
- protected static function printMail(Mail $mail) {\r
- return "Date: ".gmdate('r')."\n".\r
- "To: ".$mail->getToString()."\n".\r
- "Subject: ".$mail->getSubject()."\n".\r
- $mail->getHeader()."\n".\r
- "Attachments: ".print_r($mail->getAttachments(), true)."\n\n".\r
- $mail->getMessage()."\n\n";\r
- }\r
+<?php
+namespace wcf\system\mail;
+use wcf\sytem\io\File;
+
+/**
+ * DebugMailSender is a debug implementation of mailsender.
+ * It writes e-mails in a log file.
+ *
+ * @author Michael Schaefer
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.mail
+ * @category Community Framework
+ */
+class DebugMailSender extends MailSender {
+ protected $log = null;
+
+ /**
+ * Writes the given e-mail in a log file.
+ *
+ * @param Mail $mail
+ */
+ public function sendMail(Mail $mail) {
+ if ($this->log === null) {
+ $this->log = new File(MAIL_DEBUG_LOGFILE_PATH.'mail.log', 'ab');
+ }
+
+ $this->log->write($this->printMail($mail));
+ }
+
+ /**
+ * Prints the given mail.
+ *
+ * @param Mail $mail
+ * @return string
+ */
+ protected static function printMail(Mail $mail) {
+ return "Date: ".gmdate('r')."\n".
+ "To: ".$mail->getToString()."\n".
+ "Subject: ".$mail->getSubject()."\n".
+ $mail->getHeader()."\n".
+ "Attachments: ".print_r($mail->getAttachments(), true)."\n\n".
+ $mail->getMessage()."\n\n";
+ }
}
-<?php\r
-namespace wcf\system\mail;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * This class represents an e-mail.\r
- * \r
- * @author Michael Schaefer\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category Community Framework\r
- */\r
-class Mail {\r
- protected $header = '';\r
- protected $boundary;\r
- protected $contentType = "text/plain";\r
- protected $to;\r
- protected $subject;\r
- protected $message;\r
- protected $from;\r
- protected $cc;\r
- protected $bcc;\r
- protected $attachments = array();\r
- protected $priority;\r
- protected $body;\r
- \r
- public static $crlf = "\n";\r
-\r
- /**\r
- * Creates a new Mail object.\r
- * \r
- * @param string $to\r
- * @param string $subject\r
- * @param string $message\r
- * @param string $from\r
- * @param string $cc\r
- * @param string $bcc\r
- * @param array $attachments\r
- * @param integer $priority\r
- * @param string $header\r
- */\r
- public function __construct($to = '', $subject = '', $message = '', $from = '', $cc = '', $bcc = '', $attachments = array(), $priority = '', $header = '') {\r
- $this->setBoundary();\r
- \r
- if (empty($from)) $from = array(MAIL_FROM_NAME => MAIL_FROM_ADDRESS);\r
- if (empty($priority)) $priority = 3;\r
- \r
- $this->setFrom($from);\r
- $this->setSubject($subject);\r
- $this->setMessage($message);\r
- $this->setPriority($priority);\r
- $this->setHeader($header);\r
- \r
- if (!empty($to)) $this->addTo($to);\r
- if (!empty($cc)) $this->addCC($cc);\r
- if (!empty($bcc)) $this->addBCC($bcc);\r
- \r
- if (count($attachments) > 0) $this->setAttachments($attachments);\r
- }\r
- \r
- /**\r
- * Creates a Basic Header for the Mail\r
- * Returns this Header to the function which invoke this class\r
- * \r
- * @return string mail header\r
- */\r
- public function getHeader() {\r
- if (!empty($this->header)) {\r
- $this->header = preg_replace('%(\r\n|\r|\n)%', self::$crlf, $this->header);\r
- }\r
- \r
- $this->header .=\r
- 'X-Priority: 3'.self::$crlf\r
- .'X-Mailer: WoltLab Community Framework Mail Package'.self::$crlf \r
- .'MIME-Version: 1.0'.self::$crlf\r
- .'From: '.$this->getFrom().self::$crlf\r
- .($this->getCCString() != '' ? 'CC:'.$this->getCCString().self::$crlf : '')\r
- .($this->getBCCString() != '' ? 'BCC:'.$this->getBCCString().self::$crlf : ''); \r
- \r
- if (count($this->getAttachments())) {\r
- $this->header .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;\r
- $this->header .= 'Content-Type: multipart/mixed;'.self::$crlf;\r
- $this->header .= "\tboundary=".'"'.$this->getBoundary().'";'.self::$crlf;\r
- }\r
- else {\r
- $this->header .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;\r
- $this->header .= 'Content-Type: '.$this->getContentType().'; charset=UTF-8'.self::$crlf;\r
- }\r
- \r
- return $this->header;\r
- }\r
- \r
- /**\r
- * Creates the Recipients List (To, CC, BCC) \r
- * Returns this List to the function which invoke this class\r
- * \r
- * @param boolean $withTo\r
- * @return string\r
- */\r
- public function getRecipients($withTo = false) {\r
- $recipients = '';\r
- if ($withTo && $this->getToString() != '') $recipients .= 'TO:'.$this->getToString().self::$crlf;\r
- if ($this->getCCString() != '') $recipients .= 'CC:'.$this->getCCString().self::$crlf;\r
- if ($this->getBCCString() != '') $recipients .= 'BCC:'.$this->getBCCString().self::$crlf;\r
- return $recipients; \r
- }\r
- \r
- /**\r
- * Creates the Body (Message, Attachments) for the Mail\r
- * Returns the created Body to the function which invoke this class\r
- * \r
- * @return string mail body\r
- */\r
- public function getBody() {\r
- $counter = 1;\r
- $this->body = '';\r
-\r
- if (count($this->getAttachments())) {\r
- // add message\r
- $this->body .= '--'.$this->getBoundary().self::$crlf;\r
- $this->body .= 'Content-Type: '.$this->getContentType().'; charset="UTF-8"'.self::$crlf;\r
- $this->body .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;\r
- //$this->body .= self::$crlf.self::$crlf;\r
- $this->body .= self::$crlf;\r
- \r
- // wrap lines after 70 characters\r
- $this->body .= wordwrap($this->getMessage(), 70); \r
- $this->body .= self::$crlf.self::$crlf;\r
- $this->body .= '--'.$this->getBoundary().self::$crlf;\r
- \r
- // add attachments\r
- foreach ($this->getAttachments() as $attachment) {\r
- $fileName = $attachment['name'];\r
- $path = $attachment['path'];\r
- \r
- // download file\r
- if (FileUtil::isURL($path)) {\r
- $tmpPath = FileUtil::getTemporaryFilename('mailAttachment_');\r
- if (!@copy($path, $tmpPath)) continue;\r
- $path = $tmpPath;\r
- }\r
- \r
- // get file contents\r
- $data = @file_get_contents($path);\r
- $data = chunk_split(base64_encode($data), 70, self::$crlf); \r
- \r
- $this->body .= 'Content-Type: application/octetstream; name="'.$fileName.'"'.self::$crlf;\r
- $this->body .= 'Content-Transfer-Encoding: base64'.self::$crlf;\r
- $this->body .= 'Content-Disposition: attachment; filename="'.$fileName.'"'.self::$crlf.self::$crlf;\r
- $this->body .= $data.self::$crlf.self::$crlf;\r
- \r
- if ($counter < count($this->getAttachments())) $this->body .= '--'.$this->getBoundary().self::$crlf;\r
- $counter++;\r
- }\r
- \r
- $this->body .= self::$crlf.'--'.$this->getBoundary().'--';\r
- }\r
- else {\r
- //$this->body .= self::$crlf;\r
- $this->body .= $this->getMessage();\r
- }\r
- return $this->body;\r
- }\r
- \r
- /**\r
- * Builds a formatted address: "$name" <$email>\r
- * \r
- * @param string $name\r
- * @param string $email\r
- * @param boolean $encodeName\r
- * @return string\r
- */\r
- public static function buildAddress($name, $email, $encodeName = true) {\r
- if (!empty($name) && MAIL_USE_FORMATTED_ADDRESS) {\r
- if ($encodeName) $name = Mail::encodeMIMEHeader($name);\r
- if (!preg_match('/^[a-z0-9 ]*$/i', $name)) return '"'.str_replace('"', '\"', $name).'" <'.$email.'>';\r
- else return $name . ' <'.$email.'>';\r
- }\r
- return $email;\r
- }\r
-\r
- /**\r
- * Sends this mail.\r
- */\r
- public function send() {\r
- MailSender::getInstance()->sendMail($this);\r
- }\r
- \r
- /**\r
- * Sets the recpients of this mail.\r
- * \r
- * @param mixed $to\r
- */\r
- public function addTo($to) {\r
- if (is_array($to)) {\r
- foreach ($to as $name => $recipient) {\r
- $this->to[] = self::buildAddress($name, $recipient);\r
- }\r
- }\r
- else {\r
- $this->to[] = $to;\r
- }\r
- }\r
- \r
- /**\r
- * Returns the recipients of this mail.\r
- * \r
- * @return mixed\r
- */\r
- public function getTo() {\r
- return $this->to;\r
- }\r
- \r
- /**\r
- * Returns the list of recipients.\r
- * \r
- * @return string\r
- */\r
- public function getToString() {\r
- if (!empty($this->to)) return implode(', ', $this->to);\r
- else return '';\r
- }\r
- \r
- /**\r
- * Sets the subject of this mail.\r
- * \r
- * @param string $subject\r
- */\r
- public function setSubject($subject) {\r
- $this->subject = $subject;\r
- }\r
- \r
- /**\r
- * Returns the subject of this mail.\r
- * \r
- * @return string\r
- */\r
- public function getSubject() {\r
- return $this->subject;\r
- }\r
- \r
- /**\r
- * Sets the message of this mail.\r
- * \r
- * @param string $message\r
- */\r
- public function setMessage($message) {\r
- $this->message = $message;\r
- }\r
- \r
- /**\r
- * Returns the message of this mail.\r
- * \r
- * @return string\r
- */\r
- public function getMessage() {\r
- return preg_replace('%(\r\n|\r|\n)%', self::$crlf, $this->message . (MAIL_SIGNATURE ? self::$crlf . self::$crlf . MAIL_SIGNATURE : ''));\r
- }\r
- \r
- /**\r
- * Sets the sender of this mail.\r
- * \r
- * @param mixed $from\r
- */\r
- public function setFrom($from) {\r
- if (is_array($from)) {\r
- $this->from = self::buildAddress(key($from), current($from), false);\r
- }\r
- else {\r
- $this->from = $from;\r
- }\r
- }\r
- \r
- /**\r
- * Gets the sender of this mail.\r
- * \r
- * @return mixed\r
- */\r
- public function getFrom() {\r
- return $this->from;\r
- }\r
- \r
- /**\r
- * Sets the carbon copy recipients of this mail.\r
- * \r
- * @param mixed $cc\r
- */\r
- public function addCC($cc) {\r
- if (is_array($cc)) {\r
- foreach ($cc as $name => $recipient) {\r
- $this->cc[] = self::buildAddress($name, $recipient);\r
- }\r
- }\r
- else {\r
- $this->cc[] = $cc;\r
- }\r
- }\r
- \r
- /**\r
- * Returns the carbon copy recipients of this mail.\r
- * \r
- * @return mixed\r
- */\r
- public function getCC() {\r
- return $this->cc;\r
- }\r
- \r
- /**\r
- * Returns the carbon copy recipients of this mail as String.\r
- * \r
- * @return string\r
- */\r
- public function getCCString() {\r
- if (!empty($this->cc)) return implode(', ', $this->cc);\r
- else return '';\r
- }\r
- \r
- /**\r
- * Sets the blind carbon copy recipients of this mail.\r
- * \r
- * @param mixed $bcc\r
- */\r
- public function addBCC($bcc) {\r
- if (is_array($bcc)) {\r
- foreach ($bcc as $name => $recipient) {\r
- $this->bcc[] = self::buildAddress($name, $recipient);\r
- }\r
- }\r
- else {\r
- $this->bcc[] = $bcc;\r
- }\r
- }\r
- \r
- /**\r
- * Returns the blind carbon copy recipients of this mail.\r
- * \r
- * @return mixed\r
- */\r
- public function getBCC() {\r
- return $this->bcc;\r
- }\r
- \r
- /**\r
- * Returns the blind carbon copy recipients of this mail as String.\r
- * \r
- * @return string\r
- */\r
- public function getBCCString() {\r
- if (!empty($this->bcc)) return implode(', ', $this->bcc);\r
- else return '';\r
- }\r
- \r
- /**\r
- * Sets the attachments of this mail.\r
- * \r
- * @param array $attachments\r
- */\r
- public function setAttachments($attachments) {\r
- $this->attachments = $attachments;\r
- }\r
- \r
- /**\r
- * Returns the attachments of this mail.\r
- * \r
- * @return array\r
- */\r
- public function getAttachments() {\r
- return $this->attachments;\r
- }\r
- \r
- /**\r
- * Adds an attachment to this mail.\r
- * \r
- * @param string $path\r
- */\r
- public function addAttachment($path) {\r
- $this->attachments[] = array('path' => $path, 'name' => basename($path));\r
- }\r
- \r
- /**\r
- * Sets the Priority of the Mail; Default = 3\r
- * \r
- * @param integer $priority\r
- */\r
- public function setPriority($priority) {\r
- $this->priority = $priority;\r
- }\r
- \r
- /**\r
- * Returns the Priority of the Mail\r
- * \r
- * @return integer\r
- */\r
- public function getPriority() {\r
- return $this->priority;\r
- }\r
- \r
- /**\r
- * Creates a boundary for mutlipart/mixed Mail \r
- */\r
- protected function setBoundary() {\r
- $this->boundary = "==Multipart_Boundary_x".StringUtil::getRandomID()."x";\r
- }\r
- \r
- /**\r
- * Returns the created Boundary\r
- * \r
- * @return string\r
- */\r
- protected function getBoundary() {\r
- return $this->boundary;\r
- }\r
- \r
- /**\r
- * Returns the Content Type\r
- * \r
- * @return string\r
- */\r
- public function getContentType() {\r
- return $this->contentType;\r
- }\r
- \r
- /**\r
- * Sets the content type.\r
- * \r
- * @param string $contentType\r
- */\r
- public function setContentType($contentType) {\r
- $this->contentType = $contentType;\r
- }\r
- \r
- /**\r
- * Sets additional headers\r
- * \r
- * @param string $header\r
- */\r
- public function setHeader($header) {\r
- if (!empty($header)) {\r
- $this->header .= $header.self::$crlf;\r
- }\r
- }\r
- \r
- /**\r
- * Encodes string for MIME header.\r
- */\r
- public static function encodeMIMEHeader($string) {\r
- if (function_exists('mb_encode_mimeheader')) {\r
- $string = mb_encode_mimeheader($string, 'UTF-8', 'Q', Mail::$crlf);\r
- }\r
- else {\r
- $string = '=?UTF-8?Q?'.preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%", "=", str_replace("%0D%0A", "\r\n", str_replace("%20", " ", rawurlencode($string))))).'?=';\r
- }\r
- \r
- return $string;\r
- }\r
+<?php
+namespace wcf\system\mail;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+
+/**
+ * This class represents an e-mail.
+ *
+ * @author Michael Schaefer
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.mail
+ * @category Community Framework
+ */
+class Mail {
+ protected $header = '';
+ protected $boundary;
+ protected $contentType = "text/plain";
+ protected $to;
+ protected $subject;
+ protected $message;
+ protected $from;
+ protected $cc;
+ protected $bcc;
+ protected $attachments = array();
+ protected $priority;
+ protected $body;
+
+ public static $crlf = "\n";
+
+ /**
+ * Creates a new Mail object.
+ *
+ * @param string $to
+ * @param string $subject
+ * @param string $message
+ * @param string $from
+ * @param string $cc
+ * @param string $bcc
+ * @param array $attachments
+ * @param integer $priority
+ * @param string $header
+ */
+ public function __construct($to = '', $subject = '', $message = '', $from = '', $cc = '', $bcc = '', $attachments = array(), $priority = '', $header = '') {
+ $this->setBoundary();
+
+ if (empty($from)) $from = array(MAIL_FROM_NAME => MAIL_FROM_ADDRESS);
+ if (empty($priority)) $priority = 3;
+
+ $this->setFrom($from);
+ $this->setSubject($subject);
+ $this->setMessage($message);
+ $this->setPriority($priority);
+ $this->setHeader($header);
+
+ if (!empty($to)) $this->addTo($to);
+ if (!empty($cc)) $this->addCC($cc);
+ if (!empty($bcc)) $this->addBCC($bcc);
+
+ if (count($attachments) > 0) $this->setAttachments($attachments);
+ }
+
+ /**
+ * Creates a Basic Header for the Mail
+ * Returns this Header to the function which invoke this class
+ *
+ * @return string mail header
+ */
+ public function getHeader() {
+ if (!empty($this->header)) {
+ $this->header = preg_replace('%(\r\n|\r|\n)%', self::$crlf, $this->header);
+ }
+
+ $this->header .=
+ 'X-Priority: 3'.self::$crlf
+ .'X-Mailer: WoltLab Community Framework Mail Package'.self::$crlf
+ .'MIME-Version: 1.0'.self::$crlf
+ .'From: '.$this->getFrom().self::$crlf
+ .($this->getCCString() != '' ? 'CC:'.$this->getCCString().self::$crlf : '')
+ .($this->getBCCString() != '' ? 'BCC:'.$this->getBCCString().self::$crlf : '');
+
+ if (count($this->getAttachments())) {
+ $this->header .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;
+ $this->header .= 'Content-Type: multipart/mixed;'.self::$crlf;
+ $this->header .= "\tboundary=".'"'.$this->getBoundary().'";'.self::$crlf;
+ }
+ else {
+ $this->header .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;
+ $this->header .= 'Content-Type: '.$this->getContentType().'; charset=UTF-8'.self::$crlf;
+ }
+
+ return $this->header;
+ }
+
+ /**
+ * Creates the Recipients List (To, CC, BCC)
+ * Returns this List to the function which invoke this class
+ *
+ * @param boolean $withTo
+ * @return string
+ */
+ public function getRecipients($withTo = false) {
+ $recipients = '';
+ if ($withTo && $this->getToString() != '') $recipients .= 'TO:'.$this->getToString().self::$crlf;
+ if ($this->getCCString() != '') $recipients .= 'CC:'.$this->getCCString().self::$crlf;
+ if ($this->getBCCString() != '') $recipients .= 'BCC:'.$this->getBCCString().self::$crlf;
+ return $recipients;
+ }
+
+ /**
+ * Creates the Body (Message, Attachments) for the Mail
+ * Returns the created Body to the function which invoke this class
+ *
+ * @return string mail body
+ */
+ public function getBody() {
+ $counter = 1;
+ $this->body = '';
+
+ if (count($this->getAttachments())) {
+ // add message
+ $this->body .= '--'.$this->getBoundary().self::$crlf;
+ $this->body .= 'Content-Type: '.$this->getContentType().'; charset="UTF-8"'.self::$crlf;
+ $this->body .= 'Content-Transfer-Encoding: 8bit'.self::$crlf;
+ //$this->body .= self::$crlf.self::$crlf;
+ $this->body .= self::$crlf;
+
+ // wrap lines after 70 characters
+ $this->body .= wordwrap($this->getMessage(), 70);
+ $this->body .= self::$crlf.self::$crlf;
+ $this->body .= '--'.$this->getBoundary().self::$crlf;
+
+ // add attachments
+ foreach ($this->getAttachments() as $attachment) {
+ $fileName = $attachment['name'];
+ $path = $attachment['path'];
+
+ // download file
+ if (FileUtil::isURL($path)) {
+ $tmpPath = FileUtil::getTemporaryFilename('mailAttachment_');
+ if (!@copy($path, $tmpPath)) continue;
+ $path = $tmpPath;
+ }
+
+ // get file contents
+ $data = @file_get_contents($path);
+ $data = chunk_split(base64_encode($data), 70, self::$crlf);
+
+ $this->body .= 'Content-Type: application/octetstream; name="'.$fileName.'"'.self::$crlf;
+ $this->body .= 'Content-Transfer-Encoding: base64'.self::$crlf;
+ $this->body .= 'Content-Disposition: attachment; filename="'.$fileName.'"'.self::$crlf.self::$crlf;
+ $this->body .= $data.self::$crlf.self::$crlf;
+
+ if ($counter < count($this->getAttachments())) $this->body .= '--'.$this->getBoundary().self::$crlf;
+ $counter++;
+ }
+
+ $this->body .= self::$crlf.'--'.$this->getBoundary().'--';
+ }
+ else {
+ //$this->body .= self::$crlf;
+ $this->body .= $this->getMessage();
+ }
+ return $this->body;
+ }
+
+ /**
+ * Builds a formatted address: "$name" <$email>
+ *
+ * @param string $name
+ * @param string $email
+ * @param boolean $encodeName
+ * @return string
+ */
+ public static function buildAddress($name, $email, $encodeName = true) {
+ if (!empty($name) && MAIL_USE_FORMATTED_ADDRESS) {
+ if ($encodeName) $name = Mail::encodeMIMEHeader($name);
+ if (!preg_match('/^[a-z0-9 ]*$/i', $name)) return '"'.str_replace('"', '\"', $name).'" <'.$email.'>';
+ else return $name . ' <'.$email.'>';
+ }
+ return $email;
+ }
+
+ /**
+ * Sends this mail.
+ */
+ public function send() {
+ MailSender::getInstance()->sendMail($this);
+ }
+
+ /**
+ * Sets the recpients of this mail.
+ *
+ * @param mixed $to
+ */
+ public function addTo($to) {
+ if (is_array($to)) {
+ foreach ($to as $name => $recipient) {
+ $this->to[] = self::buildAddress($name, $recipient);
+ }
+ }
+ else {
+ $this->to[] = $to;
+ }
+ }
+
+ /**
+ * Returns the recipients of this mail.
+ *
+ * @return mixed
+ */
+ public function getTo() {
+ return $this->to;
+ }
+
+ /**
+ * Returns the list of recipients.
+ *
+ * @return string
+ */
+ public function getToString() {
+ if (!empty($this->to)) return implode(', ', $this->to);
+ else return '';
+ }
+
+ /**
+ * Sets the subject of this mail.
+ *
+ * @param string $subject
+ */
+ public function setSubject($subject) {
+ $this->subject = $subject;
+ }
+
+ /**
+ * Returns the subject of this mail.
+ *
+ * @return string
+ */
+ public function getSubject() {
+ return $this->subject;
+ }
+
+ /**
+ * Sets the message of this mail.
+ *
+ * @param string $message
+ */
+ public function setMessage($message) {
+ $this->message = $message;
+ }
+
+ /**
+ * Returns the message of this mail.
+ *
+ * @return string
+ */
+ public function getMessage() {
+ return preg_replace('%(\r\n|\r|\n)%', self::$crlf, $this->message . (MAIL_SIGNATURE ? self::$crlf . self::$crlf . MAIL_SIGNATURE : ''));
+ }
+
+ /**
+ * Sets the sender of this mail.
+ *
+ * @param mixed $from
+ */
+ public function setFrom($from) {
+ if (is_array($from)) {
+ $this->from = self::buildAddress(key($from), current($from), false);
+ }
+ else {
+ $this->from = $from;
+ }
+ }
+
+ /**
+ * Gets the sender of this mail.
+ *
+ * @return mixed
+ */
+ public function getFrom() {
+ return $this->from;
+ }
+
+ /**
+ * Sets the carbon copy recipients of this mail.
+ *
+ * @param mixed $cc
+ */
+ public function addCC($cc) {
+ if (is_array($cc)) {
+ foreach ($cc as $name => $recipient) {
+ $this->cc[] = self::buildAddress($name, $recipient);
+ }
+ }
+ else {
+ $this->cc[] = $cc;
+ }
+ }
+
+ /**
+ * Returns the carbon copy recipients of this mail.
+ *
+ * @return mixed
+ */
+ public function getCC() {
+ return $this->cc;
+ }
+
+ /**
+ * Returns the carbon copy recipients of this mail as String.
+ *
+ * @return string
+ */
+ public function getCCString() {
+ if (!empty($this->cc)) return implode(', ', $this->cc);
+ else return '';
+ }
+
+ /**
+ * Sets the blind carbon copy recipients of this mail.
+ *
+ * @param mixed $bcc
+ */
+ public function addBCC($bcc) {
+ if (is_array($bcc)) {
+ foreach ($bcc as $name => $recipient) {
+ $this->bcc[] = self::buildAddress($name, $recipient);
+ }
+ }
+ else {
+ $this->bcc[] = $bcc;
+ }
+ }
+
+ /**
+ * Returns the blind carbon copy recipients of this mail.
+ *
+ * @return mixed
+ */
+ public function getBCC() {
+ return $this->bcc;
+ }
+
+ /**
+ * Returns the blind carbon copy recipients of this mail as String.
+ *
+ * @return string
+ */
+ public function getBCCString() {
+ if (!empty($this->bcc)) return implode(', ', $this->bcc);
+ else return '';
+ }
+
+ /**
+ * Sets the attachments of this mail.
+ *
+ * @param array $attachments
+ */
+ public function setAttachments($attachments) {
+ $this->attachments = $attachments;
+ }
+
+ /**
+ * Returns the attachments of this mail.
+ *
+ * @return array
+ */
+ public function getAttachments() {
+ return $this->attachments;
+ }
+
+ /**
+ * Adds an attachment to this mail.
+ *
+ * @param string $path
+ */
+ public function addAttachment($path) {
+ $this->attachments[] = array('path' => $path, 'name' => basename($path));
+ }
+
+ /**
+ * Sets the Priority of the Mail; Default = 3
+ *
+ * @param integer $priority
+ */
+ public function setPriority($priority) {
+ $this->priority = $priority;
+ }
+
+ /**
+ * Returns the Priority of the Mail
+ *
+ * @return integer
+ */
+ public function getPriority() {
+ return $this->priority;
+ }
+
+ /**
+ * Creates a boundary for mutlipart/mixed Mail
+ */
+ protected function setBoundary() {
+ $this->boundary = "==Multipart_Boundary_x".StringUtil::getRandomID()."x";
+ }
+
+ /**
+ * Returns the created Boundary
+ *
+ * @return string
+ */
+ protected function getBoundary() {
+ return $this->boundary;
+ }
+
+ /**
+ * Returns the Content Type
+ *
+ * @return string
+ */
+ public function getContentType() {
+ return $this->contentType;
+ }
+
+ /**
+ * Sets the content type.
+ *
+ * @param string $contentType
+ */
+ public function setContentType($contentType) {
+ $this->contentType = $contentType;
+ }
+
+ /**
+ * Sets additional headers
+ *
+ * @param string $header
+ */
+ public function setHeader($header) {
+ if (!empty($header)) {
+ $this->header .= $header.self::$crlf;
+ }
+ }
+
+ /**
+ * Encodes string for MIME header.
+ */
+ public static function encodeMIMEHeader($string) {
+ if (function_exists('mb_encode_mimeheader')) {
+ $string = mb_encode_mimeheader($string, 'UTF-8', 'Q', Mail::$crlf);
+ }
+ else {
+ $string = '=?UTF-8?Q?'.preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%", "=", str_replace("%0D%0A", "\r\n", str_replace("%20", " ", rawurlencode($string))))).'?=';
+ }
+
+ return $string;
+ }
}
-<?php\r
-namespace wcf\system\mail;\r
-\r
-/**\r
- * Mailsender sends e-mails.\r
- * \r
- * @author Michael Schaefer\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category Community Framework\r
- */\r
-abstract class MailSender {\r
- /**\r
- * unique mail server instance\r
- * @var MailSender\r
- */\r
- protected static $instance = null;\r
- \r
- /**\r
- * Returns the default mail sender.\r
- * \r
- * @return MailSender\r
- */\r
- public static function getInstance() {\r
- if (self::$instance == null) {\r
- switch (MAIL_SEND_METHOD) {\r
- case 'php':\r
- self::$defaultMailSender = new PHPMailSender();\r
- break;\r
- \r
- case 'smtp':\r
- self::$defaultMailSender = new SMTPMailSender();\r
- break;\r
- \r
- case 'debug':\r
- self::$defaultMailSender = new DebugMailSender();\r
- break;\r
- }\r
- }\r
- \r
- return self::$instance;\r
- }\r
- \r
- /**\r
- * Sends an e-mail.\r
- * \r
- * @param Mail $mail\r
- */\r
- public abstract function sendMail(Mail $mail); \r
+<?php
+namespace wcf\system\mail;
+
+/**
+ * Mailsender sends e-mails.
+ *
+ * @author Michael Schaefer
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.mail
+ * @category Community Framework
+ */
+abstract class MailSender {
+ /**
+ * unique mail server instance
+ * @var MailSender
+ */
+ protected static $instance = null;
+
+ /**
+ * Returns the default mail sender.
+ *
+ * @return MailSender
+ */
+ public static function getInstance() {
+ if (self::$instance == null) {
+ switch (MAIL_SEND_METHOD) {
+ case 'php':
+ self::$defaultMailSender = new PHPMailSender();
+ break;
+
+ case 'smtp':
+ self::$defaultMailSender = new SMTPMailSender();
+ break;
+
+ case 'debug':
+ self::$defaultMailSender = new DebugMailSender();
+ break;
+ }
+ }
+
+ return self::$instance;
+ }
+
+ /**
+ * Sends an e-mail.
+ *
+ * @param Mail $mail
+ */
+ public abstract function sendMail(Mail $mail);
}
-<?php\r
-namespace wcf\system\mail;\r
-\r
-/**\r
- * Sends a Mail with the php mail function.\r
- * \r
- * @author Michael Schaefer\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category Community Framework\r
- */\r
-class PHPMailSender extends MailSender {\r
- /**\r
- * @see MailSender::sendMail()\r
- */\r
- public function sendMail(Mail $mail) {\r
- if (MAIL_USE_F_PARAM) return @mb_send_mail($mail->getToString(), $mail->getSubject(), $mail->getBody(), $mail->getHeader(), '-f'.MAIL_FROM_ADDRESS);\r
- else return @mb_send_mail($mail->getToString(), $mail->getSubject(), $mail->getBody(), $mail->getHeader());\r
- }\r
+<?php
+namespace wcf\system\mail;
+
+/**
+ * Sends a Mail with the php mail function.
+ *
+ * @author Michael Schaefer
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.mail
+ * @category Community Framework
+ */
+class PHPMailSender extends MailSender {
+ /**
+ * @see MailSender::sendMail()
+ */
+ public function sendMail(Mail $mail) {
+ if (MAIL_USE_F_PARAM) return @mb_send_mail($mail->getToString(), $mail->getSubject(), $mail->getBody(), $mail->getHeader(), '-f'.MAIL_FROM_ADDRESS);
+ else return @mb_send_mail($mail->getToString(), $mail->getSubject(), $mail->getBody(), $mail->getHeader());
+ }
}
-<?php\r
-namespace wcf\system\mail;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\io\RemoteFile;\r
-\r
-/**\r
- * Sends a Mail with a connection to a smtp server.\r
- * \r
- * @author Michael Schaefer\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage data.mail\r
- * @category Community Framework\r
- */\r
-class SMTPMailSender extends MailSender {\r
- protected $connection = null;\r
- protected $statusCode = '';\r
- protected $statusMsg = '';\r
- protected $recipients;\r
- \r
- /**\r
- * Creates a new SMTPMailSender object.\r
- */\r
- public function __construct() {\r
- Mail::$crlf = "\r\n";\r
- }\r
- \r
- /**\r
- * Destroys the SMTPMailSender object.\r
- */\r
- public function __destruct() {\r
- $this->disconnect();\r
- }\r
-\r
- /**\r
- * Connects to the smtp-server\r
- */\r
- protected function connect() {\r
- // connect\r
- $this->connection = new RemoteFile(MAIL_SMTP_HOST, MAIL_SMTP_PORT);\r
- $this->getSMTPStatus();\r
- if ($this->statusCode != 220) {\r
- throw new SystemException($this->formatError("can not connect to '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."'"), 17000);\r
- }\r
- \r
- // send ehlo\r
- $this->write('EHLO '.$_SERVER['HTTP_HOST']);\r
- $this->getSMTPStatus();\r
- if ($this->statusCode == 250) {\r
- // do authentication\r
- if (MAIL_SMTP_USER != '' || MAIL_SMTP_PASSWORD != '') {\r
- $this->auth();\r
- }\r
- }\r
- else {\r
- // send helo\r
- $this->write('HELO '.$_SERVER['HTTP_HOST']);\r
- $this->getSMTPStatus();\r
- if ($this->statusCode != 250) {\r
- throw new SystemException($this->formatError("can not connect to '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."'"), 17000);\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Formats a smtp error message.\r
- * \r
- * @param string $message\r
- * @return string\r
- */\r
- protected function formatError($message) {\r
- return $message.': '.$this->statusMsg.' ('.$this->statusCode.')';\r
- }\r
- \r
- /**\r
- * Does the Authentification of the Client at the Server\r
- */\r
- protected function auth() {\r
- // Init Authentication\r
- $this->write('AUTH LOGIN');\r
- $this->getSMTPStatus();\r
- \r
- // checks if auth is supported\r
- if ($this->statusCode != 334) {\r
- throw new SystemException($this->formatError("smtp mail server '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."' does not support user authentication"), 17001);\r
- }\r
- \r
- // sending user information to smtp-server\r
- $this->write(base64_encode(MAIL_SMTP_USER));\r
- $this->getSMTPStatus();\r
- if ($this->statusCode != 334) {\r
- throw new SystemException($this->formatError("unknown smtp user '".MAIL_SMTP_USER."'"), 17002);\r
- }\r
- \r
- $this->write(base64_encode(MAIL_SMTP_PASSWORD));\r
- $this->getSMTPStatus();\r
- if ($this->statusCode != 235) {\r
- throw new SystemException($this->formatError("invalid password for smtp user '".MAIL_SMTP_USER."'"), 17003);\r
- }\r
- }\r
- \r
- /**\r
- * @see MailSender::sendMail()\r
- */\r
- public function sendMail(Mail $mail) {\r
- $this->recipients = array();\r
- if (count($mail->getTo()) > 0) $this->recipients = $mail->getTo();\r
- if (count($mail->getCC()) > 0) $this->recipients = array_merge($this->recipients, $mail->getCC());\r
- if (count($mail->getBCC())> 0) $this->recipients = array_merge($this->recipients, $mail->getBCC());\r
- \r
- // apply connection\r
- if ($this->connection === null) {\r
- $this->connect();\r
- }\r
- \r
- // send mail\r
- $this->write('MAIL FROM:<'.$mail->getFrom().'>');\r
- $this->getSMTPStatus();\r
- if ($this->statusCode != 250) {\r
- throw new SystemException($this->formatError("wrong from format '".$mail->getFrom()."'"), 17004);\r
- }\r
- \r
- // recipients\r
- $recipientCounter = 0;\r
- foreach ($this->recipients as $recipient) {\r
- $this->write('RCPT TO:<'.$recipient.'>');\r
- $this->getSMTPStatus();\r
- if ($this->statusCode != 250 && $this->statusCode != 251) {\r
- if ($this->statusCode < 550) {\r
- throw new SystemException($this->formatError("wrong recipient format '".$recipient."'"), 17004);\r
- }\r
- continue;\r
- }\r
- $recipientCounter++;\r
- }\r
- if (!$recipientCounter) {\r
- $this->write("RSET");\r
- return;\r
- }\r
- \r
- // data\r
- $this->write("DATA");\r
- $this->getSMTPStatus();\r
- if ($this->statusCode != 354 && $this->statusCode != 250) {\r
- throw new SystemException($this->formatError("smtp error"), 17005);\r
- }\r
- \r
- $header =\r
- "Date: ".gmdate('r').Mail::$crlf\r
- ."To: ".$mail->getToString().Mail::$crlf\r
- ."Message-ID: <".md5(uniqid())."@".$_SERVER['SERVER_NAME'].">".Mail::$crlf\r
- ."Subject: ".Mail::encodeMIMEHeader($mail->getSubject()).Mail::$crlf\r
- .$mail->getHeader();\r
-\r
- $this->write($header);\r
- $this->write("");\r
- $this->write($mail->getBody());\r
- $this->write(".");\r
- \r
- $this->getSMTPStatus();\r
- if ($this->statusCode != 250) {\r
- throw new SystemException($this->formatError("message sending failed"), 17005);\r
- }\r
- }\r
- \r
- /**\r
- * Disconnects the Client-Server connection\r
- */\r
- function disconnect() {\r
- if ($this->connection === null) {\r
- return;\r
- }\r
-\r
- $this->write("QUIT");\r
- $this->read();\r
- $this->connection->close();\r
- $this->connection = null;\r
- }\r
- \r
- /**\r
- * Reads the Information wich the Server sends back.\r
- * \r
- * @return string\r
- */\r
- protected function read() {\r
- $result = '';\r
- while ($read = $this->connection->gets()) {\r
- $result .= $read;\r
- if (substr($read, 3, 1) == " ") break;\r
- }\r
- return $result; \r
- }\r
- \r
- /**\r
- * Gets error code and message from a server message.\r
- * \r
- * @param string $data\r
- */\r
- protected function getSMTPStatus($data = null) {\r
- if ($data === null) $data = $this->read();\r
- $this->statusCode = intval(substr($data, 0, 3));\r
- $this->statusMsg = substr($data, 4);\r
- }\r
- \r
- /**\r
- * Sends Information to the smtp-Server\r
- * \r
- * @param string $data\r
- */\r
- protected function write($data) {\r
- $this->connection->puts($data.Mail::$crlf);\r
- }\r
+<?php
+namespace wcf\system\mail;
+use wcf\system\exception\SystemException;
+use wcf\system\io\RemoteFile;
+
+/**
+ * Sends a Mail with a connection to a smtp server.
+ *
+ * @author Michael Schaefer
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage data.mail
+ * @category Community Framework
+ */
+class SMTPMailSender extends MailSender {
+ protected $connection = null;
+ protected $statusCode = '';
+ protected $statusMsg = '';
+ protected $recipients;
+
+ /**
+ * Creates a new SMTPMailSender object.
+ */
+ public function __construct() {
+ Mail::$crlf = "\r\n";
+ }
+
+ /**
+ * Destroys the SMTPMailSender object.
+ */
+ public function __destruct() {
+ $this->disconnect();
+ }
+
+ /**
+ * Connects to the smtp-server
+ */
+ protected function connect() {
+ // connect
+ $this->connection = new RemoteFile(MAIL_SMTP_HOST, MAIL_SMTP_PORT);
+ $this->getSMTPStatus();
+ if ($this->statusCode != 220) {
+ throw new SystemException($this->formatError("can not connect to '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."'"), 17000);
+ }
+
+ // send ehlo
+ $this->write('EHLO '.$_SERVER['HTTP_HOST']);
+ $this->getSMTPStatus();
+ if ($this->statusCode == 250) {
+ // do authentication
+ if (MAIL_SMTP_USER != '' || MAIL_SMTP_PASSWORD != '') {
+ $this->auth();
+ }
+ }
+ else {
+ // send helo
+ $this->write('HELO '.$_SERVER['HTTP_HOST']);
+ $this->getSMTPStatus();
+ if ($this->statusCode != 250) {
+ throw new SystemException($this->formatError("can not connect to '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."'"), 17000);
+ }
+ }
+ }
+
+ /**
+ * Formats a smtp error message.
+ *
+ * @param string $message
+ * @return string
+ */
+ protected function formatError($message) {
+ return $message.': '.$this->statusMsg.' ('.$this->statusCode.')';
+ }
+
+ /**
+ * Does the Authentification of the Client at the Server
+ */
+ protected function auth() {
+ // Init Authentication
+ $this->write('AUTH LOGIN');
+ $this->getSMTPStatus();
+
+ // checks if auth is supported
+ if ($this->statusCode != 334) {
+ throw new SystemException($this->formatError("smtp mail server '".MAIL_SMTP_HOST.":".MAIL_SMTP_PORT."' does not support user authentication"), 17001);
+ }
+
+ // sending user information to smtp-server
+ $this->write(base64_encode(MAIL_SMTP_USER));
+ $this->getSMTPStatus();
+ if ($this->statusCode != 334) {
+ throw new SystemException($this->formatError("unknown smtp user '".MAIL_SMTP_USER."'"), 17002);
+ }
+
+ $this->write(base64_encode(MAIL_SMTP_PASSWORD));
+ $this->getSMTPStatus();
+ if ($this->statusCode != 235) {
+ throw new SystemException($this->formatError("invalid password for smtp user '".MAIL_SMTP_USER."'"), 17003);
+ }
+ }
+
+ /**
+ * @see MailSender::sendMail()
+ */
+ public function sendMail(Mail $mail) {
+ $this->recipients = array();
+ if (count($mail->getTo()) > 0) $this->recipients = $mail->getTo();
+ if (count($mail->getCC()) > 0) $this->recipients = array_merge($this->recipients, $mail->getCC());
+ if (count($mail->getBCC())> 0) $this->recipients = array_merge($this->recipients, $mail->getBCC());
+
+ // apply connection
+ if ($this->connection === null) {
+ $this->connect();
+ }
+
+ // send mail
+ $this->write('MAIL FROM:<'.$mail->getFrom().'>');
+ $this->getSMTPStatus();
+ if ($this->statusCode != 250) {
+ throw new SystemException($this->formatError("wrong from format '".$mail->getFrom()."'"), 17004);
+ }
+
+ // recipients
+ $recipientCounter = 0;
+ foreach ($this->recipients as $recipient) {
+ $this->write('RCPT TO:<'.$recipient.'>');
+ $this->getSMTPStatus();
+ if ($this->statusCode != 250 && $this->statusCode != 251) {
+ if ($this->statusCode < 550) {
+ throw new SystemException($this->formatError("wrong recipient format '".$recipient."'"), 17004);
+ }
+ continue;
+ }
+ $recipientCounter++;
+ }
+ if (!$recipientCounter) {
+ $this->write("RSET");
+ return;
+ }
+
+ // data
+ $this->write("DATA");
+ $this->getSMTPStatus();
+ if ($this->statusCode != 354 && $this->statusCode != 250) {
+ throw new SystemException($this->formatError("smtp error"), 17005);
+ }
+
+ $header =
+ "Date: ".gmdate('r').Mail::$crlf
+ ."To: ".$mail->getToString().Mail::$crlf
+ ."Message-ID: <".md5(uniqid())."@".$_SERVER['SERVER_NAME'].">".Mail::$crlf
+ ."Subject: ".Mail::encodeMIMEHeader($mail->getSubject()).Mail::$crlf
+ .$mail->getHeader();
+
+ $this->write($header);
+ $this->write("");
+ $this->write($mail->getBody());
+ $this->write(".");
+
+ $this->getSMTPStatus();
+ if ($this->statusCode != 250) {
+ throw new SystemException($this->formatError("message sending failed"), 17005);
+ }
+ }
+
+ /**
+ * Disconnects the Client-Server connection
+ */
+ function disconnect() {
+ if ($this->connection === null) {
+ return;
+ }
+
+ $this->write("QUIT");
+ $this->read();
+ $this->connection->close();
+ $this->connection = null;
+ }
+
+ /**
+ * Reads the Information wich the Server sends back.
+ *
+ * @return string
+ */
+ protected function read() {
+ $result = '';
+ while ($read = $this->connection->gets()) {
+ $result .= $read;
+ if (substr($read, 3, 1) == " ") break;
+ }
+ return $result;
+ }
+
+ /**
+ * Gets error code and message from a server message.
+ *
+ * @param string $data
+ */
+ protected function getSMTPStatus($data = null) {
+ if ($data === null) $data = $this->read();
+ $this->statusCode = intval(substr($data, 0, 3));
+ $this->statusMsg = substr($data, 4);
+ }
+
+ /**
+ * Sends Information to the smtp-Server
+ *
+ * @param string $data
+ */
+ protected function write($data) {
+ $this->connection->puts($data.Mail::$crlf);
+ }
}
-<?php\r
-namespace wcf\system\menu;\r
-\r
-/**\r
- * Any tree menu item should implement this interface.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.menu\r
- * @category Community Framework\r
- */\r
-interface ITreeMenuItem {\r
- /**\r
- * Returns the link of this item.\r
- * \r
- * @return string\r
- */\r
- public function getLink();\r
+<?php
+namespace wcf\system\menu;
+
+/**
+ * Any tree menu item should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.menu
+ * @category Community Framework
+ */
+interface ITreeMenuItem {
+ /**
+ * Returns the link of this item.
+ *
+ * @return string
+ */
+ public function getLink();
}
-<?php\r
-namespace wcf\system\menu;\r
-use wcf\system\event\EventHandler;\r
-use wcf\system\SingletonFactory;\r
-use wcf\system\WCF;\r
-use wcf\util\FileUtil;\r
-\r
-/**\r
- * Basis class for a tree menu.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.menu\r
- * @category Community Framework\r
- */\r
-abstract class TreeMenu extends SingletonFactory {\r
- /**\r
- * List of visible menu items.\r
- * \r
- * @var array\r
- */\r
- public $menuItemList = array();\r
- \r
- /**\r
- * List of active menu items.\r
- * \r
- * @var array\r
- */\r
- public $activeMenuItems = array();\r
- \r
- /**\r
- * List of all menu items.\r
- * \r
- * @var array\r
- */\r
- public $menuItems = null;\r
-\r
- /**\r
- * @see SingletonFactory::init()\r
- */\r
- protected function init() {\r
- // get menu items from cache\r
- $this->loadCache();\r
- \r
- // check menu items\r
- $this->checkMenuItems();\r
- \r
- // remove items without children\r
- $this->removeEmptyItems();\r
- \r
- // build plain menu item list\r
- $this->buildMenuItemList();\r
- \r
- // call init event\r
- EventHandler::getInstance()->fireAction($this, 'init');\r
- }\r
- \r
- /**\r
- * Loads cached menu items.\r
- */\r
- protected function loadCache() {\r
- // call loadCache event\r
- EventHandler::getInstance()->fireAction($this, 'loadCache');\r
- \r
- $this->menuItems = array();\r
- }\r
- \r
- /**\r
- * Checks the options and permissions of given menu item.\r
- * \r
- * @param wcf\system\menu\ITreeMenuItem $item\r
- * @return boolean\r
- */\r
- protected function checkMenuItem(ITreeMenuItem $item) {\r
- // check the options of this item\r
- $hasEnabledOption = true;\r
- if (!empty($item->options)) {\r
- $hasEnabledOption = false;\r
- $options = explode(',', strtoupper($item->options));\r
- foreach ($options as $option) {\r
- if (defined($option) && constant($option)) {\r
- $hasEnabledOption = true;\r
- break;\r
- }\r
- }\r
- }\r
- if (!$hasEnabledOption) return false;\r
- \r
- // check the permission of this item for the active user\r
- $hasPermission = true;\r
- if (!empty($item->permissions)) {\r
- $hasPermission = false;\r
- $permissions = explode(',', $item->permissions);\r
- foreach ($permissions as $permission) {\r
- if (WCF::getSession()->getPermission($permission)) {\r
- $hasPermission = true;\r
- break;\r
- }\r
- }\r
- }\r
- if (!$hasPermission) return false;\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * Checks the options and permissions of the menu items.\r
- * \r
- * @param string $parentMenuItem\r
- */\r
- protected function checkMenuItems($parentMenuItem = '') {\r
- if (!isset($this->menuItems[$parentMenuItem])) return;\r
- \r
- foreach ($this->menuItems[$parentMenuItem] as $key => $item) {\r
- if ($this->checkMenuItem($item)) {\r
- // check children\r
- $this->checkMenuItems($item->menuItem);\r
- }\r
- else {\r
- // remove this item\r
- unset($this->menuItems[$parentMenuItem][$key]);\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Removes items without children.\r
- * \r
- * @param string $parentMenuItem\r
- */\r
- protected function removeEmptyItems($parentMenuItem = '') {\r
- if (!isset($this->menuItems[$parentMenuItem])) return;\r
- \r
- foreach ($this->menuItems[$parentMenuItem] as $key => $item) {\r
- $this->removeEmptyItems($item->menuItem);\r
- if (empty($item->menuItemLink) && (!isset($this->menuItems[$item->menuItem]) || !count($this->menuItems[$item->menuItem]))) {\r
- // remove this item\r
- unset($this->menuItems[$parentMenuItem][$key]);\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * Builds a plain menu item list.\r
- * \r
- * @param string $parentMenuItem\r
- */\r
- protected function buildMenuItemList($parentMenuItem = '') {\r
- if (!isset($this->menuItems[$parentMenuItem])) return;\r
- \r
- foreach ($this->menuItems[$parentMenuItem] as $key => $item) {\r
- $this->menuItemList[$item->menuItem] = $item;\r
- $this->buildMenuItemList($item->menuItem);\r
- }\r
- }\r
- \r
- /**\r
- * Sets the active menu item. \r
- * This should be done before the menu.tpl template calls the function getMenu().\r
- * \r
- * This function should be used in each script which uses a template that includes the menu.tpl.\r
- * \r
- * @param string $menuItem name of the active menu item\r
- */\r
- public function setActiveMenuItem($menuItem) {\r
- $this->activeMenuItems = array(); \r
- \r
- // build active menu list\r
- while (isset($this->menuItemList[$menuItem])) {\r
- $this->activeMenuItems[] = $menuItem;\r
- $menuItem = $this->menuItemList[$menuItem]->parentMenuItem;\r
- }\r
- }\r
- \r
- /**\r
- * Returns a list of the active menu items.\r
- * \r
- * @return array\r
- */\r
- public function getActiveMenuItems() {\r
- return $this->activeMenuItems;\r
- }\r
- \r
- /**\r
- * Returns the active menu item.\r
- * \r
- * @param integer $level\r
- * @return string\r
- */\r
- public function getActiveMenuItem($level = 0) {\r
- if ($level < count($this->activeMenuItems)) {\r
- return $this->activeMenuItems[(count($this->activeMenuItems) - ($level + 1))];\r
- }\r
- return null;\r
- }\r
- \r
- /**\r
- * Returns the list of menu items.\r
- * \r
- * @param string $parentMenuItem\r
- * @return array\r
- */\r
- public function getMenuItems($parentMenuItem = null) {\r
- if ($parentMenuItem === null) return $this->menuItems;\r
- if (isset($this->menuItems[$parentMenuItem])) return $this->menuItems[$parentMenuItem];\r
- return array();\r
- }\r
+<?php
+namespace wcf\system\menu;
+use wcf\system\event\EventHandler;
+use wcf\system\SingletonFactory;
+use wcf\system\WCF;
+use wcf\util\FileUtil;
+
+/**
+ * Basis class for a tree menu.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.menu
+ * @category Community Framework
+ */
+abstract class TreeMenu extends SingletonFactory {
+ /**
+ * List of visible menu items.
+ *
+ * @var array
+ */
+ public $menuItemList = array();
+
+ /**
+ * List of active menu items.
+ *
+ * @var array
+ */
+ public $activeMenuItems = array();
+
+ /**
+ * List of all menu items.
+ *
+ * @var array
+ */
+ public $menuItems = null;
+
+ /**
+ * @see SingletonFactory::init()
+ */
+ protected function init() {
+ // get menu items from cache
+ $this->loadCache();
+
+ // check menu items
+ $this->checkMenuItems();
+
+ // remove items without children
+ $this->removeEmptyItems();
+
+ // build plain menu item list
+ $this->buildMenuItemList();
+
+ // call init event
+ EventHandler::getInstance()->fireAction($this, 'init');
+ }
+
+ /**
+ * Loads cached menu items.
+ */
+ protected function loadCache() {
+ // call loadCache event
+ EventHandler::getInstance()->fireAction($this, 'loadCache');
+
+ $this->menuItems = array();
+ }
+
+ /**
+ * Checks the options and permissions of given menu item.
+ *
+ * @param wcf\system\menu\ITreeMenuItem $item
+ * @return boolean
+ */
+ protected function checkMenuItem(ITreeMenuItem $item) {
+ // check the options of this item
+ $hasEnabledOption = true;
+ if (!empty($item->options)) {
+ $hasEnabledOption = false;
+ $options = explode(',', strtoupper($item->options));
+ foreach ($options as $option) {
+ if (defined($option) && constant($option)) {
+ $hasEnabledOption = true;
+ break;
+ }
+ }
+ }
+ if (!$hasEnabledOption) return false;
+
+ // check the permission of this item for the active user
+ $hasPermission = true;
+ if (!empty($item->permissions)) {
+ $hasPermission = false;
+ $permissions = explode(',', $item->permissions);
+ foreach ($permissions as $permission) {
+ if (WCF::getSession()->getPermission($permission)) {
+ $hasPermission = true;
+ break;
+ }
+ }
+ }
+ if (!$hasPermission) return false;
+
+ return true;
+ }
+
+ /**
+ * Checks the options and permissions of the menu items.
+ *
+ * @param string $parentMenuItem
+ */
+ protected function checkMenuItems($parentMenuItem = '') {
+ if (!isset($this->menuItems[$parentMenuItem])) return;
+
+ foreach ($this->menuItems[$parentMenuItem] as $key => $item) {
+ if ($this->checkMenuItem($item)) {
+ // check children
+ $this->checkMenuItems($item->menuItem);
+ }
+ else {
+ // remove this item
+ unset($this->menuItems[$parentMenuItem][$key]);
+ }
+ }
+ }
+
+ /**
+ * Removes items without children.
+ *
+ * @param string $parentMenuItem
+ */
+ protected function removeEmptyItems($parentMenuItem = '') {
+ if (!isset($this->menuItems[$parentMenuItem])) return;
+
+ foreach ($this->menuItems[$parentMenuItem] as $key => $item) {
+ $this->removeEmptyItems($item->menuItem);
+ if (empty($item->menuItemLink) && (!isset($this->menuItems[$item->menuItem]) || !count($this->menuItems[$item->menuItem]))) {
+ // remove this item
+ unset($this->menuItems[$parentMenuItem][$key]);
+ }
+ }
+ }
+
+ /**
+ * Builds a plain menu item list.
+ *
+ * @param string $parentMenuItem
+ */
+ protected function buildMenuItemList($parentMenuItem = '') {
+ if (!isset($this->menuItems[$parentMenuItem])) return;
+
+ foreach ($this->menuItems[$parentMenuItem] as $key => $item) {
+ $this->menuItemList[$item->menuItem] = $item;
+ $this->buildMenuItemList($item->menuItem);
+ }
+ }
+
+ /**
+ * Sets the active menu item.
+ * This should be done before the menu.tpl template calls the function getMenu().
+ *
+ * This function should be used in each script which uses a template that includes the menu.tpl.
+ *
+ * @param string $menuItem name of the active menu item
+ */
+ public function setActiveMenuItem($menuItem) {
+ $this->activeMenuItems = array();
+
+ // build active menu list
+ while (isset($this->menuItemList[$menuItem])) {
+ $this->activeMenuItems[] = $menuItem;
+ $menuItem = $this->menuItemList[$menuItem]->parentMenuItem;
+ }
+ }
+
+ /**
+ * Returns a list of the active menu items.
+ *
+ * @return array
+ */
+ public function getActiveMenuItems() {
+ return $this->activeMenuItems;
+ }
+
+ /**
+ * Returns the active menu item.
+ *
+ * @param integer $level
+ * @return string
+ */
+ public function getActiveMenuItem($level = 0) {
+ if ($level < count($this->activeMenuItems)) {
+ return $this->activeMenuItems[(count($this->activeMenuItems) - ($level + 1))];
+ }
+ return null;
+ }
+
+ /**
+ * Returns the list of menu items.
+ *
+ * @param string $parentMenuItem
+ * @return array
+ */
+ public function getMenuItems($parentMenuItem = null) {
+ if ($parentMenuItem === null) return $this->menuItems;
+ if (isset($this->menuItems[$parentMenuItem])) return $this->menuItems[$parentMenuItem];
+ return array();
+ }
}
-<?php\r
-namespace wcf\system\menu\acp;\r
-use wcf\system\menu\TreeMenu;\r
-use wcf\system\cache\CacheHandler;\r
-\r
-/**\r
- * Builds the acp menu.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.menu.acp\r
- * @category Community Framework\r
- */\r
-class ACPMenu extends TreeMenu {\r
- /**\r
- * @see TreeMenu::loadCache()\r
- */\r
- protected function loadCache() {\r
- parent::loadCache();\r
- \r
- if (PACKAGE_ID == 0) {\r
- return;\r
- }\r
- \r
- CacheHandler::getInstance()->addResource('menu-'.PACKAGE_ID, WCF_DIR.'cache/cache.menu-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderACPMenu');\r
- $this->menuItems = CacheHandler::getInstance()->get('menu-'.PACKAGE_ID);\r
- }\r
-}\r
+<?php
+namespace wcf\system\menu\acp;
+use wcf\system\menu\TreeMenu;
+use wcf\system\cache\CacheHandler;
+
+/**
+ * Builds the acp menu.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.menu.acp
+ * @category Community Framework
+ */
+class ACPMenu extends TreeMenu {
+ /**
+ * @see TreeMenu::loadCache()
+ */
+ protected function loadCache() {
+ parent::loadCache();
+
+ if (PACKAGE_ID == 0) {
+ return;
+ }
+
+ CacheHandler::getInstance()->addResource('menu-'.PACKAGE_ID, WCF_DIR.'cache/cache.menu-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderACPMenu');
+ $this->menuItems = CacheHandler::getInstance()->get('menu-'.PACKAGE_ID);
+ }
+}
-<?php\r
-namespace wcf\system\menu\page;\r
-use wcf\data\DatabaseObjectDecorator;\r
-\r
-/**\r
- * Provides default implementations for page menu item providers.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.menu.page\r
- * @category Community Framework\r
- */\r
-class DefaultPageMenuItemProvider extends DatabaseObjectDecorator implements IPageMenuItemProvider {\r
- /**\r
- * @see wcf\system\menu\page\IPageMenuItemProvider::isVisible()\r
- */\r
- public function isVisible() {\r
- return true;\r
- }\r
- \r
- /**\r
- * @see wcf\system\menu\page\IPageMenuItemProvider::getNotifications()\r
- */\r
- public function getNotifications() {\r
- return 0;\r
- }\r
+<?php
+namespace wcf\system\menu\page;
+use wcf\data\DatabaseObjectDecorator;
+
+/**
+ * Provides default implementations for page menu item providers.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.menu.page
+ * @category Community Framework
+ */
+class DefaultPageMenuItemProvider extends DatabaseObjectDecorator implements IPageMenuItemProvider {
+ /**
+ * @see wcf\system\menu\page\IPageMenuItemProvider::isVisible()
+ */
+ public function isVisible() {
+ return true;
+ }
+
+ /**
+ * @see wcf\system\menu\page\IPageMenuItemProvider::getNotifications()
+ */
+ public function getNotifications() {
+ return 0;
+ }
}
-<?php\r
-namespace wcf\system\menu\page;\r
-use wcf\data\IDatabaseObjectProcessor;\r
-\r
-/**\r
- * Any page menu item provider should implement this interface.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.menu.page\r
- * @category Community Framework\r
- */\r
-interface IPageMenuItemProvider extends IDatabaseObjectProcessor {\r
- /**\r
- * Returns true if the associated menu item should be visible for the active user.\r
- * \r
- * @return boolean\r
- */\r
- public function isVisible();\r
- \r
- /**\r
- * Returns the number of notifications for the associated menu item.\r
- * \r
- * @return boolean\r
- */\r
- public function getNotifications();\r
+<?php
+namespace wcf\system\menu\page;
+use wcf\data\IDatabaseObjectProcessor;
+
+/**
+ * Any page menu item provider should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.menu.page
+ * @category Community Framework
+ */
+interface IPageMenuItemProvider extends IDatabaseObjectProcessor {
+ /**
+ * Returns true if the associated menu item should be visible for the active user.
+ *
+ * @return boolean
+ */
+ public function isVisible();
+
+ /**
+ * Returns the number of notifications for the associated menu item.
+ *
+ * @return boolean
+ */
+ public function getNotifications();
}
-<?php\r
-namespace wcf\system\menu\page;\r
-use wcf\data\page\menu\item\PageMenuItem;\r
-use wcf\system\menu\TreeMenu;\r
-use wcf\system\menu\ITreeMenuItem;\r
-use wcf\system\cache\CacheHandler;\r
-\r
-/**\r
- * Builds the page menu.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.menu.page\r
- * @category Community Framework\r
- */\r
-class PageMenu extends TreeMenu {\r
- /**\r
- * @see wcf\system\menu\TreeMenu::loadCache()\r
- */\r
- protected function loadCache() {\r
- parent::loadCache();\r
- \r
- // get cache\r
- CacheHandler::getInstance()->addResource('pageMenu-'.PACKAGE_ID, WCF_DIR.'cache/cache.pageMenu-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderPageMenu');\r
- $this->menuItems = CacheHandler::getInstance()->get('pageMenu-'.PACKAGE_ID);\r
- }\r
- \r
- /**\r
- * @see wcf\system\menu\TreeMenu::checkMenuItem()\r
- */\r
- protected function checkMenuItem(ITreeMenuItem $item) {\r
- if (!parent::checkMenuItem($item)) return false;\r
- \r
- return $item->getProcessor()->isVisible();\r
- }\r
-}\r
+<?php
+namespace wcf\system\menu\page;
+use wcf\data\page\menu\item\PageMenuItem;
+use wcf\system\menu\TreeMenu;
+use wcf\system\menu\ITreeMenuItem;
+use wcf\system\cache\CacheHandler;
+
+/**
+ * Builds the page menu.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.menu.page
+ * @category Community Framework
+ */
+class PageMenu extends TreeMenu {
+ /**
+ * @see wcf\system\menu\TreeMenu::loadCache()
+ */
+ protected function loadCache() {
+ parent::loadCache();
+
+ // get cache
+ CacheHandler::getInstance()->addResource('pageMenu-'.PACKAGE_ID, WCF_DIR.'cache/cache.pageMenu-'.PACKAGE_ID.'.php', 'wcf\system\cache\builder\CacheBuilderPageMenu');
+ $this->menuItems = CacheHandler::getInstance()->get('pageMenu-'.PACKAGE_ID);
+ }
+
+ /**
+ * @see wcf\system\menu\TreeMenu::checkMenuItem()
+ */
+ protected function checkMenuItem(ITreeMenuItem $item) {
+ if (!parent::checkMenuItem($item)) return false;
+
+ return $item->getProcessor()->isVisible();
+ }
+}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-\r
-/**\r
- * Any option type should implement this interface.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-interface IOptionType {\r
- /**\r
- * Returns the html code for the form element of this option.\r
- * \r
- * @param Option $option\r
- * @param mixed $value\r
- * @return string html\r
- */\r
- public function getFormElement(Option $option, $value);\r
- \r
- /**\r
- * Validates the form input for this option.\r
- * Throws an exception, if validation fails.\r
- * \r
- * @param Option $option\r
- * @param string $newValue\r
- */\r
- public function validate(Option $option, $newValue);\r
- \r
- /**\r
- * Returns the value of this option for saving in the database.\r
- * \r
- * @param Option $option\r
- * @param string $newValue\r
- * @return string\r
- */\r
- public function getData(Option $option, $newValue);\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+
+/**
+ * Any option type should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+interface IOptionType {
+ /**
+ * Returns the html code for the form element of this option.
+ *
+ * @param Option $option
+ * @param mixed $value
+ * @return string html
+ */
+ public function getFormElement(Option $option, $value);
+
+ /**
+ * Validates the form input for this option.
+ * Throws an exception, if validation fails.
+ *
+ * @param Option $option
+ * @param string $newValue
+ */
+ public function validate(Option $option, $newValue);
+
+ /**
+ * Returns the value of this option for saving in the database.
+ *
+ * @param Option $option
+ * @param string $newValue
+ * @return string
+ */
+ public function getData(Option $option, $newValue);
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-\r
-/**\r
- * Any searchable option type should implement this interface.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-interface ISearchableUserOption {\r
- /**\r
- * Returns the html code for the search form element of this option.\r
- * \r
- * @param wcf\data\option\Option $option\r
- * @param string $value\r
- * @return string html\r
- */\r
- public function getSearchFormElement(Option $option, $value);\r
- \r
- /**\r
- * Returns a condition for search sql query.\r
- * \r
- * @param wcf\system\database\condition\PreparedStatementConditionBuilder $conditions\r
- * @param wcf\data\option\Option $option\r
- * @param string $value\r
- * @param boolean\r
- */\r
- public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value);\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+
+/**
+ * Any searchable option type should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+interface ISearchableUserOption {
+ /**
+ * Returns the html code for the search form element of this option.
+ *
+ * @param wcf\data\option\Option $option
+ * @param string $value
+ * @return string html
+ */
+ public function getSearchFormElement(Option $option, $value);
+
+ /**
+ * Returns a condition for search sql query.
+ *
+ * @param wcf\system\database\condition\PreparedStatementConditionBuilder $conditions
+ * @param wcf\data\option\Option $option
+ * @param string $value
+ * @param boolean
+ */
+ public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value);
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * OptionTypeBoolean is an implementation of OptionType for boolean values.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeBoolean implements IOptionType, ISearchableUserOption {\r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(Option $option, $value) {\r
- $options = Option::parseEnableOptions($option->enableOptions);\r
- \r
- WCF::getTPL()->assign(array(\r
- 'disableOptions' => $options['disableOptions'],\r
- 'enableOptions' => $options['enableOptions'],\r
- 'option' => $option,\r
- 'value' => $value\r
- ));\r
- return WCF::getTPL()->fetch('optionTypeBoolean');\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::validate()\r
- */\r
- public function validate(Option $option, $newValue) {}\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getData()\r
- */\r
- public function getData(Option $option, $newValue) {\r
- if ($newValue !== null) return 1;\r
- return 0;\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
- */\r
- public function getSearchFormElement(Option $option, $value) {\r
- return $this->getFormElement($option, $value);\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getCondition()\r
- */\r
- public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
- $value = intval($value);\r
- if (!$value) return false;\r
- \r
- $conditions->add("option_value.userOption".$option->optionID." = ?", array(1));\r
- return true;\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * OptionTypeBoolean is an implementation of OptionType for boolean values.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeBoolean implements IOptionType, ISearchableUserOption {
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(Option $option, $value) {
+ $options = Option::parseEnableOptions($option->enableOptions);
+
+ WCF::getTPL()->assign(array(
+ 'disableOptions' => $options['disableOptions'],
+ 'enableOptions' => $options['enableOptions'],
+ 'option' => $option,
+ 'value' => $value
+ ));
+ return WCF::getTPL()->fetch('optionTypeBoolean');
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::validate()
+ */
+ public function validate(Option $option, $newValue) {}
+
+ /**
+ * @see wcf\system\option\IOptionType::getData()
+ */
+ public function getData(Option $option, $newValue) {
+ if ($newValue !== null) return 1;
+ return 0;
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+ */
+ public function getSearchFormElement(Option $option, $value) {
+ return $this->getFormElement($option, $value);
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getCondition()
+ */
+ public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+ $value = intval($value);
+ if (!$value) return false;
+
+ $conditions->add("option_value.userOption".$option->optionID." = ?", array(1));
+ return true;
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionTypeSelect;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * OptionTypeSelect is an implementation of OptionType for 'select' tags with a text field for custom inputs.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeCustomselect extends OptionTypeSelect {\r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(Option $option, $value) {\r
- WCF::getTPL()->assign(array(\r
- 'option' => $option,\r
- 'selectOptions' => $option->parseSelectOptions(),\r
- 'value' => $value,\r
- 'customValue' => (!isset($options[$value]) ? $value : '')\r
- ));\r
- \r
- return WCF::getTPL()->fetch('optionTypeCustomselect');\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::validate()\r
- */\r
- public function validate(Option $option, $newValue) {}\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getData()\r
- */\r
- public function getData(Option $option, $newValue) {\r
- if (empty($newValue) && isset($_POST['values'][$option->optionName.'_custom'])) {\r
- return $_POST['values'][$option->optionName.'_custom'];\r
- }\r
- return $newValue;\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionTypeSelect;
+use wcf\system\WCF;
+
+/**
+ * OptionTypeSelect is an implementation of OptionType for 'select' tags with a text field for custom inputs.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeCustomselect extends OptionTypeSelect {
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(Option $option, $value) {
+ WCF::getTPL()->assign(array(
+ 'option' => $option,
+ 'selectOptions' => $option->parseSelectOptions(),
+ 'value' => $value,
+ 'customValue' => (!isset($options[$value]) ? $value : '')
+ ));
+
+ return WCF::getTPL()->fetch('optionTypeCustomselect');
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::validate()
+ */
+ public function validate(Option $option, $newValue) {}
+
+ /**
+ * @see wcf\system\option\IOptionType::getData()
+ */
+ public function getData(Option $option, $newValue) {
+ if (empty($newValue) && isset($_POST['values'][$option->optionName.'_custom'])) {
+ return $_POST['values'][$option->optionName.'_custom'];
+ }
+ return $newValue;
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\option\OptionType;\r
-use wcf\system\option\SearchableUserOption;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * OptionTypeDate is an implementation of OptionType for date inputs.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeDate implements IOptionType, ISearchableUserOption {\r
- protected $yearRequired = true;\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(array &$optionData) {\r
- if (!isset($optionData['optionValue'])) {\r
- if (isset($optionData['defaultValue'])) $optionData['optionValue'] = $optionData['defaultValue'];\r
- else $optionData['optionValue'] = '';\r
- }\r
- $optionData['isOptionGroup'] = true;\r
- $optionData['divClass'] = 'formDate';\r
- \r
- $year = $month = $day = '';\r
- $optionValue = explode('-', (is_array($optionData['optionValue']) ? implode('-', $optionData['optionValue']) : $optionData['optionValue']));\r
- if (isset($optionValue[0])) $year = intval($optionValue[0]);\r
- if (empty($year)) $year = '';\r
- if (isset($optionValue[1])) $month = $optionValue[1];\r
- if (isset($optionValue[2])) $day = $optionValue[2];\r
- $dateInputOrder = explode('-', WCF::getLanguage()->get('wcf.global.dateInputOrder'));\r
- \r
- // generate days\r
- $days = array();\r
- $days[0] = '';\r
- for ($i = 1; $i < 32; $i++) {\r
- $days[$i] = $i; \r
- }\r
- \r
- // generate months\r
- $months = array();\r
- $months[0] = '';\r
- // TODO: $dateFormatLocalized is no longer available, fix this!\r
- $monthFormat = (Language::$dateFormatLocalized ? '%B' : '%m');\r
- for ($i = 1; $i < 13; $i++) {\r
- $months[$i] = DateUtil::formatDate($monthFormat, gmmktime(0, 0, 0, $i, 10, 2006), false, true);\r
- }\r
- \r
- WCF::getTPL()->assign(array(\r
- 'year' => $year,\r
- 'month' => $month,\r
- 'day' => $day,\r
- 'days' => $days,\r
- 'months' => $months,\r
- 'optionData' => $optionData,\r
- 'dateInputOrder' => $dateInputOrder,\r
- 'yearRequired' => $this->yearRequired\r
- ));\r
- return WCF::getTPL()->fetch('optionTypeDate');\r
- }\r
- \r
- /**\r
- * Formats the user input.\r
- * \r
- * @param array $newValue\r
- */\r
- protected function getValue(array &$newValue) {\r
- if (isset($newValue['year'])) $newValue['year'] = intval($newValue['year']);\r
- else $newValue['year'] = 0;\r
- if (isset($newValue['month'])) $newValue['month'] = intval($newValue['month']);\r
- else $newValue['month'] = 0;\r
- if (isset($newValue['day'])) $newValue['day'] = intval($newValue['day']);\r
- else $newValue['day'] = 0;\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::validate()\r
- */\r
- public function validate(array $optionData, $newValue) {\r
- $this->getValue($newValue);\r
- \r
- if ($newValue['year'] || $newValue['month'] || $newValue['day']) {\r
- if (strlen($newValue['year']) == 2) {\r
- $newValue['year'] = '19'.$newValue['year'];\r
- }\r
- \r
- if (!checkdate(intval($newValue['month']), intval($newValue['day']), ((!$this->yearRequired && !$newValue['year']) ? 2000 : intval($newValue['year'])))) {\r
- throw new UserInputException($optionData['optionName'], 'validationFailed');\r
- }\r
- if (($newValue['year'] || $this->yearRequired) && ((strlen($newValue['year']) != 4 && strlen($newValue['year']) != 2) || $newValue['year'] < 1902)) {\r
- throw new UserInputException($optionData['optionName'], 'validationFailed');\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getData()\r
- */\r
- public function getData(array $optionData, $newValue) {\r
- $this->getValue($newValue);\r
- \r
- if ($newValue['year'] || $newValue['month'] || $newValue['day']) {\r
- if ($newValue['month'] < 10) $newValue['month'] = '0'.$newValue['month'];\r
- if ($newValue['day'] < 10) $newValue['day'] = '0'.$newValue['day'];\r
- if (strlen($newValue['year']) == 2) {\r
- $newValue['year'] = '19'.$newValue['year'];\r
- }\r
- if (!$this->yearRequired && strlen($newValue['year']) < 2) {\r
- $newValue['year'] = '0000';\r
- }\r
- return $newValue['year'].'-'.$newValue['month'].'-'.$newValue['day'];\r
- }\r
- \r
- return '';\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
- */\r
- public function getSearchFormElement(array &$optionData) {\r
- return $this->getFormElement($optionData);\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getCondition()\r
- */\r
- public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
- $value = $this->getData($optionData, $value);\r
- if ($value == '') return false;\r
- \r
- $conditions->add("option_value.userOption".$option->optionID." = ?", array($value));\r
- return true;\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\exception\UserInputException;
+use wcf\system\option\OptionType;
+use wcf\system\option\SearchableUserOption;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+
+/**
+ * OptionTypeDate is an implementation of OptionType for date inputs.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeDate implements IOptionType, ISearchableUserOption {
+ protected $yearRequired = true;
+
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(array &$optionData) {
+ if (!isset($optionData['optionValue'])) {
+ if (isset($optionData['defaultValue'])) $optionData['optionValue'] = $optionData['defaultValue'];
+ else $optionData['optionValue'] = '';
+ }
+ $optionData['isOptionGroup'] = true;
+ $optionData['divClass'] = 'formDate';
+
+ $year = $month = $day = '';
+ $optionValue = explode('-', (is_array($optionData['optionValue']) ? implode('-', $optionData['optionValue']) : $optionData['optionValue']));
+ if (isset($optionValue[0])) $year = intval($optionValue[0]);
+ if (empty($year)) $year = '';
+ if (isset($optionValue[1])) $month = $optionValue[1];
+ if (isset($optionValue[2])) $day = $optionValue[2];
+ $dateInputOrder = explode('-', WCF::getLanguage()->get('wcf.global.dateInputOrder'));
+
+ // generate days
+ $days = array();
+ $days[0] = '';
+ for ($i = 1; $i < 32; $i++) {
+ $days[$i] = $i;
+ }
+
+ // generate months
+ $months = array();
+ $months[0] = '';
+ // TODO: $dateFormatLocalized is no longer available, fix this!
+ $monthFormat = (Language::$dateFormatLocalized ? '%B' : '%m');
+ for ($i = 1; $i < 13; $i++) {
+ $months[$i] = DateUtil::formatDate($monthFormat, gmmktime(0, 0, 0, $i, 10, 2006), false, true);
+ }
+
+ WCF::getTPL()->assign(array(
+ 'year' => $year,
+ 'month' => $month,
+ 'day' => $day,
+ 'days' => $days,
+ 'months' => $months,
+ 'optionData' => $optionData,
+ 'dateInputOrder' => $dateInputOrder,
+ 'yearRequired' => $this->yearRequired
+ ));
+ return WCF::getTPL()->fetch('optionTypeDate');
+ }
+
+ /**
+ * Formats the user input.
+ *
+ * @param array $newValue
+ */
+ protected function getValue(array &$newValue) {
+ if (isset($newValue['year'])) $newValue['year'] = intval($newValue['year']);
+ else $newValue['year'] = 0;
+ if (isset($newValue['month'])) $newValue['month'] = intval($newValue['month']);
+ else $newValue['month'] = 0;
+ if (isset($newValue['day'])) $newValue['day'] = intval($newValue['day']);
+ else $newValue['day'] = 0;
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::validate()
+ */
+ public function validate(array $optionData, $newValue) {
+ $this->getValue($newValue);
+
+ if ($newValue['year'] || $newValue['month'] || $newValue['day']) {
+ if (strlen($newValue['year']) == 2) {
+ $newValue['year'] = '19'.$newValue['year'];
+ }
+
+ if (!checkdate(intval($newValue['month']), intval($newValue['day']), ((!$this->yearRequired && !$newValue['year']) ? 2000 : intval($newValue['year'])))) {
+ throw new UserInputException($optionData['optionName'], 'validationFailed');
+ }
+ if (($newValue['year'] || $this->yearRequired) && ((strlen($newValue['year']) != 4 && strlen($newValue['year']) != 2) || $newValue['year'] < 1902)) {
+ throw new UserInputException($optionData['optionName'], 'validationFailed');
+ }
+ }
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::getData()
+ */
+ public function getData(array $optionData, $newValue) {
+ $this->getValue($newValue);
+
+ if ($newValue['year'] || $newValue['month'] || $newValue['day']) {
+ if ($newValue['month'] < 10) $newValue['month'] = '0'.$newValue['month'];
+ if ($newValue['day'] < 10) $newValue['day'] = '0'.$newValue['day'];
+ if (strlen($newValue['year']) == 2) {
+ $newValue['year'] = '19'.$newValue['year'];
+ }
+ if (!$this->yearRequired && strlen($newValue['year']) < 2) {
+ $newValue['year'] = '0000';
+ }
+ return $newValue['year'].'-'.$newValue['month'].'-'.$newValue['day'];
+ }
+
+ return '';
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+ */
+ public function getSearchFormElement(array &$optionData) {
+ return $this->getFormElement($optionData);
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getCondition()
+ */
+ public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+ $value = $this->getData($optionData, $value);
+ if ($value == '') return false;
+
+ $conditions->add("option_value.userOption".$option->optionID." = ?", array($value));
+ return true;
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionTypeText;\r
-\r
-/**\r
- * OptionTypeText is an implementation of OptionType for integer fields.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeInteger extends OptionTypeText {\r
- /**\r
- * @see wcf\system\option\IOptionType::getData()\r
- */\r
- public function getData(Option $option, $newValue) {\r
- return intval($newValue);\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionTypeText;
+
+/**
+ * OptionTypeText is an implementation of OptionType for integer fields.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeInteger extends OptionTypeText {
+ /**
+ * @see wcf\system\option\IOptionType::getData()
+ */
+ public function getData(Option $option, $newValue) {
+ return intval($newValue);
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\option\OptionTypeSelect;\r
-use wcf\system\option\SearchableUserOption;\r
-use wcf\system\WCF;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\OptionUtil;\r
-\r
-/**\r
- * OptionTypeSelect is an implementation of OptionType for multiple 'select' tags.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeMultiselect extends OptionTypeSelect {\r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(array &$optionData) {\r
- if (!isset($optionData['optionValue'])) {\r
- if (isset($optionData['defaultValue'])) $optionData['optionValue'] = explode("\n", $optionData['defaultValue']);\r
- else $optionData['optionValue'] = array();\r
- }\r
- else if (!is_array($optionData['optionValue'])) {\r
- $optionData['optionValue'] = explode("\n", $optionData['optionValue']);\r
- }\r
- \r
- // get options\r
- $options = OptionUtil::parseSelectOptions($optionData['selectOptions']);\r
- \r
- WCF::getTPL()->assign(array(\r
- 'optionData' => $optionData,\r
- 'options' => $options\r
- ));\r
- return WCF::getTPL()->fetch('optionTypeMultiselect');\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::validate()\r
- */\r
- public function validate(array $optionData, $newValue) {\r
- if (!is_array($newValue)) $newValue = array();\r
- $options = OptionUtil::parseSelectOptions($optionData['selectOptions']);\r
- foreach ($newValue as $value) {\r
- if (!isset($options[$value])) throw new UserInputException($optionData['optionName'], 'validationFailed');\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getData()\r
- */\r
- public function getData(array $optionData, $newValue) {\r
- if (!is_array($newValue)) $newValue = array();\r
- return implode("\n", $newValue);\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
- */\r
- public function getSearchFormElement(array &$optionData) {\r
- return $this->getFormElement($optionData);\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getCondition()\r
- */\r
- public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $options, $value) {\r
- if (!is_array($value) || !count($value)) return false;\r
- $value = ArrayUtil::trim($value);\r
- if (!count($value)) return false;\r
- \r
- $conditions->add("option_value.userOption".$option->optionID." = ?", array(implode("\n", $value)));\r
- return true;\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\option\OptionTypeSelect;
+use wcf\system\option\SearchableUserOption;
+use wcf\system\WCF;
+use wcf\system\exception\UserInputException;
+use wcf\util\ArrayUtil;
+use wcf\util\OptionUtil;
+
+/**
+ * OptionTypeSelect is an implementation of OptionType for multiple 'select' tags.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeMultiselect extends OptionTypeSelect {
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(array &$optionData) {
+ if (!isset($optionData['optionValue'])) {
+ if (isset($optionData['defaultValue'])) $optionData['optionValue'] = explode("\n", $optionData['defaultValue']);
+ else $optionData['optionValue'] = array();
+ }
+ else if (!is_array($optionData['optionValue'])) {
+ $optionData['optionValue'] = explode("\n", $optionData['optionValue']);
+ }
+
+ // get options
+ $options = OptionUtil::parseSelectOptions($optionData['selectOptions']);
+
+ WCF::getTPL()->assign(array(
+ 'optionData' => $optionData,
+ 'options' => $options
+ ));
+ return WCF::getTPL()->fetch('optionTypeMultiselect');
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::validate()
+ */
+ public function validate(array $optionData, $newValue) {
+ if (!is_array($newValue)) $newValue = array();
+ $options = OptionUtil::parseSelectOptions($optionData['selectOptions']);
+ foreach ($newValue as $value) {
+ if (!isset($options[$value])) throw new UserInputException($optionData['optionName'], 'validationFailed');
+ }
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::getData()
+ */
+ public function getData(array $optionData, $newValue) {
+ if (!is_array($newValue)) $newValue = array();
+ return implode("\n", $newValue);
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+ */
+ public function getSearchFormElement(array &$optionData) {
+ return $this->getFormElement($optionData);
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getCondition()
+ */
+ public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $options, $value) {
+ if (!is_array($value) || !count($value)) return false;
+ $value = ArrayUtil::trim($value);
+ if (!count($value)) return false;
+
+ $conditions->add("option_value.userOption".$option->optionID." = ?", array(implode("\n", $value)));
+ return true;
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\option\OptionTypeText;\r
-\r
-/**\r
- * OptionTypeText is an implementation of OptionType for 'input type="password"' tags.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypePassword extends OptionTypeText {\r
- /**\r
- * @see OptionTypeText::$inputType\r
- */\r
- protected $inputType = 'password';\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getCondition()\r
- */\r
- public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
- return false;\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\option\OptionTypeText;
+
+/**
+ * OptionTypeText is an implementation of OptionType for 'input type="password"' tags.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypePassword extends OptionTypeText {
+ /**
+ * @see OptionTypeText::$inputType
+ */
+ protected $inputType = 'password';
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getCondition()
+ */
+ public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+ return false;
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\option\OptionType;\r
-use wcf\system\option\SearchableUserOption;\r
-use wcf\system\WCF;\r
-use wcf\system\UserInputException;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * OptionTypeRadiobuttons is an implementation of OptionType for 'input type="radio"' tags.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeRadiobuttons implements IOptionType, ISearchableUserOption {\r
- public $templateName = 'optionTypeRadiobuttons';\r
-\r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(Option $option, $value) {\r
- // get options\r
- $selectOptions = $option->parseSelectOptions();\r
-\r
- $availableOptions = $option->parseMultipleEnableOptions();\r
- $options = array(\r
- 'disableOptions' => array(),\r
- 'enableOptions' => array()\r
- );\r
- \r
- foreach ($availableOptions as $key => $enableOptions) {\r
- $optionData = Option::parseEnableOptions($enableOptions);\r
- \r
- $options['disableOptions'][$key] = $optionData['disableOptions'];\r
- $options['enableOptions'][$key] = $optionData['enableOptions'];\r
- }\r
- \r
- WCF::getTPL()->assign(array(\r
- 'disableOptions' => $options['disableOptions'],\r
- 'enableOptions' => $options['enableOptions'],\r
- 'option' => $option,\r
- 'selectOptions' => $selectOptions,\r
- 'value' => $value\r
- ));\r
- return WCF::getTPL()->fetch($this->templateName);\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::validate()\r
- */\r
- public function validate(Option $option, $newValue) {\r
- if (!empty($newValue)) {\r
- $options = $option->parseSelectOptions();\r
- if (!isset($options[$newValue])) {\r
- throw new UserInputException($option->optionName, 'validationFailed');\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getData()\r
- */\r
- public function getData(Option $option, $newValue) {\r
- return $newValue;\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
- */\r
- public function getSearchFormElement(Option $option, $value) {\r
- return $this->getFormElement($optionData, $value);\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getCondition()\r
- */\r
- public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
- $value = StringUtil::trim($value);\r
- if (!$value) return false;\r
- \r
- $conditions->add("option_value.userOption".$option->optionID." = ?", array($value));\r
- return true;\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\option\OptionType;
+use wcf\system\option\SearchableUserOption;
+use wcf\system\WCF;
+use wcf\system\UserInputException;
+use wcf\util\StringUtil;
+
+/**
+ * OptionTypeRadiobuttons is an implementation of OptionType for 'input type="radio"' tags.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeRadiobuttons implements IOptionType, ISearchableUserOption {
+ public $templateName = 'optionTypeRadiobuttons';
+
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(Option $option, $value) {
+ // get options
+ $selectOptions = $option->parseSelectOptions();
+
+ $availableOptions = $option->parseMultipleEnableOptions();
+ $options = array(
+ 'disableOptions' => array(),
+ 'enableOptions' => array()
+ );
+
+ foreach ($availableOptions as $key => $enableOptions) {
+ $optionData = Option::parseEnableOptions($enableOptions);
+
+ $options['disableOptions'][$key] = $optionData['disableOptions'];
+ $options['enableOptions'][$key] = $optionData['enableOptions'];
+ }
+
+ WCF::getTPL()->assign(array(
+ 'disableOptions' => $options['disableOptions'],
+ 'enableOptions' => $options['enableOptions'],
+ 'option' => $option,
+ 'selectOptions' => $selectOptions,
+ 'value' => $value
+ ));
+ return WCF::getTPL()->fetch($this->templateName);
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::validate()
+ */
+ public function validate(Option $option, $newValue) {
+ if (!empty($newValue)) {
+ $options = $option->parseSelectOptions();
+ if (!isset($options[$newValue])) {
+ throw new UserInputException($option->optionName, 'validationFailed');
+ }
+ }
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::getData()
+ */
+ public function getData(Option $option, $newValue) {
+ return $newValue;
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+ */
+ public function getSearchFormElement(Option $option, $value) {
+ return $this->getFormElement($optionData, $value);
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getCondition()
+ */
+ public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+ $value = StringUtil::trim($value);
+ if (!$value) return false;
+
+ $conditions->add("option_value.userOption".$option->optionID." = ?", array($value));
+ return true;
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionTypeRadiobuttons;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * OptionTypeSelect is an implementation of OptionType for 'select' tags.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeSelect extends OptionTypeRadiobuttons {\r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(Option $option, $value) {\r
- // get options\r
- $options = $this->parseEnableOptions($option);\r
- \r
- WCF::getTPL()->assign(array(\r
- 'disableOptions' => $options['disableOptions'],\r
- 'enableOptions' => $options['enableOptions'],\r
- 'option' => $option,\r
- 'selectOptions' => $option->parseSelectOptions(),\r
- 'value' => $value\r
- ));\r
- return WCF::getTPL()->fetch('optionTypeSelect');\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
- */\r
- public function getSearchFormElement(Option $option, $value) {\r
- return $this->getFormElement($optionData, $value);\r
- }\r
- \r
- /**\r
- * @todo This is not really tested yet!\r
- * @param Option $option\r
- * @return array\r
- */\r
- protected function parseEnableOptions(Option $option) {\r
- $disableOptions = $enableOptions = '';\r
- \r
- if (!empty($option->enableOptions)) {\r
- $options = $option->parseMultipleEnableOptions();\r
- \r
- foreach ($options as $key => $optionData) {\r
- $tmp = explode(',', $optionData);\r
- \r
- foreach ($optionData as $item) {\r
- if ($item{0} == '!') {\r
- if (!empty($disableOptions)) $disableOptions .= ',';\r
- $disableOptions .= "{ value: '".$key."', option: '".StringUtil::substring($item, 1)."' }";\r
- }\r
- else {\r
- if (!empty($enableOptions)) $enableOptions .= ',';\r
- $enableOptions .= "{ value: '".$key."', option: '".$item."' }";\r
- }\r
- }\r
- }\r
- }\r
- \r
- return array(\r
- 'disableOptions' => $disableOptions,\r
- 'enableOptions' => $enableOptions\r
- );\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionTypeRadiobuttons;
+use wcf\system\WCF;
+
+/**
+ * OptionTypeSelect is an implementation of OptionType for 'select' tags.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeSelect extends OptionTypeRadiobuttons {
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(Option $option, $value) {
+ // get options
+ $options = $this->parseEnableOptions($option);
+
+ WCF::getTPL()->assign(array(
+ 'disableOptions' => $options['disableOptions'],
+ 'enableOptions' => $options['enableOptions'],
+ 'option' => $option,
+ 'selectOptions' => $option->parseSelectOptions(),
+ 'value' => $value
+ ));
+ return WCF::getTPL()->fetch('optionTypeSelect');
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+ */
+ public function getSearchFormElement(Option $option, $value) {
+ return $this->getFormElement($optionData, $value);
+ }
+
+ /**
+ * @todo This is not really tested yet!
+ * @param Option $option
+ * @return array
+ */
+ protected function parseEnableOptions(Option $option) {
+ $disableOptions = $enableOptions = '';
+
+ if (!empty($option->enableOptions)) {
+ $options = $option->parseMultipleEnableOptions();
+
+ foreach ($options as $key => $optionData) {
+ $tmp = explode(',', $optionData);
+
+ foreach ($optionData as $item) {
+ if ($item{0} == '!') {
+ if (!empty($disableOptions)) $disableOptions .= ',';
+ $disableOptions .= "{ value: '".$key."', option: '".StringUtil::substring($item, 1)."' }";
+ }
+ else {
+ if (!empty($enableOptions)) $enableOptions .= ',';
+ $enableOptions .= "{ value: '".$key."', option: '".$item."' }";
+ }
+ }
+ }
+ }
+
+ return array(
+ 'disableOptions' => $disableOptions,
+ 'enableOptions' => $enableOptions
+ );
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\database\util\PreparedStatementConditionBuilder;\r
-use wcf\system\option\OptionType;\r
-use wcf\system\option\SearchableUserOption;\r
-use wcf\system\WCF;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * OptionTypeText is an implementation of OptionType for 'input type="text"' tags.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeText implements IOptionType, ISearchableUserOption {\r
- /**\r
- * input type\r
- * @var string\r
- */\r
- protected $inputType = 'text';\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(Option $option, $value) {\r
- WCF::getTPL()->assign(array(\r
- 'option' => $option,\r
- 'inputType' => $this->inputType,\r
- 'value' => $value\r
- ));\r
- return WCF::getTPL()->fetch('optionTypeText');\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::validate()\r
- */\r
- public function validate(Option $option, $newValue) {}\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getData()\r
- */\r
- public function getData(Option $option, $newValue) {\r
- return $newValue;\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()\r
- */\r
- public function getSearchFormElement(Option $option, $value) {\r
- return $this->getFormElement($optionData, $value);\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\ISearchableUserOption::getCondition()\r
- */\r
- public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {\r
- $value = StringUtil::trim($value);\r
- if (empty($value)) return false;\r
- \r
- $conditions->add("option_value.userOption".$option->optionID." LIKE ?", array('%'.addcslashes($value, '_%').'%'));\r
- return true;\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
+use wcf\system\option\OptionType;
+use wcf\system\option\SearchableUserOption;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * OptionTypeText is an implementation of OptionType for 'input type="text"' tags.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeText implements IOptionType, ISearchableUserOption {
+ /**
+ * input type
+ * @var string
+ */
+ protected $inputType = 'text';
+
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(Option $option, $value) {
+ WCF::getTPL()->assign(array(
+ 'option' => $option,
+ 'inputType' => $this->inputType,
+ 'value' => $value
+ ));
+ return WCF::getTPL()->fetch('optionTypeText');
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::validate()
+ */
+ public function validate(Option $option, $newValue) {}
+
+ /**
+ * @see wcf\system\option\IOptionType::getData()
+ */
+ public function getData(Option $option, $newValue) {
+ return $newValue;
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getSearchFormElement()
+ */
+ public function getSearchFormElement(Option $option, $value) {
+ return $this->getFormElement($optionData, $value);
+ }
+
+ /**
+ * @see wcf\system\option\ISearchableUserOption::getCondition()
+ */
+ public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
+ $value = StringUtil::trim($value);
+ if (empty($value)) return false;
+
+ $conditions->add("option_value.userOption".$option->optionID." LIKE ?", array('%'.addcslashes($value, '_%').'%'));
+ return true;
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionTypeText;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * OptionTypeTextarea is an implementation of OptionType for 'textarea' tags.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeTextarea extends OptionTypeText {\r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(Option $option, $value) {\r
- WCF::getTPL()->assign(array(\r
- 'option' => $option,\r
- 'value' => $value\r
- ));\r
- return WCF::getTPL()->fetch('optionTypeTextarea');\r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionTypeText;
+use wcf\system\WCF;
+
+/**
+ * OptionTypeTextarea is an implementation of OptionType for 'textarea' tags.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeTextarea extends OptionTypeText {
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(Option $option, $value) {
+ WCF::getTPL()->assign(array(
+ 'option' => $option,
+ 'value' => $value
+ ));
+ return WCF::getTPL()->fetch('optionTypeTextarea');
+ }
}
-<?php\r
-namespace wcf\system\option;\r
-use wcf\data\option\Option;\r
-use wcf\system\option\OptionType;\r
-use wcf\system\exception\UserInputException;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * OptionTypeTimezone is an implementation of OptionType for a select box, which list the available time zones.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option\r
- * @category Community Framework\r
- */\r
-class OptionTypeTimezone implements IOptionType {\r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(Option $option, $value) {\r
- $timezoneOptions = array();\r
- foreach (DateUtil::getAvailableTimezones() as $timezone) {\r
- $timezoneOptions[$timezone] = WCF::getLanguage()->get('wcf.global.date.timezone.'.str_replace('/', '.', strtolower($timezone)));\r
- }\r
- \r
- WCF::getTPL()->assign(array(\r
- 'option' => $option,\r
- 'selectOptions' => $timezoneOptions,\r
- 'value' => $value\r
- ));\r
- return WCF::getTPL()->fetch('optionTypeSelect');\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::validate()\r
- */\r
- public function validate(Option $option, $newValue) {\r
- if (!in_array($newValue, DateUtil::getAvailableTimezones())) {\r
- throw new UserInputException($option->optionName, 'validationFailed');\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getData()\r
- */\r
- public function getData(Option $option, $newValue) {\r
- return $newValue; \r
- }\r
+<?php
+namespace wcf\system\option;
+use wcf\data\option\Option;
+use wcf\system\option\OptionType;
+use wcf\system\exception\UserInputException;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+
+/**
+ * OptionTypeTimezone is an implementation of OptionType for a select box, which list the available time zones.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option
+ * @category Community Framework
+ */
+class OptionTypeTimezone implements IOptionType {
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(Option $option, $value) {
+ $timezoneOptions = array();
+ foreach (DateUtil::getAvailableTimezones() as $timezone) {
+ $timezoneOptions[$timezone] = WCF::getLanguage()->get('wcf.global.date.timezone.'.str_replace('/', '.', strtolower($timezone)));
+ }
+
+ WCF::getTPL()->assign(array(
+ 'option' => $option,
+ 'selectOptions' => $timezoneOptions,
+ 'value' => $value
+ ));
+ return WCF::getTPL()->fetch('optionTypeSelect');
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::validate()
+ */
+ public function validate(Option $option, $newValue) {
+ if (!in_array($newValue, DateUtil::getAvailableTimezones())) {
+ throw new UserInputException($option->optionName, 'validationFailed');
+ }
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::getData()
+ */
+ public function getData(Option $option, $newValue) {
+ return $newValue;
+ }
}
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\OptionTypeBoolean;\r
-\r
-/**\r
- * GroupOptionTypeBoolean is an implementation of GroupOptionType for boolean values.\r
- * The merge of option values returns true, if at least one value is true. Otherwise false.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category Community Framework\r
- */\r
-class GroupOptionTypeBoolean extends OptionTypeBoolean implements IGroupOptionType {\r
- /**\r
- * @see wcf\system\option\group\IGroupOptionType::merge()\r
- */\r
- public function merge(array $values) {\r
- foreach ($values as $value) {\r
- if ($value) return true;\r
- }\r
-\r
- return false;\r
- }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\OptionTypeBoolean;
+
+/**
+ * GroupOptionTypeBoolean is an implementation of GroupOptionType for boolean values.
+ * The merge of option values returns true, if at least one value is true. Otherwise false.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category Community Framework
+ */
+class GroupOptionTypeBoolean extends OptionTypeBoolean implements IGroupOptionType {
+ /**
+ * @see wcf\system\option\group\IGroupOptionType::merge()
+ */
+ public function merge(array $values) {
+ foreach ($values as $value) {
+ if ($value) return true;
+ }
+
+ return false;
+ }
}
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\data\option\Option;\r
-use wcf\data\user\group\UserGroup;\r
-use wcf\util\ArrayUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * GroupOptionTypeGroups generates a select-list of all available user groups.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category Community Framework\r
- */\r
-class GroupOptionTypeGroups implements IGroupOptionType {\r
- /**\r
- * @see wcf\system\option\IOptionType::getFormElement()\r
- */\r
- public function getFormElement(Option $option, $value) {\r
- // get selected group\r
- $selectedGroups = explode(',', $value);\r
- \r
- // get all groups\r
- $groups = UserGroup::getGroupsByType();\r
- \r
- // generate html\r
- $html = '';\r
- foreach ($groups as $group) {\r
- $html .= '<label><input type="checkbox" name="values['.StringUtil::encodeHTML($option->optionName).'][]" value="'.$group->groupID.'" '.(in_array($group->groupID, $selectedGroups) ? 'checked="checked" ' : '').'/> '.StringUtil::encodeHTML($group->groupName).'</label>';\r
- }\r
- \r
- return $html;\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::validate()\r
- */\r
- public function validate(Option $option, $newValue) {\r
- // get all groups\r
- $groups = UserGroup::getGroupsByType();\r
- \r
- // get new value\r
- if (!is_array($newValue)) $newValue = array();\r
- $selectedGroups = ArrayUtil::toIntegerArray($newValue);\r
- \r
- // check groups\r
- foreach ($selectedGroups as $groupID) {\r
- if (!isset($groups[$groupID])) {\r
- throw new UserInputException($option->optionName, 'validationFailed');\r
- }\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\IOptionType::getData()\r
- */\r
- public function getData(Option $option, $newValue) {\r
- if (!is_array($newValue)) $newValue = array();\r
- $newValue = ArrayUtil::toIntegerArray($newValue);\r
- sort($newValue, SORT_NUMERIC);\r
- return implode(',', $newValue);\r
- }\r
- \r
- /**\r
- * @see wcf\system\option\group\IGroupOptionType::merge()\r
- */\r
- public function merge(array $values) {\r
- $result = array();\r
- foreach ($values as $value) {\r
- $value = explode(',', $value);\r
- $result = array_merge($result, $value);\r
- }\r
- \r
- $result = array_unique($result);\r
-\r
- return implode(',', $result);\r
- }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\data\option\Option;
+use wcf\data\user\group\UserGroup;
+use wcf\util\ArrayUtil;
+use wcf\util\StringUtil;
+
+/**
+ * GroupOptionTypeGroups generates a select-list of all available user groups.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category Community Framework
+ */
+class GroupOptionTypeGroups implements IGroupOptionType {
+ /**
+ * @see wcf\system\option\IOptionType::getFormElement()
+ */
+ public function getFormElement(Option $option, $value) {
+ // get selected group
+ $selectedGroups = explode(',', $value);
+
+ // get all groups
+ $groups = UserGroup::getGroupsByType();
+
+ // generate html
+ $html = '';
+ foreach ($groups as $group) {
+ $html .= '<label><input type="checkbox" name="values['.StringUtil::encodeHTML($option->optionName).'][]" value="'.$group->groupID.'" '.(in_array($group->groupID, $selectedGroups) ? 'checked="checked" ' : '').'/> '.StringUtil::encodeHTML($group->groupName).'</label>';
+ }
+
+ return $html;
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::validate()
+ */
+ public function validate(Option $option, $newValue) {
+ // get all groups
+ $groups = UserGroup::getGroupsByType();
+
+ // get new value
+ if (!is_array($newValue)) $newValue = array();
+ $selectedGroups = ArrayUtil::toIntegerArray($newValue);
+
+ // check groups
+ foreach ($selectedGroups as $groupID) {
+ if (!isset($groups[$groupID])) {
+ throw new UserInputException($option->optionName, 'validationFailed');
+ }
+ }
+ }
+
+ /**
+ * @see wcf\system\option\IOptionType::getData()
+ */
+ public function getData(Option $option, $newValue) {
+ if (!is_array($newValue)) $newValue = array();
+ $newValue = ArrayUtil::toIntegerArray($newValue);
+ sort($newValue, SORT_NUMERIC);
+ return implode(',', $newValue);
+ }
+
+ /**
+ * @see wcf\system\option\group\IGroupOptionType::merge()
+ */
+ public function merge(array $values) {
+ $result = array();
+ foreach ($values as $value) {
+ $value = explode(',', $value);
+ $result = array_merge($result, $value);
+ }
+
+ $result = array_unique($result);
+
+ return implode(',', $result);
+ }
}
-<?php\r
-namespace wcf\system\option\group;\r
-\r
-/**\r
- * GroupOptionTypeInfiniteinteger is an implementation of GroupOptionType for integer values with the infinite option.\r
- * The merge of option values returns true, if at least one value is -1. Otherwise it returns the highest value.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category Community Framework\r
- */\r
-class GroupOptionTypeInfiniteInteger extends GroupOptionTypeInteger {\r
- /**\r
- * @see wcf\system\option\group\IGroupOptionType::merge()\r
- */\r
- public function merge(array $values) {\r
- if (in_array(-1, $values)) return -1;\r
- return parent::merge($values);\r
- }\r
+<?php
+namespace wcf\system\option\group;
+
+/**
+ * GroupOptionTypeInfiniteinteger is an implementation of GroupOptionType for integer values with the infinite option.
+ * The merge of option values returns true, if at least one value is -1. Otherwise it returns the highest value.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category Community Framework
+ */
+class GroupOptionTypeInfiniteInteger extends GroupOptionTypeInteger {
+ /**
+ * @see wcf\system\option\group\IGroupOptionType::merge()
+ */
+ public function merge(array $values) {
+ if (in_array(-1, $values)) return -1;
+ return parent::merge($values);
+ }
}
-<?php\r
-namespace wcf\system\option\group;\r
-\r
-/**\r
- * GroupOptionTypeInfiniteinverseinteger is an implementation of GroupOptionType for integer values.\r
- * The merge of option values returns -1 if all values are -1 otherwise the lowest value.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category Community Framework\r
- */\r
-class GroupOptionTypeInfiniteInverseInteger extends GroupOptionTypeInverseinteger {\r
- /**\r
- * @see wcf\system\option\group\IGroupOptionType::merge()\r
- */\r
- public function merge(array $values) {\r
- foreach ($values as $key => $value) {\r
- if ($value == -1) unset($values[$key]);\r
- }\r
- \r
- if (count($values) == 0) return -1;\r
- return min($values);\r
- }\r
+<?php
+namespace wcf\system\option\group;
+
+/**
+ * GroupOptionTypeInfiniteinverseinteger is an implementation of GroupOptionType for integer values.
+ * The merge of option values returns -1 if all values are -1 otherwise the lowest value.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category Community Framework
+ */
+class GroupOptionTypeInfiniteInverseInteger extends GroupOptionTypeInverseinteger {
+ /**
+ * @see wcf\system\option\group\IGroupOptionType::merge()
+ */
+ public function merge(array $values) {
+ foreach ($values as $key => $value) {
+ if ($value == -1) unset($values[$key]);
+ }
+
+ if (count($values) == 0) return -1;
+ return min($values);
+ }
}
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\OptionTypeInteger;\r
-\r
-/**\r
- * GroupOptionTypeInteger is an implementation of GroupOptionType for integer values.\r
- * The merge of option values returns the highest value.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category Community Framework\r
- */\r
-class GroupOptionTypeInteger extends OptionTypeInteger implements IGroupOptionType {\r
- /**\r
- * @see wcf\system\option\group\IGroupOptionType::merge()\r
- */\r
- public function merge(array $values) {\r
- return max($values);\r
- }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\OptionTypeInteger;
+
+/**
+ * GroupOptionTypeInteger is an implementation of GroupOptionType for integer values.
+ * The merge of option values returns the highest value.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category Community Framework
+ */
+class GroupOptionTypeInteger extends OptionTypeInteger implements IGroupOptionType {
+ /**
+ * @see wcf\system\option\group\IGroupOptionType::merge()
+ */
+ public function merge(array $values) {
+ return max($values);
+ }
}
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\OptionTypeInteger;\r
-\r
-/**\r
- * GroupOptionTypeInverseInteger is an implementation of GroupOptionType for integer values.\r
- * The merge of option values returns the lowest value.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category Community Framework\r
- */\r
-class GroupOptionTypeInverseInteger extends OptionTypeInteger implements IGroupOptionType {\r
- /**\r
- * @see wcf\system\option\group\IGroupOptionType::merge()\r
- */\r
- public function merge(array $values) {\r
- return min($values);\r
- }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\OptionTypeInteger;
+
+/**
+ * GroupOptionTypeInverseInteger is an implementation of GroupOptionType for integer values.
+ * The merge of option values returns the lowest value.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category Community Framework
+ */
+class GroupOptionTypeInverseInteger extends OptionTypeInteger implements IGroupOptionType {
+ /**
+ * @see wcf\system\option\group\IGroupOptionType::merge()
+ */
+ public function merge(array $values) {
+ return min($values);
+ }
}
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\OptionTypeTextarea;\r
-\r
-/**\r
- * GroupOptionTypeTextarea is an implementation of GroupOptionType for text values.\r
- * The merge of option values returns merge of all text values.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category Community Framework\r
- */\r
-class GroupOptionTypeTextarea extends OptionTypeTextarea implements IGroupOptionType {\r
- /**\r
- * @see wcf\system\option\group\IGroupOptionType::merge()\r
- */\r
- public function merge(array $values) {\r
- $result = '';\r
- \r
- foreach ($values as $value) {\r
- if (!empty($result)) $result .= "\n";\r
- $result .= $value;\r
- }\r
-\r
- return $result;\r
- }\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\OptionTypeTextarea;
+
+/**
+ * GroupOptionTypeTextarea is an implementation of GroupOptionType for text values.
+ * The merge of option values returns merge of all text values.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category Community Framework
+ */
+class GroupOptionTypeTextarea extends OptionTypeTextarea implements IGroupOptionType {
+ /**
+ * @see wcf\system\option\group\IGroupOptionType::merge()
+ */
+ public function merge(array $values) {
+ $result = '';
+
+ foreach ($values as $value) {
+ if (!empty($result)) $result .= "\n";
+ $result .= $value;
+ }
+
+ return $result;
+ }
}
-<?php\r
-namespace wcf\system\option\group;\r
-use wcf\system\option\IOptionType;\r
-\r
-/**\r
- * Any group permission type should implement this interface.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.option.group\r
- * @category Community Framework\r
- */\r
-interface IGroupOptionType extends IOptionType {\r
- /**\r
- * Merges the different values of an option to a single value.\r
- * \r
- * @param array $values\r
- * @return mixed $value\r
- */\r
- public function merge(array $values);\r
+<?php
+namespace wcf\system\option\group;
+use wcf\system\option\IOptionType;
+
+/**
+ * Any group permission type should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.option.group
+ * @category Community Framework
+ */
+interface IGroupOptionType extends IOptionType {
+ /**
+ * Merges the different values of an option to a single value.
+ *
+ * @param array $values
+ * @return mixed $value
+ */
+ public function merge(array $values);
}
-<?php\r
-namespace wcf\system\package;\r
-use wcf\system\form\FormDocument;\r
-\r
-/**\r
- * Represents step information within an installation node.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.package\r
- * @category Community Framework\r
- */\r
-class PackageInstallationStep {\r
- /**\r
- * form document object\r
- *\r
- * @var FormDocument\r
- */\r
- protected $document = null;\r
- \r
- /**\r
- * next installation node\r
- *\r
- * @var string\r
- */\r
- protected $node = '';\r
- \r
- /**\r
- * split current node\r
- *\r
- * @var boolean\r
- */\r
- protected $splitNode = false;\r
- \r
- /**\r
- * Sets next installation node.\r
- *\r
- * @param string $node\r
- */\r
- public function setNode($node) {\r
- $this->node = $node;\r
- }\r
- \r
- /**\r
- * Returns next installation node.\r
- *\r
- * @return string\r
- */\r
- public function getNode() {\r
- return $this->node;\r
- }\r
- \r
- /**\r
- * Sets form document object.\r
- *\r
- * @param FormDocument $document\r
- */\r
- public function setDocument(FormDocument $document) {\r
- $this->document = $document;\r
- }\r
- \r
- /**\r
- * Returns HTML-representation of form document object.\r
- *\r
- * @return string\r
- */\r
- public function getTemplate() {\r
- return $this->document->getHTML();\r
- }\r
- \r
- /**\r
- * Returns true if current step holds a form document object.\r
- *\r
- * @return boolean\r
- */\r
- public function hasDocument() {\r
- return ($this->document !== null);\r
- }\r
- \r
- /**\r
- * Enforces node splitting.\r
- */\r
- public function setSplitNode() {\r
- $this->splitNode = true;\r
- }\r
- \r
- /**\r
- * Returns true if node should be splitted.\r
- *\r
- * @return boolean\r
- */\r
- public function splitNode() {\r
- return $this->splitNode;\r
- }\r
+<?php
+namespace wcf\system\package;
+use wcf\system\form\FormDocument;
+
+/**
+ * Represents step information within an installation node.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.package
+ * @category Community Framework
+ */
+class PackageInstallationStep {
+ /**
+ * form document object
+ *
+ * @var FormDocument
+ */
+ protected $document = null;
+
+ /**
+ * next installation node
+ *
+ * @var string
+ */
+ protected $node = '';
+
+ /**
+ * split current node
+ *
+ * @var boolean
+ */
+ protected $splitNode = false;
+
+ /**
+ * Sets next installation node.
+ *
+ * @param string $node
+ */
+ public function setNode($node) {
+ $this->node = $node;
+ }
+
+ /**
+ * Returns next installation node.
+ *
+ * @return string
+ */
+ public function getNode() {
+ return $this->node;
+ }
+
+ /**
+ * Sets form document object.
+ *
+ * @param FormDocument $document
+ */
+ public function setDocument(FormDocument $document) {
+ $this->document = $document;
+ }
+
+ /**
+ * Returns HTML-representation of form document object.
+ *
+ * @return string
+ */
+ public function getTemplate() {
+ return $this->document->getHTML();
+ }
+
+ /**
+ * Returns true if current step holds a form document object.
+ *
+ * @return boolean
+ */
+ public function hasDocument() {
+ return ($this->document !== null);
+ }
+
+ /**
+ * Enforces node splitting.
+ */
+ public function setSplitNode() {
+ $this->splitNode = true;
+ }
+
+ /**
+ * Returns true if node should be splitted.
+ *
+ * @return boolean
+ */
+ public function splitNode() {
+ return $this->splitNode;
+ }
}
-<?php\r
-namespace wcf\system\package\plugin;\r
-\r
-/**\r
- * Any PackageInstallationPlugin should implement this interface.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.package.plugin\r
- * @category Community Framework\r
- */\r
-interface IPackageInstallationPlugin {\r
- /**\r
- * Executes the installation of this plugin.\r
- */\r
- public function install();\r
- \r
- /**\r
- * Executes the update of this plugin.\r
- */\r
- public function update();\r
- \r
- /**\r
- * Returns true, if the uninstallation of the given package should execute this plugin.\r
- * \r
- * @return boolean\r
- */\r
- public function hasUninstall();\r
- \r
- /**\r
- * Executes the uninstallation of this plugin.\r
- */\r
- public function uninstall();\r
+<?php
+namespace wcf\system\package\plugin;
+
+/**
+ * Any PackageInstallationPlugin should implement this interface.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.package.plugin
+ * @category Community Framework
+ */
+interface IPackageInstallationPlugin {
+ /**
+ * Executes the installation of this plugin.
+ */
+ public function install();
+
+ /**
+ * Executes the update of this plugin.
+ */
+ public function update();
+
+ /**
+ * Returns true, if the uninstallation of the given package should execute this plugin.
+ *
+ * @return boolean
+ */
+ public function hasUninstall();
+
+ /**
+ * Executes the uninstallation of this plugin.
+ */
+ public function uninstall();
}
-<?php\r
-namespace wcf\system\package\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\ClassUtil;\r
-\r
-/**\r
- * This PIP installs, updates or deletes page page menu items.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.package.plugin\r
- * @category Community Framework\r
- */\r
-class PageMenuPackageInstallationPlugin extends AbstractMenuPackageInstallationPlugin {\r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$className\r
- */\r
- public $className = 'wcf\data\page\menu\item\PageMenuItemEditor';\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName\r
- */ \r
- public $tableName = 'page_menu_item';\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName\r
- */ \r
- public $tagName = 'pagemenuitem';\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::prepareImport()\r
- */\r
- protected function prepareImport(array $data) {\r
- $result = parent::prepareImport($data);\r
- \r
- // position\r
- $result['menuPosition'] = (!empty($data['elements']['position']) && $data['elements']['position'] == 'footer') ? 'footer' : 'header';\r
- // class name\r
- if (!empty($data['elements']['classname'])) {\r
- $result['className'] = $data['elements']['classname'];\r
- }\r
- \r
- return $result;\r
- }\r
-}\r
+<?php
+namespace wcf\system\package\plugin;
+use wcf\system\exception\SystemException;
+use wcf\util\ClassUtil;
+
+/**
+ * This PIP installs, updates or deletes page page menu items.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.package.plugin
+ * @category Community Framework
+ */
+class PageMenuPackageInstallationPlugin extends AbstractMenuPackageInstallationPlugin {
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$className
+ */
+ public $className = 'wcf\data\page\menu\item\PageMenuItemEditor';
+
+ /**
+ * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName
+ */
+ public $tableName = 'page_menu_item';
+
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName
+ */
+ public $tagName = 'pagemenuitem';
+
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::prepareImport()
+ */
+ protected function prepareImport(array $data) {
+ $result = parent::prepareImport($data);
+
+ // position
+ $result['menuPosition'] = (!empty($data['elements']['position']) && $data['elements']['position'] == 'footer') ? 'footer' : 'header';
+ // class name
+ if (!empty($data['elements']['classname'])) {
+ $result['className'] = $data['elements']['classname'];
+ }
+
+ return $result;
+ }
+}
-<?php\r
-namespace wcf\system\package\plugin;\r
-use wcf\data\style\StyleEditor;\r
-use wcf\data\style\StyleList;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * This PIP installs, updates or deletes style attributes.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.package.plugin\r
- * @category Community Framework\r
- */\r
-class StyleAttributesPackageInstallationPlugin extends AbstractXMLPackageInstallationPlugin {\r
- /**\r
- * list of updated or new style variables\r
- * @var array\r
- */ \r
- protected $styleVariables = array();\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName\r
- */ \r
- public $tableName = 'style_variable_to_attribute';\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName\r
- */\r
- public $tagName = 'styleattribute';\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::handleDelete()\r
- */\r
- protected function handleDelete(array $items) {\r
- $sql = "DELETE FROM wcf".WCF_N."_".$this->tableName."\r
- WHERE packageID = ?\r
- AND cssSelector = ?\r
- AND attributeName = ?\r
- AND variableName = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- \r
- foreach ($items as $item) {\r
- $statement->execute(array(\r
- $this->installation->getPackageID(),\r
- $item['elements']['selector'],\r
- $item['elements']['name'],\r
- $item['elements']['value']\r
- ));\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::prepareImport()\r
- */\r
- protected function prepareImport(array $data) {\r
- return array(\r
- 'cssSelector' => $data['elements']['selector'],\r
- 'attributeName' => $data['elements']['name'],\r
- 'variableName' => $data['elements']['value']\r
- );\r
- }\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::findExistingItem()\r
- */\r
- protected function findExistingItem(array $data) {\r
- return null;\r
- }\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::import()\r
- */ \r
- protected function import(array $row, array $data) {\r
- $this->styleVariables[] = $data;\r
- }\r
- \r
- /**\r
- * It is not possible to properly update and insert values without\r
- * spamming loads of queries for each import, thus delete all\r
- * matching variables first and insert them afterwards.\r
- * \r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::postImport()\r
- */\r
- protected function postImport() {\r
- if (!count($this->styleVariables)) return;\r
- \r
- // delete items first\r
- $sql = "DELETE FROM wcf".WCF_N."_".$this->tableName."\r
- WHERE packageID = ?\r
- AND cssSelector = ?\r
- AND attributeName = ?\r
- AND variableName = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- foreach ($this->styleVariables as $variable) {\r
- $statement->execute(array(\r
- $this->installation->getPackageID(),\r
- $variable['cssSelector'],\r
- $variable['attributeName'],\r
- $variable['variableName']\r
- ));\r
- }\r
- \r
- // insert items\r
- $sql = "INSERT INTO wcf".WCF_N."_".$this->tableName."\r
- (packageID, cssSelector, attributeName, variableName)\r
- VALUES (?, ?, ?, ?)";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- foreach ($this->styleVariables as $variable) {\r
- $statement->execute(array(\r
- $this->installation->getPackageID(),\r
- $variable['cssSelector'],\r
- $variable['attributeName'],\r
- $variable['variableName']\r
- ));\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()\r
- */\r
- public function uninstall() {\r
- parent::uninstall();\r
- \r
- $this->cleanup();\r
- }\r
- \r
- /**\r
- * Updates styles files of all styles.\r
- */\r
- protected function cleanup() {\r
- // get all styles\r
- $styleList = new StyleList();\r
- $styleList->sqlLimit = 0;\r
- $styleList->readObjects();\r
- \r
- foreach ($styleList->getObjects() as $style) {\r
- $styleEditor = new StyleEditor($style);\r
- $style->writeStyleFile();\r
- }\r
- }\r
-}\r
+<?php
+namespace wcf\system\package\plugin;
+use wcf\data\style\StyleEditor;
+use wcf\data\style\StyleList;
+use wcf\system\WCF;
+
+/**
+ * This PIP installs, updates or deletes style attributes.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.package.plugin
+ * @category Community Framework
+ */
+class StyleAttributesPackageInstallationPlugin extends AbstractXMLPackageInstallationPlugin {
+ /**
+ * list of updated or new style variables
+ * @var array
+ */
+ protected $styleVariables = array();
+
+ /**
+ * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName
+ */
+ public $tableName = 'style_variable_to_attribute';
+
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName
+ */
+ public $tagName = 'styleattribute';
+
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::handleDelete()
+ */
+ protected function handleDelete(array $items) {
+ $sql = "DELETE FROM wcf".WCF_N."_".$this->tableName."
+ WHERE packageID = ?
+ AND cssSelector = ?
+ AND attributeName = ?
+ AND variableName = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+
+ foreach ($items as $item) {
+ $statement->execute(array(
+ $this->installation->getPackageID(),
+ $item['elements']['selector'],
+ $item['elements']['name'],
+ $item['elements']['value']
+ ));
+ }
+ }
+
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::prepareImport()
+ */
+ protected function prepareImport(array $data) {
+ return array(
+ 'cssSelector' => $data['elements']['selector'],
+ 'attributeName' => $data['elements']['name'],
+ 'variableName' => $data['elements']['value']
+ );
+ }
+
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::findExistingItem()
+ */
+ protected function findExistingItem(array $data) {
+ return null;
+ }
+
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::import()
+ */
+ protected function import(array $row, array $data) {
+ $this->styleVariables[] = $data;
+ }
+
+ /**
+ * It is not possible to properly update and insert values without
+ * spamming loads of queries for each import, thus delete all
+ * matching variables first and insert them afterwards.
+ *
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::postImport()
+ */
+ protected function postImport() {
+ if (!count($this->styleVariables)) return;
+
+ // delete items first
+ $sql = "DELETE FROM wcf".WCF_N."_".$this->tableName."
+ WHERE packageID = ?
+ AND cssSelector = ?
+ AND attributeName = ?
+ AND variableName = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ foreach ($this->styleVariables as $variable) {
+ $statement->execute(array(
+ $this->installation->getPackageID(),
+ $variable['cssSelector'],
+ $variable['attributeName'],
+ $variable['variableName']
+ ));
+ }
+
+ // insert items
+ $sql = "INSERT INTO wcf".WCF_N."_".$this->tableName."
+ (packageID, cssSelector, attributeName, variableName)
+ VALUES (?, ?, ?, ?)";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ foreach ($this->styleVariables as $variable) {
+ $statement->execute(array(
+ $this->installation->getPackageID(),
+ $variable['cssSelector'],
+ $variable['attributeName'],
+ $variable['variableName']
+ ));
+ }
+ }
+
+ /**
+ * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()
+ */
+ public function uninstall() {
+ parent::uninstall();
+
+ $this->cleanup();
+ }
+
+ /**
+ * Updates styles files of all styles.
+ */
+ protected function cleanup() {
+ // get all styles
+ $styleList = new StyleList();
+ $styleList->sqlLimit = 0;
+ $styleList->readObjects();
+
+ foreach ($styleList->getObjects() as $style) {
+ $styleEditor = new StyleEditor($style);
+ $style->writeStyleFile();
+ }
+ }
+}
-<?php\r
-namespace wcf\system\package\plugin;\r
-use wcf\data\style\StyleEditor;\r
-use wcf\data\style\StyleList;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * This PIP installs, updates or deletes styles.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.package.plugin\r
- * @category Community Framework\r
- */\r
-class StylePackageInstallationPlugin extends AbstractPackageInstallationPlugin {\r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$className\r
- */\r
- public $className = 'wcf\data\style\StyleEditor';\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName\r
- */ \r
- public $tableName = 'style';\r
- \r
- /**\r
- * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName\r
- */ \r
- public $tagName = 'style';\r
- \r
- /** \r
- * @see wcf\system\package\plugin\IPackageInstallationPlugin::install()\r
- */\r
- public function install() {\r
- parent::install();\r
- \r
- // extract style tar\r
- $filename = $this->installation->getArchive()->extractTar($this->instructions['value'], 'style_');\r
- \r
- // import style\r
- $style = StyleEditor::import($filename, $this->installation->getPackageID());\r
- \r
- // set style as default\r
- if (isset($this->instruction['attributes']['default'])) {\r
- $style->setAsDefault();\r
- }\r
- \r
- // remove tmp file\r
- @unlink($filename);\r
- }\r
- \r
- /** \r
- * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()\r
- */\r
- public function uninstall() {\r
- // call uninstall event\r
- EventHandler::fireAction($this, 'uninstall');\r
- \r
- // get all style of this package\r
- $isDefault = false;\r
- $styleList = new StyleList();\r
- $styleList->getConditionBuilder()->add("packageID = ?", array($this->installation->getPackageID()));\r
- $styleList->sqlLimit = 0;\r
- $styleList->readObjects();\r
- \r
- foreach ($styleList->getObjects() as $style) {\r
- $styleEditor = new StyleEditor($style);\r
- $styleEditor->delete();\r
- \r
- $isDefault = $isDefault || $style->isDefault;\r
- }\r
- \r
- // default style deleted\r
- if ($isDefault) {\r
- $styleList = new StyleList();\r
- $styleList->sqlOrderBy = 'style.styleID ASC';\r
- $styleList->sqlLimit = 1;\r
- $styleList->readObjects();\r
- $styles = $styleList->getObjects();\r
- \r
- if (count($styles)) {\r
- $styleEditor = new StyleEditor($styles[0]);\r
- $styleEditor->setAsDefault();\r
- }\r
- }\r
- }\r
-}\r
+<?php
+namespace wcf\system\package\plugin;
+use wcf\data\style\StyleEditor;
+use wcf\data\style\StyleList;
+use wcf\system\WCF;
+
+/**
+ * This PIP installs, updates or deletes styles.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.package.plugin
+ * @category Community Framework
+ */
+class StylePackageInstallationPlugin extends AbstractPackageInstallationPlugin {
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$className
+ */
+ public $className = 'wcf\data\style\StyleEditor';
+
+ /**
+ * @see wcf\system\package\plugin\AbstractPackageInstallationPlugin::$tableName
+ */
+ public $tableName = 'style';
+
+ /**
+ * @see wcf\system\package\plugin\AbstractXMLPackageInstallationPlugin::$tagName
+ */
+ public $tagName = 'style';
+
+ /**
+ * @see wcf\system\package\plugin\IPackageInstallationPlugin::install()
+ */
+ public function install() {
+ parent::install();
+
+ // extract style tar
+ $filename = $this->installation->getArchive()->extractTar($this->instructions['value'], 'style_');
+
+ // import style
+ $style = StyleEditor::import($filename, $this->installation->getPackageID());
+
+ // set style as default
+ if (isset($this->instruction['attributes']['default'])) {
+ $style->setAsDefault();
+ }
+
+ // remove tmp file
+ @unlink($filename);
+ }
+
+ /**
+ * @see wcf\system\package\plugin\IPackageInstallationPlugin::uninstall()
+ */
+ public function uninstall() {
+ // call uninstall event
+ EventHandler::fireAction($this, 'uninstall');
+
+ // get all style of this package
+ $isDefault = false;
+ $styleList = new StyleList();
+ $styleList->getConditionBuilder()->add("packageID = ?", array($this->installation->getPackageID()));
+ $styleList->sqlLimit = 0;
+ $styleList->readObjects();
+
+ foreach ($styleList->getObjects() as $style) {
+ $styleEditor = new StyleEditor($style);
+ $styleEditor->delete();
+
+ $isDefault = $isDefault || $style->isDefault;
+ }
+
+ // default style deleted
+ if ($isDefault) {
+ $styleList = new StyleList();
+ $styleList->sqlOrderBy = 'style.styleID ASC';
+ $styleList->sqlLimit = 1;
+ $styleList->readObjects();
+ $styles = $styleList->getObjects();
+
+ if (count($styles)) {
+ $styleEditor = new StyleEditor($styles[0]);
+ $styleEditor->setAsDefault();
+ }
+ }
+ }
+}
-<?php\r
-namespace wcf\system\request;\r
-\r
-/**\r
- * Represents a page request.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.request\r
- * @category Community Framework\r
- */\r
-class Request {\r
- /**\r
- * page class name\r
- * @var string\r
- */\r
- protected $className = '';\r
- \r
- /**\r
- * page name\r
- * @var string\r
- */\r
- protected $pageName = '';\r
- \r
- /**\r
- * page type\r
- * @var string\r
- */\r
- protected $pageType = '';\r
- \r
- /**\r
- * true, if this request was executed already.\r
- * @var boolean\r
- */\r
- protected $executed = false;\r
- \r
- /**\r
- * Creates a new request object.\r
- * \r
- * @param string $className\r
- * @param string $pageName\r
- * @param string $pageType\r
- */\r
- public function __construct($className, $pageName, $pageType) {\r
- $this->className = $className;\r
- $this->pageName = $pageName;\r
- $this->pageType = $pageType;\r
- }\r
- \r
- /**\r
- * Executes this request.\r
- */\r
- public function execute() {\r
- if (!$this->executed) {\r
- $this->executed = true;\r
- new $this->className();\r
- }\r
- }\r
- \r
- /**\r
- * Returns true, if this request was executed already.\r
- * \r
- * @return boolean\r
- */\r
- public function isExecuted() {\r
- return $this->executed;\r
- }\r
- \r
- /**\r
- * Returns the page class name of this request.\r
- * \r
- * @return string\r
- */\r
- public function getClassName() {\r
- return $this->className; \r
- }\r
- \r
- /**\r
- * Returns the page name of this request.\r
- * \r
- * @return string\r
- */\r
- public function getPageName() {\r
- return $this->pageName;\r
- }\r
- \r
- /**\r
- * Returns the page type of this request.\r
- * \r
- * @return string\r
- */\r
- public function getPageType() {\r
- return $this->pageType;\r
- }\r
+<?php
+namespace wcf\system\request;
+
+/**
+ * Represents a page request.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.request
+ * @category Community Framework
+ */
+class Request {
+ /**
+ * page class name
+ * @var string
+ */
+ protected $className = '';
+
+ /**
+ * page name
+ * @var string
+ */
+ protected $pageName = '';
+
+ /**
+ * page type
+ * @var string
+ */
+ protected $pageType = '';
+
+ /**
+ * true, if this request was executed already.
+ * @var boolean
+ */
+ protected $executed = false;
+
+ /**
+ * Creates a new request object.
+ *
+ * @param string $className
+ * @param string $pageName
+ * @param string $pageType
+ */
+ public function __construct($className, $pageName, $pageType) {
+ $this->className = $className;
+ $this->pageName = $pageName;
+ $this->pageType = $pageType;
+ }
+
+ /**
+ * Executes this request.
+ */
+ public function execute() {
+ if (!$this->executed) {
+ $this->executed = true;
+ new $this->className();
+ }
+ }
+
+ /**
+ * Returns true, if this request was executed already.
+ *
+ * @return boolean
+ */
+ public function isExecuted() {
+ return $this->executed;
+ }
+
+ /**
+ * Returns the page class name of this request.
+ *
+ * @return string
+ */
+ public function getClassName() {
+ return $this->className;
+ }
+
+ /**
+ * Returns the page name of this request.
+ *
+ * @return string
+ */
+ public function getPageName() {
+ return $this->pageName;
+ }
+
+ /**
+ * Returns the page type of this request.
+ *
+ * @return string
+ */
+ public function getPageType() {
+ return $this->pageType;
+ }
}
-<?php\r
-namespace wcf\system\request;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\exception\IllegalLinkException;\r
-use wcf\system\SingletonFactory;\r
-\r
-/**\r
- * Handles http requests.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.request\r
- * @category Community Framework\r
- */\r
-class RequestHandler extends SingletonFactory {\r
- /**\r
- * active request object\r
- * @var Request\r
- */\r
- protected $activeRequest = null;\r
- \r
- /**\r
- * Handles a http request\r
- *\r
- * @param string $application\r
- */\r
- public function handle($application = 'wcf', $isACP = false) {\r
- // default values\r
- $pageName = 'Index';\r
- $pageType = 'page';\r
- \r
- if (!empty($_GET['page']) || !empty($_POST['page'])) {\r
- $pageName = (!empty($_GET['page']) ? $_GET['page'] : $_POST['page']);\r
- $pageType = 'page';\r
- }\r
- else if (!empty($_GET['form']) || !empty($_POST['form'])) {\r
- $pageName = (!empty($_GET['form']) ? $_GET['form'] : $_POST['form']);\r
- $pageType = 'form';\r
- }\r
- else if (!empty($_GET['action']) || !empty($_POST['action'])) {\r
- $pageName = (!empty($_GET['action']) ? $_GET['action'] : $_POST['action']);\r
- $pageType = 'action';\r
- }\r
- \r
- // build request\r
- $this->buildRequest($pageName, $pageType, $application, $isACP);\r
- // start request\r
- $this->activeRequest->execute();\r
- }\r
- \r
- /**\r
- * Builds a new request.\r
- *\r
- * @param string $pageName\r
- * @param string $application\r
- * @param string $pageType\r
- * @param boolean $isACP\r
- */\r
- protected function buildRequest($pageName, $pageType, $application, $isACP) {\r
- try {\r
- // validate class name\r
- if (!preg_match('~^[a-z0-9_]+$~i', $pageName)) {\r
- throw new SystemException("Illegal class name '".$pageName."'", 11009);\r
- }\r
- \r
- // find class\r
- $className = $application.'\\'.($isACP ? 'acp\\' : '').$pageType.'\\'.ucfirst($pageName).ucfirst($pageType);\r
- if ($application != 'wcf' && !class_exists($className)) {\r
- $className = 'wcf\\'.($isACP ? 'acp\\' : '').$pageType.'\\'.ucfirst($pageName).ucfirst($pageType);\r
- }\r
- if (!class_exists($className)) {\r
- throw new SystemException("unable to find class '".$className."'", 11000);\r
- }\r
- \r
- // check whether the class is abstract\r
- $reflectionClass = new \ReflectionClass($className);\r
- if ($reflectionClass->isAbstract()) {\r
- throw new SystemException("class '".$className."' is abstract");\r
- }\r
- \r
- $this->activeRequest = new Request($className, $pageName, $pageType);\r
- }\r
- catch (SystemException $e) {\r
- throw new IllegalLinkException();\r
- }\r
- }\r
- \r
- /**\r
- * Returns the active request object.\r
- *\r
- * @return Request\r
- */\r
- public function getActiveRequest() {\r
- return $this->activeRequest;\r
- }\r
+<?php
+namespace wcf\system\request;
+use wcf\system\exception\SystemException;
+use wcf\system\exception\IllegalLinkException;
+use wcf\system\SingletonFactory;
+
+/**
+ * Handles http requests.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.request
+ * @category Community Framework
+ */
+class RequestHandler extends SingletonFactory {
+ /**
+ * active request object
+ * @var Request
+ */
+ protected $activeRequest = null;
+
+ /**
+ * Handles a http request
+ *
+ * @param string $application
+ */
+ public function handle($application = 'wcf', $isACP = false) {
+ // default values
+ $pageName = 'Index';
+ $pageType = 'page';
+
+ if (!empty($_GET['page']) || !empty($_POST['page'])) {
+ $pageName = (!empty($_GET['page']) ? $_GET['page'] : $_POST['page']);
+ $pageType = 'page';
+ }
+ else if (!empty($_GET['form']) || !empty($_POST['form'])) {
+ $pageName = (!empty($_GET['form']) ? $_GET['form'] : $_POST['form']);
+ $pageType = 'form';
+ }
+ else if (!empty($_GET['action']) || !empty($_POST['action'])) {
+ $pageName = (!empty($_GET['action']) ? $_GET['action'] : $_POST['action']);
+ $pageType = 'action';
+ }
+
+ // build request
+ $this->buildRequest($pageName, $pageType, $application, $isACP);
+ // start request
+ $this->activeRequest->execute();
+ }
+
+ /**
+ * Builds a new request.
+ *
+ * @param string $pageName
+ * @param string $application
+ * @param string $pageType
+ * @param boolean $isACP
+ */
+ protected function buildRequest($pageName, $pageType, $application, $isACP) {
+ try {
+ // validate class name
+ if (!preg_match('~^[a-z0-9_]+$~i', $pageName)) {
+ throw new SystemException("Illegal class name '".$pageName."'", 11009);
+ }
+
+ // find class
+ $className = $application.'\\'.($isACP ? 'acp\\' : '').$pageType.'\\'.ucfirst($pageName).ucfirst($pageType);
+ if ($application != 'wcf' && !class_exists($className)) {
+ $className = 'wcf\\'.($isACP ? 'acp\\' : '').$pageType.'\\'.ucfirst($pageName).ucfirst($pageType);
+ }
+ if (!class_exists($className)) {
+ throw new SystemException("unable to find class '".$className."'", 11000);
+ }
+
+ // check whether the class is abstract
+ $reflectionClass = new \ReflectionClass($className);
+ if ($reflectionClass->isAbstract()) {
+ throw new SystemException("class '".$className."' is abstract");
+ }
+
+ $this->activeRequest = new Request($className, $pageName, $pageType);
+ }
+ catch (SystemException $e) {
+ throw new IllegalLinkException();
+ }
+ }
+
+ /**
+ * Returns the active request object.
+ *
+ * @return Request
+ */
+ public function getActiveRequest() {
+ return $this->activeRequest;
+ }
}
-<?php\r
-namespace wcf\system\session;\r
-use wcf\util\HeaderUtil;\r
-\r
-/**\r
- * SessionFactory handles session for active user.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.session\r
- * @category Community Framework\r
- */\r
-class SessionFactory extends ACPSessionFactory {\r
- /**\r
- * @see ACPSessionFactory::$sessionEditor\r
- */ \r
- protected $sessionEditor = 'wcf\data\session\SessionEditor';\r
- \r
- /**\r
- * @see ACPSessionFactory::$sessionDataEditor\r
- */\r
- protected $sessionDataEditor = 'wcf\data\session\data\SessionDataEditor';\r
- \r
- /**\r
- * @see ACPSessionFactory::readSessionID()\r
- */ \r
- protected function readSessionID() {\r
- $sessionID = parent::readSessionID();\r
- \r
- // get sessionID from cookie\r
- if (empty($sessionID) && isset($_COOKIE[COOKIE_PREFIX.'cookieHash'])) {\r
- $sessionID = $_COOKIE[COOKIE_PREFIX . 'cookieHash'];\r
- }\r
- \r
- return $sessionID;\r
- }\r
- \r
- /**\r
- * @see ACPSessionFactory::init()\r
- */ \r
- protected function init() {\r
- $usesCookies = true;\r
- \r
- if (isset($_COOKIE[COOKIE_PREFIX.'cookieHash'])) {\r
- if ($_COOKIE[COOKIE_PREFIX.'cookieHash'] != SessionHandler::getInstance()->sessionID) {\r
- $usesCookies = false;\r
- }\r
- }\r
- else {\r
- $usesCookies = false;\r
- }\r
- \r
- if (!$usesCookies) {\r
- // cookie support will be enabled upon next request\r
- HeaderUtil::setCookie('cookieHash', SessionHandler::getInstance()->sessionID);\r
- }\r
- else {\r
- // enable cookie support\r
- SessionHandler::getInstance()->enableCookies();\r
- }\r
- \r
- parent::init();\r
- }\r
+<?php
+namespace wcf\system\session;
+use wcf\util\HeaderUtil;
+
+/**
+ * SessionFactory handles session for active user.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.session
+ * @category Community Framework
+ */
+class SessionFactory extends ACPSessionFactory {
+ /**
+ * @see ACPSessionFactory::$sessionEditor
+ */
+ protected $sessionEditor = 'wcf\data\session\SessionEditor';
+
+ /**
+ * @see ACPSessionFactory::$sessionDataEditor
+ */
+ protected $sessionDataEditor = 'wcf\data\session\data\SessionDataEditor';
+
+ /**
+ * @see ACPSessionFactory::readSessionID()
+ */
+ protected function readSessionID() {
+ $sessionID = parent::readSessionID();
+
+ // get sessionID from cookie
+ if (empty($sessionID) && isset($_COOKIE[COOKIE_PREFIX.'cookieHash'])) {
+ $sessionID = $_COOKIE[COOKIE_PREFIX . 'cookieHash'];
+ }
+
+ return $sessionID;
+ }
+
+ /**
+ * @see ACPSessionFactory::init()
+ */
+ protected function init() {
+ $usesCookies = true;
+
+ if (isset($_COOKIE[COOKIE_PREFIX.'cookieHash'])) {
+ if ($_COOKIE[COOKIE_PREFIX.'cookieHash'] != SessionHandler::getInstance()->sessionID) {
+ $usesCookies = false;
+ }
+ }
+ else {
+ $usesCookies = false;
+ }
+
+ if (!$usesCookies) {
+ // cookie support will be enabled upon next request
+ HeaderUtil::setCookie('cookieHash', SessionHandler::getInstance()->sessionID);
+ }
+ else {
+ // enable cookie support
+ SessionHandler::getInstance()->enableCookies();
+ }
+
+ parent::init();
+ }
}
-<?php\r
-namespace wcf\system\setup;\r
-\r
-/**\r
- * A FileHandler class logs files and checks their overwriting rights.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.setup\r
- * @category Community Framework\r
- */\r
-interface IFileHandler {\r
- /**\r
- * Checks the overwriting rights of the given files.\r
- * \r
- * @param array $files\r
- */\r
- public function checkFiles(array $files);\r
- \r
- /**\r
- * Logs the given list of files.\r
- * \r
- * @param array $files\r
- */\r
- public function logFiles(array $files);\r
+<?php
+namespace wcf\system\setup;
+
+/**
+ * A FileHandler class logs files and checks their overwriting rights.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.setup
+ * @category Community Framework
+ */
+interface IFileHandler {
+ /**
+ * Checks the overwriting rights of the given files.
+ *
+ * @param array $files
+ */
+ public function checkFiles(array $files);
+
+ /**
+ * Logs the given list of files.
+ *
+ * @param array $files
+ */
+ public function logFiles(array $files);
}
-<?php\r
-namespace wcf\system\setup;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\io\Tar;\r
-use wcf\util\FileUtil;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * Installer extracts folders and files from a tar archive.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.setup\r
- * @category Community Framework\r
- */\r
-class Installer {\r
- protected $targetDir, $source, $folder, $fileHandler;\r
- \r
- /**\r
- * Creates a new Installer object.\r
- *\r
- * @param string $targetDir extract the files in this dir\r
- * @param string $source name of the source tar archive\r
- * @param FileHandler $fileHandler\r
- * @param string $folder extract only the files from this subfolder\r
- */\r
- public function __construct($targetDir, $source, $fileHandler = null, $folder = '') {\r
- $this->targetDir = FileUtil::addTrailingSlash($targetDir);\r
- $this->source = $source;\r
- $this->folder = $folder;\r
- $this->fileHandler = $fileHandler;\r
- $this->install();\r
- }\r
- \r
- /**\r
- * Creates the target directory if necessary.\r
- */\r
- protected function createTargetDir() {\r
- if (!@is_dir($this->targetDir)) {\r
- if (!FileUtil::makePath($this->targetDir, (FileUtil::isApacheModule() ? 0777 : 0755))) {\r
- throw new SystemException("Could not create dir '".$this->targetDir."'", 11011);\r
- }\r
- }\r
- if (FileUtil::isApacheModule() || !is_writeable($this->targetDir)) {\r
- $this->makeWriteable($this->targetDir);\r
- }\r
- }\r
- \r
- /**\r
- * Creates a directory in the target directory.\r
- *\r
- * @param string $dir\r
- */\r
- protected function createDir($dir) {\r
- if (!@is_dir($this->targetDir.$dir)) {\r
- $oldumask = umask(0);\r
- if (!@mkdir($this->targetDir.$dir, 0755, true)) {\r
- throw new SystemException("Could not create dir '".$this->targetDir.$dir."'", 11011);\r
- }\r
- umask($oldumask);\r
- }\r
- if (FileUtil::isApacheModule() || !is_writeable($this->targetDir.$dir)) {\r
- $this->makeWriteable($this->targetDir.$dir);\r
- }\r
- }\r
- \r
- /**\r
- * Touches a file in the target directory.\r
- *\r
- * @param string $file\r
- */\r
- public function touchFile($file) {\r
- @touch($this->targetDir.$file);\r
- $this->makeWriteable($this->targetDir.$file);\r
- }\r
- \r
- /**\r
- * Creates a file in the target directory.\r
- *\r
- * @param string $file\r
- * @param integer $index\r
- * @param Tar $tar\r
- */\r
- protected function createFile($file, $index, Tar $tar) {\r
- $tar->extract($index, $this->targetDir.$file);\r
- if (FileUtil::isApacheModule() || !is_writeable($this->targetDir.$file)) {\r
- $this->makeWriteable($this->targetDir.$file);\r
- }\r
- }\r
- \r
- /**\r
- * Starts the extracting of the files.\r
- */\r
- protected function install() {\r
- $this->createTargetDir();\r
- \r
- // open source archive\r
- $tar = new Tar($this->source);\r
- \r
- // distinct directories and files\r
- $directories = array();\r
- $files = array();\r
- foreach ($tar->getContentList() as $index => $file) {\r
- if (empty($this->folder) || StringUtil::indexOf($file['filename'], $this->folder) === 0) {\r
- if (!empty($this->folder)) {\r
- $file['filename'] = StringUtil::replace($this->folder, '', $file['filename']);\r
- }\r
- \r
- // remove leading slash\r
- $file['filename'] = FileUtil::removeLeadingSlash($file['filename']);\r
- if ($file['type'] == 'folder') {\r
- // remove trailing slash\r
- $directories[] = FileUtil::removeTrailingSlash($file['filename']);\r
- }\r
- else {\r
- $files[$index] = $file['filename'];\r
- }\r
- }\r
- }\r
- \r
- $this->checkFiles($files);\r
-\r
- // now create the directories\r
- $errors = array();\r
- foreach ($directories as $dir) {\r
- try {\r
- $this->createDir($dir);\r
- }\r
- catch (SystemException $e) {\r
- $errors[] = array('file' => $dir, 'code' => $e->getCode(), 'message' => $e->getMessage());\r
- }\r
- }\r
-\r
- // now untar all files\r
- foreach ($files as $index => $file) {\r
- try {\r
- $this->createFile($file, $index, $tar);\r
- }\r
- catch (SystemException $e) {\r
- $errors[] = array('file' => $file, 'code' => $e->getCode(), 'message' => $e->getMessage());\r
- }\r
- }\r
- if (count($errors) > 0) {\r
- throw new SystemException('error(s) during the installation of the files.', 11111, $errors);\r
- }\r
- \r
- $this->logFiles($files);\r
-\r
- // close tar\r
- $tar->close();\r
- }\r
- \r
- /**\r
- * Checkes whether the given files overwriting locked existing files.\r
- *\r
- * @param array $files list of files\r
- */\r
- protected function checkFiles(&$files) {\r
- if ($this->fileHandler != null && $this->fileHandler instanceof IFileHandler) {\r
- $this->fileHandler->checkFiles($files);\r
- }\r
- }\r
- \r
- /**\r
- * Logs the extracted files.\r
- *\r
- * @param array $files list of files\r
- */\r
- protected function logFiles(&$files) {\r
- if ($this->fileHandler != null && $this->fileHandler instanceof IFileHandler) {\r
- $this->fileHandler->logFiles($files);\r
- }\r
- }\r
- \r
- /**\r
- * Makes a file or directory writeable.\r
- *\r
- * @param string $target\r
- */\r
- protected function makeWriteable($target) {\r
- if (!preg_match('/^WIN/i', PHP_OS)) {\r
- if (!@chmod($target, 0777)) {\r
- //throw new SystemException("Could not chmod file '".$target."'", 11005);\r
- }\r
- }\r
- }\r
+<?php
+namespace wcf\system\setup;
+use wcf\system\exception\SystemException;
+use wcf\system\io\Tar;
+use wcf\util\FileUtil;
+use wcf\util\StringUtil;
+
+/**
+ * Installer extracts folders and files from a tar archive.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.setup
+ * @category Community Framework
+ */
+class Installer {
+ protected $targetDir, $source, $folder, $fileHandler;
+
+ /**
+ * Creates a new Installer object.
+ *
+ * @param string $targetDir extract the files in this dir
+ * @param string $source name of the source tar archive
+ * @param FileHandler $fileHandler
+ * @param string $folder extract only the files from this subfolder
+ */
+ public function __construct($targetDir, $source, $fileHandler = null, $folder = '') {
+ $this->targetDir = FileUtil::addTrailingSlash($targetDir);
+ $this->source = $source;
+ $this->folder = $folder;
+ $this->fileHandler = $fileHandler;
+ $this->install();
+ }
+
+ /**
+ * Creates the target directory if necessary.
+ */
+ protected function createTargetDir() {
+ if (!@is_dir($this->targetDir)) {
+ if (!FileUtil::makePath($this->targetDir, (FileUtil::isApacheModule() ? 0777 : 0755))) {
+ throw new SystemException("Could not create dir '".$this->targetDir."'", 11011);
+ }
+ }
+ if (FileUtil::isApacheModule() || !is_writeable($this->targetDir)) {
+ $this->makeWriteable($this->targetDir);
+ }
+ }
+
+ /**
+ * Creates a directory in the target directory.
+ *
+ * @param string $dir
+ */
+ protected function createDir($dir) {
+ if (!@is_dir($this->targetDir.$dir)) {
+ $oldumask = umask(0);
+ if (!@mkdir($this->targetDir.$dir, 0755, true)) {
+ throw new SystemException("Could not create dir '".$this->targetDir.$dir."'", 11011);
+ }
+ umask($oldumask);
+ }
+ if (FileUtil::isApacheModule() || !is_writeable($this->targetDir.$dir)) {
+ $this->makeWriteable($this->targetDir.$dir);
+ }
+ }
+
+ /**
+ * Touches a file in the target directory.
+ *
+ * @param string $file
+ */
+ public function touchFile($file) {
+ @touch($this->targetDir.$file);
+ $this->makeWriteable($this->targetDir.$file);
+ }
+
+ /**
+ * Creates a file in the target directory.
+ *
+ * @param string $file
+ * @param integer $index
+ * @param Tar $tar
+ */
+ protected function createFile($file, $index, Tar $tar) {
+ $tar->extract($index, $this->targetDir.$file);
+ if (FileUtil::isApacheModule() || !is_writeable($this->targetDir.$file)) {
+ $this->makeWriteable($this->targetDir.$file);
+ }
+ }
+
+ /**
+ * Starts the extracting of the files.
+ */
+ protected function install() {
+ $this->createTargetDir();
+
+ // open source archive
+ $tar = new Tar($this->source);
+
+ // distinct directories and files
+ $directories = array();
+ $files = array();
+ foreach ($tar->getContentList() as $index => $file) {
+ if (empty($this->folder) || StringUtil::indexOf($file['filename'], $this->folder) === 0) {
+ if (!empty($this->folder)) {
+ $file['filename'] = StringUtil::replace($this->folder, '', $file['filename']);
+ }
+
+ // remove leading slash
+ $file['filename'] = FileUtil::removeLeadingSlash($file['filename']);
+ if ($file['type'] == 'folder') {
+ // remove trailing slash
+ $directories[] = FileUtil::removeTrailingSlash($file['filename']);
+ }
+ else {
+ $files[$index] = $file['filename'];
+ }
+ }
+ }
+
+ $this->checkFiles($files);
+
+ // now create the directories
+ $errors = array();
+ foreach ($directories as $dir) {
+ try {
+ $this->createDir($dir);
+ }
+ catch (SystemException $e) {
+ $errors[] = array('file' => $dir, 'code' => $e->getCode(), 'message' => $e->getMessage());
+ }
+ }
+
+ // now untar all files
+ foreach ($files as $index => $file) {
+ try {
+ $this->createFile($file, $index, $tar);
+ }
+ catch (SystemException $e) {
+ $errors[] = array('file' => $file, 'code' => $e->getCode(), 'message' => $e->getMessage());
+ }
+ }
+ if (count($errors) > 0) {
+ throw new SystemException('error(s) during the installation of the files.', 11111, $errors);
+ }
+
+ $this->logFiles($files);
+
+ // close tar
+ $tar->close();
+ }
+
+ /**
+ * Checkes whether the given files overwriting locked existing files.
+ *
+ * @param array $files list of files
+ */
+ protected function checkFiles(&$files) {
+ if ($this->fileHandler != null && $this->fileHandler instanceof IFileHandler) {
+ $this->fileHandler->checkFiles($files);
+ }
+ }
+
+ /**
+ * Logs the extracted files.
+ *
+ * @param array $files list of files
+ */
+ protected function logFiles(&$files) {
+ if ($this->fileHandler != null && $this->fileHandler instanceof IFileHandler) {
+ $this->fileHandler->logFiles($files);
+ }
+ }
+
+ /**
+ * Makes a file or directory writeable.
+ *
+ * @param string $target
+ */
+ protected function makeWriteable($target) {
+ if (!preg_match('/^WIN/i', PHP_OS)) {
+ if (!@chmod($target, 0777)) {
+ //throw new SystemException("Could not chmod file '".$target."'", 11005);
+ }
+ }
+ }
}
-<?php\r
-namespace wcf\system\setup;\r
-\r
-/**\r
- * Uninstaller deletes files and directories.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.setup\r
- * @category Community Framework\r
- */\r
-class Uninstaller {\r
- protected $targetDir, $files, $deleteEmptyTargetDir, $deleteEmptyDirectories;\r
- \r
- /**\r
- * Creates a new Uninstaller object.\r
- *\r
- * @param string $targetDir\r
- * @param array $files delete the files\r
- * @param boolean $deleteEmptyTargetDir delete target dir if empty\r
- * @param boolean $deleteEmptyDirectories delete sub-directories if empty\r
- */\r
- public function __construct($targetDir, $files, $deleteEmptyTargetDir, $deleteEmptyDirectories) {\r
- $this->targetDir = $targetDir;\r
- $this->files = $files;\r
- $this->deleteEmptyTargetDir = $deleteEmptyTargetDir;\r
- $this->deleteEmptyDirectories = $deleteEmptyDirectories;\r
- $this->uninstall();\r
- }\r
- \r
- /**\r
- * Checks if the target directory is a valid directory.\r
- */\r
- protected function checkTargetDir() {\r
- return is_dir($this->targetDir);\r
- }\r
- \r
- /**\r
- * Returns true if a directory is emtpy.\r
- *\r
- * @param string $dir\r
- * @return boolean true if dir is empty\r
- */\r
- protected function isEmpty($dir) {\r
- if (is_dir($dir)) {\r
- // subtract default directories . and ..\r
- return count(scandir($dir)) - 2 == 0;\r
- }\r
- return false;\r
- }\r
- \r
- /**\r
- * Deletes a file.\r
- *\r
- * @param string $file\r
- */\r
- protected function deleteFile($file) {\r
- @unlink($file);\r
- }\r
- \r
- /**\r
- * Deletes a directory.\r
- *\r
- * @param string $dir\r
- */\r
- protected function deleteDir($dir) {\r
- @rmdir($dir);\r
- }\r
- \r
- /**\r
- * Starts the deletion of the files.\r
- */\r
- protected function uninstall() {\r
- if ($this->checkTargetDir()) {\r
- \r
- // delete all files\r
- $directories = array();\r
- foreach ($this->files as $file) {\r
- $this->deleteFile($this->targetDir.$file);\r
-\r
- // store directory if this file is not direct in the targetdirectory\r
- $dirname = dirname($file);\r
- if ($dirname != '.') {\r
- // split the directory\r
- $path = explode("/", $dirname);\r
- \r
- // store the directory in a key which is the representation\r
- // for the depth of this directory.\r
- // use dirname as key to store each dir only once\r
- $directories[count($path)][$dirname] = $dirname;\r
- \r
- // store the parent directories\r
- while (array_pop($path)) {\r
- $dirname = implode("/", $path);\r
- if (!empty($dirname)) {\r
- $directories[count($path)][$dirname] = $dirname;\r
- }\r
- }\r
- }\r
- }\r
- \r
- // delete direcotries\r
- if ($this->deleteEmptyDirectories) {\r
- // the deepest diretories first\r
- krsort($directories, SORT_NUMERIC);\r
- foreach ($directories as $depth) {\r
- foreach ($depth as $dir) {\r
- if ($this->isEmpty($this->targetDir.$dir)) {\r
- $this->deleteDir($this->targetDir.$dir);\r
- }\r
- }\r
- }\r
- }\r
- \r
- // delete target directory\r
- if ($this->deleteEmptyTargetDir && $this->isEmpty($this->targetDir)) {\r
- $this->deleteDir($this->targetDir);\r
- }\r
- }\r
- // TODO: else throw SystemException ?\r
- }\r
- \r
+<?php
+namespace wcf\system\setup;
+
+/**
+ * Uninstaller deletes files and directories.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.setup
+ * @category Community Framework
+ */
+class Uninstaller {
+ protected $targetDir, $files, $deleteEmptyTargetDir, $deleteEmptyDirectories;
+
+ /**
+ * Creates a new Uninstaller object.
+ *
+ * @param string $targetDir
+ * @param array $files delete the files
+ * @param boolean $deleteEmptyTargetDir delete target dir if empty
+ * @param boolean $deleteEmptyDirectories delete sub-directories if empty
+ */
+ public function __construct($targetDir, $files, $deleteEmptyTargetDir, $deleteEmptyDirectories) {
+ $this->targetDir = $targetDir;
+ $this->files = $files;
+ $this->deleteEmptyTargetDir = $deleteEmptyTargetDir;
+ $this->deleteEmptyDirectories = $deleteEmptyDirectories;
+ $this->uninstall();
+ }
+
+ /**
+ * Checks if the target directory is a valid directory.
+ */
+ protected function checkTargetDir() {
+ return is_dir($this->targetDir);
+ }
+
+ /**
+ * Returns true if a directory is emtpy.
+ *
+ * @param string $dir
+ * @return boolean true if dir is empty
+ */
+ protected function isEmpty($dir) {
+ if (is_dir($dir)) {
+ // subtract default directories . and ..
+ return count(scandir($dir)) - 2 == 0;
+ }
+ return false;
+ }
+
+ /**
+ * Deletes a file.
+ *
+ * @param string $file
+ */
+ protected function deleteFile($file) {
+ @unlink($file);
+ }
+
+ /**
+ * Deletes a directory.
+ *
+ * @param string $dir
+ */
+ protected function deleteDir($dir) {
+ @rmdir($dir);
+ }
+
+ /**
+ * Starts the deletion of the files.
+ */
+ protected function uninstall() {
+ if ($this->checkTargetDir()) {
+
+ // delete all files
+ $directories = array();
+ foreach ($this->files as $file) {
+ $this->deleteFile($this->targetDir.$file);
+
+ // store directory if this file is not direct in the targetdirectory
+ $dirname = dirname($file);
+ if ($dirname != '.') {
+ // split the directory
+ $path = explode("/", $dirname);
+
+ // store the directory in a key which is the representation
+ // for the depth of this directory.
+ // use dirname as key to store each dir only once
+ $directories[count($path)][$dirname] = $dirname;
+
+ // store the parent directories
+ while (array_pop($path)) {
+ $dirname = implode("/", $path);
+ if (!empty($dirname)) {
+ $directories[count($path)][$dirname] = $dirname;
+ }
+ }
+ }
+ }
+
+ // delete direcotries
+ if ($this->deleteEmptyDirectories) {
+ // the deepest diretories first
+ krsort($directories, SORT_NUMERIC);
+ foreach ($directories as $depth) {
+ foreach ($depth as $dir) {
+ if ($this->isEmpty($this->targetDir.$dir)) {
+ $this->deleteDir($this->targetDir.$dir);
+ }
+ }
+ }
+ }
+
+ // delete target directory
+ if ($this->deleteEmptyTargetDir && $this->isEmpty($this->targetDir)) {
+ $this->deleteDir($this->targetDir);
+ }
+ }
+ // TODO: else throw SystemException ?
+ }
+
}
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Block functions encloses a template block and operate on the contents of this block.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category Community Framework\r
- */\r
-interface ITemplatePluginBlock {\r
- /**\r
- * Executes this template block.\r
- * \r
- * @param array $tagArgs\r
- * @param string $blockContent\r
- * @param TemplateEngine $tplObj\r
- * @return string output\r
- */\r
- public function execute($tagArgs, $blockContent, TemplateEngine $tplObj);\r
- \r
- /**\r
- * Initialises this template block.\r
- * \r
- * @param array $tagArgs\r
- * @param TemplateEngine $tplObj\r
- */\r
- public function init($tagArgs, TemplateEngine $tplObj);\r
- \r
- /**\r
- * This function is called before every execution of this block function.\r
- * \r
- * @param TemplateEngine $tplObj\r
- * @return boolean\r
- */\r
- public function next(TemplateEngine $tplObj);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Block functions encloses a template block and operate on the contents of this block.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template
+ * @category Community Framework
+ */
+interface ITemplatePluginBlock {
+ /**
+ * Executes this template block.
+ *
+ * @param array $tagArgs
+ * @param string $blockContent
+ * @param TemplateEngine $tplObj
+ * @return string output
+ */
+ public function execute($tagArgs, $blockContent, TemplateEngine $tplObj);
+
+ /**
+ * Initialises this template block.
+ *
+ * @param array $tagArgs
+ * @param TemplateEngine $tplObj
+ */
+ public function init($tagArgs, TemplateEngine $tplObj);
+
+ /**
+ * This function is called before every execution of this block function.
+ *
+ * @param TemplateEngine $tplObj
+ * @return boolean
+ */
+ public function next(TemplateEngine $tplObj);
}
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Compiler functions are called during the compilation of a template.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category Community Framework\r
- */\r
-interface ITemplatePluginCompiler {\r
- /**\r
- * Executes the start tag of this compiler function.\r
- * \r
- * @param array $tagArgs \r
- * @param TemplateScriptingCompiler $compiler\r
- * @return string php code \r
- */\r
- public function executeStart($tagArgs, TemplateScriptingCompiler $compiler);\r
- \r
- /**\r
- * Executes the end tag of this compiler function.\r
- * \r
- * @param TemplateScriptingCompiler $compiler \r
- * @return string php code \r
- */\r
- public function executeEnd(TemplateScriptingCompiler $tplObj);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Compiler functions are called during the compilation of a template.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template
+ * @category Community Framework
+ */
+interface ITemplatePluginCompiler {
+ /**
+ * Executes the start tag of this compiler function.
+ *
+ * @param array $tagArgs
+ * @param TemplateScriptingCompiler $compiler
+ * @return string php code
+ */
+ public function executeStart($tagArgs, TemplateScriptingCompiler $compiler);
+
+ /**
+ * Executes the end tag of this compiler function.
+ *
+ * @param TemplateScriptingCompiler $compiler
+ * @return string php code
+ */
+ public function executeEnd(TemplateScriptingCompiler $tplObj);
}
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Template functions are identical to template blocks, but they have no closing tag.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category Community Framework\r
- */\r
-interface ITemplatePluginFunction {\r
- /**\r
- * Executes this template function.\r
- * \r
- * @param array $tagArgs\r
- * @param TemplateEngine $tplObj\r
- * @return string output\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Template functions are identical to template blocks, but they have no closing tag.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template
+ * @category Community Framework
+ */
+interface ITemplatePluginFunction {
+ /**
+ * Executes this template function.
+ *
+ * @param array $tagArgs
+ * @param TemplateEngine $tplObj
+ * @return string output
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj);
}
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Modifiers are functions that are applied to a variable in the template \r
- * before it is displayed or used in some other context.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category Community Framework\r
- */\r
-interface ITemplatePluginModifier {\r
- /**\r
- * Executes this modifier.\r
- * \r
- * @param array $tagArgs \r
- * @param TemplateEngine $tplObj\r
- * @return string output \r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Modifiers are functions that are applied to a variable in the template
+ * before it is displayed or used in some other context.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template
+ * @category Community Framework
+ */
+interface ITemplatePluginModifier {
+ /**
+ * Executes this modifier.
+ *
+ * @param array $tagArgs
+ * @param TemplateEngine $tplObj
+ * @return string output
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj);
}
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * Prefilters are used to process the source of the template immediately before compilation.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category Community Framework\r
- */\r
-interface ITemplatePluginPrefilter {\r
- /**\r
- * Executes this prefilter.\r
- * \r
- * @param string $templateName\r
- * @param string $sourceContent \r
- * @param TemplateScriptingCompiler $compiler \r
- * @return string $sourceContent\r
- */\r
- public function execute($templateName, $sourceContent, TemplateScriptingCompiler $compiler);\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * Prefilters are used to process the source of the template immediately before compilation.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template
+ * @category Community Framework
+ */
+interface ITemplatePluginPrefilter {
+ /**
+ * Executes this prefilter.
+ *
+ * @param string $templateName
+ * @param string $sourceContent
+ * @param TemplateScriptingCompiler $compiler
+ * @return string $sourceContent
+ */
+ public function execute($templateName, $sourceContent, TemplateScriptingCompiler $compiler);
}
-<?php\r
-namespace wcf\system\template;\r
-\r
-/**\r
- * SetupTemplate loads and displays template in the setup process.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category Community Framework\r
- */\r
-class SetupTemplate extends Template {\r
- protected $templatePath = '';\r
- \r
- /**\r
- * @see Template::setTemplatePaths()\r
- */\r
- public function setTemplatePaths($templatePaths) {\r
- if (is_array($templatePaths)) $this->templatePath = array_shift($templatePaths);\r
- else $this->templatePath = $templatePaths;\r
- }\r
- \r
- /**\r
- * @see Template::loadTemplateStructure()\r
- */\r
- protected function loadTemplateStructure() {}\r
- \r
- /**\r
- * @see Template::getSourceFilename()\r
- */\r
- public function getSourceFilename($templateName, $packageID = 0) {\r
- return $this->templatePath.TMP_FILE_PREFIX.$templateName.'.tpl';\r
- }\r
- \r
- /**\r
- * @see Template::getCompiledFilename()\r
- */\r
- public function getCompiledFilename($templateName, $packageID = 0) {\r
- return $this->compileDir.TMP_FILE_PREFIX.$this->languageID.'_'.$templateName.'.php';\r
- }\r
- \r
- /**\r
- * @see Template::getPluginFilename()\r
- */\r
- public function getPluginFilename($type, $tag) {\r
- return $this->pluginDir.TMP_FILE_PREFIX.'TemplatePlugin'.StringUtil::firstCharToUpperCase(StringUtil::toLowerCase($type)).StringUtil::firstCharToUpperCase(StringUtil::toLowerCase($tag)).'.class.php';\r
- }\r
- \r
- /**\r
- * @see Template::getCompiler()\r
- */\r
- protected function getCompiler() {\r
- return new TemplateCompiler($this);\r
- }\r
+<?php
+namespace wcf\system\template;
+
+/**
+ * SetupTemplate loads and displays template in the setup process.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template
+ * @category Community Framework
+ */
+class SetupTemplate extends Template {
+ protected $templatePath = '';
+
+ /**
+ * @see Template::setTemplatePaths()
+ */
+ public function setTemplatePaths($templatePaths) {
+ if (is_array($templatePaths)) $this->templatePath = array_shift($templatePaths);
+ else $this->templatePath = $templatePaths;
+ }
+
+ /**
+ * @see Template::loadTemplateStructure()
+ */
+ protected function loadTemplateStructure() {}
+
+ /**
+ * @see Template::getSourceFilename()
+ */
+ public function getSourceFilename($templateName, $packageID = 0) {
+ return $this->templatePath.TMP_FILE_PREFIX.$templateName.'.tpl';
+ }
+
+ /**
+ * @see Template::getCompiledFilename()
+ */
+ public function getCompiledFilename($templateName, $packageID = 0) {
+ return $this->compileDir.TMP_FILE_PREFIX.$this->languageID.'_'.$templateName.'.php';
+ }
+
+ /**
+ * @see Template::getPluginFilename()
+ */
+ public function getPluginFilename($type, $tag) {
+ return $this->pluginDir.TMP_FILE_PREFIX.'TemplatePlugin'.StringUtil::firstCharToUpperCase(StringUtil::toLowerCase($type)).StringUtil::firstCharToUpperCase(StringUtil::toLowerCase($tag)).'.class.php';
+ }
+
+ /**
+ * @see Template::getCompiler()
+ */
+ protected function getCompiler() {
+ return new TemplateCompiler($this);
+ }
}
-<?php\r
-namespace wcf\system\template;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * SetupTemplateEngine loads and displays template in the setup process.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category Community Framework\r
- */\r
-class SetupTemplateEngine extends TemplateEngine {\r
- /**\r
- * @see TemplateEngine::loadTemplateGroupCache()\r
- */\r
- protected function loadTemplateGroupCache() {}\r
- \r
- /**\r
- * @see TemplateEngine::getSourceFilename()\r
- */\r
- public function getSourceFilename($templateName, $packageID) {\r
- return $this->templatePaths[PACKAGE_ID].'setup/template/'.$templateName.'.tpl';\r
- }\r
- \r
- /**\r
- * @see TemplateEngine::getCompiledFilename()\r
- */\r
- public function getCompiledFilename($templateName, $packageID) {\r
- return $this->compileDir.'setup/template/compiled/'.$this->languageID.'_'.$templateName.'.php';\r
- }\r
- \r
- /**\r
- * @see TemplateEngine::getPackageID()\r
- */\r
- public function getPackageID($templateName, $packageID) {\r
- $path = $this->templatePaths[PACKAGE_ID].'setup/template/'.$templateName.'.tpl';\r
- if (file_exists($path)) {\r
- return PACKAGE_ID;\r
- }\r
- \r
- throw new SystemException("Unable to find template '$templateName'", 12005);\r
- }\r
- \r
- /**\r
- * @see TemplateEngine::getCompiler()\r
- */\r
- protected function getCompiler() {\r
- return new TemplateCompiler($this);\r
- }\r
- \r
- /**\r
- * Template Listener are not available during setup.\r
- */\r
- protected function loadTemplateListeners() {}\r
+<?php
+namespace wcf\system\template;
+use wcf\system\exception\SystemException;
+
+/**
+ * SetupTemplateEngine loads and displays template in the setup process.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template
+ * @category Community Framework
+ */
+class SetupTemplateEngine extends TemplateEngine {
+ /**
+ * @see TemplateEngine::loadTemplateGroupCache()
+ */
+ protected function loadTemplateGroupCache() {}
+
+ /**
+ * @see TemplateEngine::getSourceFilename()
+ */
+ public function getSourceFilename($templateName, $packageID) {
+ return $this->templatePaths[PACKAGE_ID].'setup/template/'.$templateName.'.tpl';
+ }
+
+ /**
+ * @see TemplateEngine::getCompiledFilename()
+ */
+ public function getCompiledFilename($templateName, $packageID) {
+ return $this->compileDir.'setup/template/compiled/'.$this->languageID.'_'.$templateName.'.php';
+ }
+
+ /**
+ * @see TemplateEngine::getPackageID()
+ */
+ public function getPackageID($templateName, $packageID) {
+ $path = $this->templatePaths[PACKAGE_ID].'setup/template/'.$templateName.'.tpl';
+ if (file_exists($path)) {
+ return PACKAGE_ID;
+ }
+
+ throw new SystemException("Unable to find template '$templateName'", 12005);
+ }
+
+ /**
+ * @see TemplateEngine::getCompiler()
+ */
+ protected function getCompiler() {
+ return new TemplateCompiler($this);
+ }
+
+ /**
+ * Template Listener are not available during setup.
+ */
+ protected function loadTemplateListeners() {}
}
-<?php\r
-namespace wcf\system\template;\r
-use wcf\system\io\File;\r
-\r
-/**\r
- * TemplateCompiler compiles template source in valid php code.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template\r
- * @category Community Framework\r
- */\r
-class TemplateCompiler extends TemplateScriptingCompiler {\r
- /**\r
- * Compiles the source of a template.\r
- * \r
- * @param string $templateName\r
- * @param string $sourceContent\r
- * @param string $compiledFilename\r
- */\r
- public function compile($templateName, $sourceContent, $compiledFilename) {\r
- // build fileheader\r
- $compiledHeader = "<?php\n/**\n* WoltLab Community Framework\n* Template: ".$templateName."\n* Compiled at: ".gmdate('r')."\n* \n* DO NOT EDIT THIS FILE\n*/\n\$this->v['tpl']['template'] = '".addcslashes($templateName, "'\\")."';\n?>\n";\r
- \r
- // include Plugins\r
- $compiledContent = $this->compileString($templateName, $sourceContent);\r
- \r
- // write compiled to file\r
- $file = new File($compiledFilename);\r
- $file->write($compiledHeader.$compiledContent);\r
- $file->close();\r
- }\r
- \r
- /**\r
- * Returns the name of the current template.\r
- * \r
- * @return string\r
- */\r
- public function getCurrentTemplate() {\r
- return $this->getCurrentIdentifier();\r
- }\r
+<?php
+namespace wcf\system\template;
+use wcf\system\io\File;
+
+/**
+ * TemplateCompiler compiles template source in valid php code.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template
+ * @category Community Framework
+ */
+class TemplateCompiler extends TemplateScriptingCompiler {
+ /**
+ * Compiles the source of a template.
+ *
+ * @param string $templateName
+ * @param string $sourceContent
+ * @param string $compiledFilename
+ */
+ public function compile($templateName, $sourceContent, $compiledFilename) {
+ // build fileheader
+ $compiledHeader = "<?php\n/**\n* WoltLab Community Framework\n* Template: ".$templateName."\n* Compiled at: ".gmdate('r')."\n* \n* DO NOT EDIT THIS FILE\n*/\n\$this->v['tpl']['template'] = '".addcslashes($templateName, "'\\")."';\n?>\n";
+
+ // include Plugins
+ $compiledContent = $this->compileString($templateName, $sourceContent);
+
+ // write compiled to file
+ $file = new File($compiledFilename);
+ $file->write($compiledHeader.$compiledContent);
+ $file->close();
+ }
+
+ /**
+ * Returns the name of the current template.
+ *
+ * @return string
+ */
+ public function getCurrentTemplate() {
+ return $this->getCurrentIdentifier();
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\request\LinkHandler;\r
-use wcf\system\template\ITemplatePluginBlock;\r
-use wcf\system\template\TemplateEngine;\r
-\r
-/**\r
- * Shortcut for usage of LinkHandler::getInstance()->getLink() in template scripting.\r
- * \r
- * Usage:\r
- * {link application='wcf'}index.php{/link}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginBlockLink implements ITemplatePluginBlock {\r
- /**\r
- * internal loop counter\r
- * @var integer\r
- */\r
- protected $counter = 0;\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginBlock::execute()\r
- */\r
- public function execute($tagArgs, $blockContent, TemplateEngine $tplObj) {\r
- $application = 'wcf';\r
- if (!empty($tagArgs['application'])) {\r
- $application = $tagArgs['application'];\r
- }\r
- \r
- return LinkHandler::getInstance()->getLink($blockContent, $application);\r
- }\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginBlock::init()\r
- */\r
- public function init($tagArgs, TemplateEngine $tplObj) {\r
- $this->counter = 0;\r
- }\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginBlock::next()\r
- */\r
- public function next(TemplateEngine $tplObj) {\r
- if ($this->counter == 0) {\r
- $this->counter++;\r
- return true;\r
- }\r
- \r
- return false;\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\request\LinkHandler;
+use wcf\system\template\ITemplatePluginBlock;
+use wcf\system\template\TemplateEngine;
+
+/**
+ * Shortcut for usage of LinkHandler::getInstance()->getLink() in template scripting.
+ *
+ * Usage:
+ * {link application='wcf'}index.php{/link}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginBlockLink implements ITemplatePluginBlock {
+ /**
+ * internal loop counter
+ * @var integer
+ */
+ protected $counter = 0;
+
+ /**
+ * @see wcf\system\template\ITemplatePluginBlock::execute()
+ */
+ public function execute($tagArgs, $blockContent, TemplateEngine $tplObj) {
+ $application = 'wcf';
+ if (!empty($tagArgs['application'])) {
+ $application = $tagArgs['application'];
+ }
+
+ return LinkHandler::getInstance()->getLink($blockContent, $application);
+ }
+
+ /**
+ * @see wcf\system\template\ITemplatePluginBlock::init()
+ */
+ public function init($tagArgs, TemplateEngine $tplObj) {
+ $this->counter = 0;
+ }
+
+ /**
+ * @see wcf\system\template\ITemplatePluginBlock::next()
+ */
+ public function next(TemplateEngine $tplObj) {
+ if ($this->counter == 0) {
+ $this->counter++;
+ return true;
+ }
+
+ return false;
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The 'append' compiler function calls the append function on the template object.\r
- * \r
- * Usage:\r
- * {append var=name value="foo"}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginCompilerAppend implements ITemplatePluginCompiler {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
- */\r
- public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
- if (!isset($tagArgs['var'])) {\r
- throw new SystemException($compiler->formatSyntaxError("missing 'var' argument in append tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
- }\r
- if (!isset($tagArgs['value'])) {\r
- throw new SystemException($compiler->formatSyntaxError("missing 'value' argument in append tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
- }\r
- \r
- return "<?php \$this->append(".$tagArgs['var'].", ".$tagArgs['value']."); ?>";\r
- }\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
- */\r
- public function executeEnd(TemplateScriptingCompiler $compiler) {\r
- throw new SystemException($compiler->formatSyntaxError("unknown tag {/append}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\exception\SystemException;
+
+/**
+ * The 'append' compiler function calls the append function on the template object.
+ *
+ * Usage:
+ * {append var=name value="foo"}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginCompilerAppend implements ITemplatePluginCompiler {
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+ */
+ public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+ if (!isset($tagArgs['var'])) {
+ throw new SystemException($compiler->formatSyntaxError("missing 'var' argument in append tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+ }
+ if (!isset($tagArgs['value'])) {
+ throw new SystemException($compiler->formatSyntaxError("missing 'value' argument in append tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+ }
+
+ return "<?php \$this->append(".$tagArgs['var'].", ".$tagArgs['value']."); ?>";
+ }
+
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+ */
+ public function executeEnd(TemplateScriptingCompiler $compiler) {
+ throw new SystemException($compiler->formatSyntaxError("unknown tag {/append}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The 'assign' compiler function calls the assign function on the template object.\r
- * \r
- * Usage:\r
- * {assign var=name value="foo"}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginCompilerAssign implements ITemplatePluginCompiler {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
- */\r
- public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
- if (!isset($tagArgs['var'])) {\r
- throw new SystemException($compiler->formatSyntaxError("missing 'var' argument in assign tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
- }\r
- if (!isset($tagArgs['value'])) {\r
- throw new SystemException($compiler->formatSyntaxError("missing 'value' argument in assign tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
- }\r
- \r
- return "<?php \$this->assign(".$tagArgs['var'].", ".$tagArgs['value']."); ?>";\r
- }\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
- */\r
- public function executeEnd(TemplateScriptingCompiler $compiler) {\r
- throw new SystemException($compiler->formatSyntaxError("unknown tag {/assign}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\exception\SystemException;
+
+/**
+ * The 'assign' compiler function calls the assign function on the template object.
+ *
+ * Usage:
+ * {assign var=name value="foo"}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginCompilerAssign implements ITemplatePluginCompiler {
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+ */
+ public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+ if (!isset($tagArgs['var'])) {
+ throw new SystemException($compiler->formatSyntaxError("missing 'var' argument in assign tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+ }
+ if (!isset($tagArgs['value'])) {
+ throw new SystemException($compiler->formatSyntaxError("missing 'value' argument in assign tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+ }
+
+ return "<?php \$this->assign(".$tagArgs['var'].", ".$tagArgs['value']."); ?>";
+ }
+
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+ */
+ public function executeEnd(TemplateScriptingCompiler $compiler) {
+ throw new SystemException($compiler->formatSyntaxError("unknown tag {/assign}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * The 'fetch' compiler function fetches files from the local file system, http, or ftp and displays the content.\r
- * \r
- * Usage:\r
- * {fetch file='x.html'}\r
- * {fetch file='x.html' assign=var}\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginCompilerFetch implements ITemplatePluginCompiler {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
- */\r
- public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
- if (!isset($tagArgs['file'])) {\r
- throw new SystemException($compiler->formatSyntaxError("missing 'file' argument in fetch tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
- }\r
- \r
- if (isset($tagArgs['assign'])) {\r
- return "<?php \$this->assign(".$tagArgs['assign'].", @file_get_contents(".$tagArgs['file'].")); ?>";\r
- }\r
- else {\r
- return "<?php echo @file_get_contents(".$tagArgs['file']."); ?>";\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
- */\r
- public function executeEnd(TemplateScriptingCompiler $compiler) {\r
- throw new SystemException($compiler->formatSyntaxError("unknown tag {/fetch}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\exception\SystemException;
+
+/**
+ * The 'fetch' compiler function fetches files from the local file system, http, or ftp and displays the content.
+ *
+ * Usage:
+ * {fetch file='x.html'}
+ * {fetch file='x.html' assign=var}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginCompilerFetch implements ITemplatePluginCompiler {
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+ */
+ public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+ if (!isset($tagArgs['file'])) {
+ throw new SystemException($compiler->formatSyntaxError("missing 'file' argument in fetch tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+ }
+
+ if (isset($tagArgs['assign'])) {
+ return "<?php \$this->assign(".$tagArgs['assign'].", @file_get_contents(".$tagArgs['file'].")); ?>";
+ }
+ else {
+ return "<?php echo @file_get_contents(".$tagArgs['file']."); ?>";
+ }
+ }
+
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+ */
+ public function executeEnd(TemplateScriptingCompiler $compiler) {
+ throw new SystemException($compiler->formatSyntaxError("unknown tag {/fetch}", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12003);
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\exception\SystemException;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'implode' compiler function joins array elements with a string.\r
- * \r
- * Usage:\r
- * {implode from=$array key=bar item=foo glue=";"}{$foo}{/implode}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginCompilerImplode implements ITemplatePluginCompiler {\r
- protected $tagStack = array();\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
- */\r
- public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
- $compiler->pushTag('implode');\r
- \r
- if (!isset($tagArgs['from'])) {\r
- throw new SystemException($compiler->formatSyntaxError("missing 'from' argument in implode tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
- }\r
- if (!isset($tagArgs['item'])) {\r
- throw new SystemException($compiler->formatSyntaxError("missing 'item' argument in implode tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);\r
- }\r
- \r
- $hash = StringUtil::getRandomID();\r
- $glue = isset($tagArgs['glue']) ? $tagArgs['glue'] : "', '";\r
- $this->tagStack[] = array('hash' => $hash, 'glue' => $glue);\r
- \r
- $phpCode = "<?php\n";\r
- $phpCode .= "\$_length".$hash." = count(".$tagArgs['from'].");\n";\r
- $phpCode .= "\$_i".$hash." = 0;\n";\r
- $phpCode .= "foreach (".$tagArgs['from']." as ".(isset($tagArgs['key']) ? (StringUtil::substring($tagArgs['key'], 0, 1) != '$' ? "\$this->v[".$tagArgs['key']."]" : $tagArgs['key'])." => " : '').(StringUtil::substring($tagArgs['item'], 0, 1) != '$' ? "\$this->v[".$tagArgs['item']."]" : $tagArgs['item']).") { ?>";\r
- return $phpCode;\r
- }\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
- */\r
- public function executeEnd(TemplateScriptingCompiler $compiler) {\r
- $compiler->popTag('implode');\r
- $tagArgs = array_pop($this->tagStack);\r
- \r
- $phpCode = "<?php\n";\r
- $phpCode .= "if (++\$_i".$tagArgs['hash']." < \$_length".$tagArgs['hash'].") { echo ".$tagArgs['glue']."; }\n";\r
- $phpCode .= "} ?>";\r
- \r
- return $phpCode;\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\exception\SystemException;
+use wcf\util\StringUtil;
+
+/**
+ * The 'implode' compiler function joins array elements with a string.
+ *
+ * Usage:
+ * {implode from=$array key=bar item=foo glue=";"}{$foo}{/implode}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginCompilerImplode implements ITemplatePluginCompiler {
+ protected $tagStack = array();
+
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+ */
+ public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+ $compiler->pushTag('implode');
+
+ if (!isset($tagArgs['from'])) {
+ throw new SystemException($compiler->formatSyntaxError("missing 'from' argument in implode tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+ }
+ if (!isset($tagArgs['item'])) {
+ throw new SystemException($compiler->formatSyntaxError("missing 'item' argument in implode tag", $compiler->getCurrentIdentifier(), $compiler->getCurrentLineNo()), 12001);
+ }
+
+ $hash = StringUtil::getRandomID();
+ $glue = isset($tagArgs['glue']) ? $tagArgs['glue'] : "', '";
+ $this->tagStack[] = array('hash' => $hash, 'glue' => $glue);
+
+ $phpCode = "<?php\n";
+ $phpCode .= "\$_length".$hash." = count(".$tagArgs['from'].");\n";
+ $phpCode .= "\$_i".$hash." = 0;\n";
+ $phpCode .= "foreach (".$tagArgs['from']." as ".(isset($tagArgs['key']) ? (StringUtil::substring($tagArgs['key'], 0, 1) != '$' ? "\$this->v[".$tagArgs['key']."]" : $tagArgs['key'])." => " : '').(StringUtil::substring($tagArgs['item'], 0, 1) != '$' ? "\$this->v[".$tagArgs['item']."]" : $tagArgs['item']).") { ?>";
+ return $phpCode;
+ }
+
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+ */
+ public function executeEnd(TemplateScriptingCompiler $compiler) {
+ $compiler->popTag('implode');
+ $tagArgs = array_pop($this->tagStack);
+
+ $phpCode = "<?php\n";
+ $phpCode .= "if (++\$_i".$tagArgs['hash']." < \$_length".$tagArgs['hash'].") { echo ".$tagArgs['glue']."; }\n";
+ $phpCode .= "} ?>";
+
+ return $phpCode;
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginCompiler;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'lang' compiler function compiles dynamic language variables.\r
- * \r
- * Usage:\r
- * {lang}$blah{/lang}\r
- * {lang var=$x}foo{/lang}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginCompilerLang implements ITemplatePluginCompiler {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeStart()\r
- */\r
- public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {\r
- $compiler->pushTag('lang');\r
- \r
- $newTagArgs = array();\r
- foreach ($tagArgs as $key => $arg) {\r
- $newTagArgs[$key] = 'wcf\util\StringUtil::encodeHTML('.$arg.')';\r
- }\r
- \r
- $tagArgs = $compiler->makeArgString($newTagArgs);\r
- return "<?php \$this->tagStack[] = array('lang', array($tagArgs)); ob_start(); ?>";\r
- }\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()\r
- */\r
- public function executeEnd(TemplateScriptingCompiler $compiler) {\r
- $compiler->popTag('lang');\r
- $hash = StringUtil::getRandomID();\r
- return "<?php \$_lang".$hash." = ob_get_contents(); ob_end_clean(); echo wcf\system\WCF::getLanguage()->getDynamicVariable(\$_lang".$hash.", \$this->tagStack[count(\$this->tagStack) - 1][1]); array_pop(\$this->tagStack); ?>";\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginCompiler;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\util\StringUtil;
+
+/**
+ * The 'lang' compiler function compiles dynamic language variables.
+ *
+ * Usage:
+ * {lang}$blah{/lang}
+ * {lang var=$x}foo{/lang}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginCompilerLang implements ITemplatePluginCompiler {
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeStart()
+ */
+ public function executeStart($tagArgs, TemplateScriptingCompiler $compiler) {
+ $compiler->pushTag('lang');
+
+ $newTagArgs = array();
+ foreach ($tagArgs as $key => $arg) {
+ $newTagArgs[$key] = 'wcf\util\StringUtil::encodeHTML('.$arg.')';
+ }
+
+ $tagArgs = $compiler->makeArgString($newTagArgs);
+ return "<?php \$this->tagStack[] = array('lang', array($tagArgs)); ob_start(); ?>";
+ }
+
+ /**
+ * @see wcf\system\template\ITemplatePluginCompiler::executeEnd()
+ */
+ public function executeEnd(TemplateScriptingCompiler $compiler) {
+ $compiler->popTag('lang');
+ $hash = StringUtil::getRandomID();
+ return "<?php \$_lang".$hash." = ob_get_contents(); ob_end_clean(); echo wcf\system\WCF::getLanguage()->getDynamicVariable(\$_lang".$hash.", \$this->tagStack[count(\$this->tagStack) - 1][1]); array_pop(\$this->tagStack); ?>";
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginFunction;\r
-use wcf\system\template\TemplateEngine;\r
-\r
-/**\r
- * The 'counter' template function is used to print out a count.\r
- * \r
- * Usage:\r
- * {counter assign=i}\r
- * {counter start=10 skip=2}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginFunctionCounter implements ITemplatePluginFunction {\r
- protected $counters = array();\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginFunction::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- if (!isset($tagArgs['name'])) {\r
- $tagArgs['name'] = 'default';\r
- }\r
-\r
- if (!isset($this->counters[$tagArgs['name']])) {\r
- $this->counters[$tagArgs['name']] = array(\r
- 'start' => 1,\r
- 'skip' => 1,\r
- 'direction' => 'up',\r
- 'count' => 1\r
- );\r
- }\r
-\r
- $counter =& $this->counters[$tagArgs['name']];\r
-\r
- if (isset($tagArgs['start'])) {\r
- $counter['start'] = $counter['count'] = intval($tagArgs['start']);\r
- }\r
-\r
- if (isset($tagArgs['assign']) && !empty($tagArgs['assign'])) {\r
- $counter['assign'] = $tagArgs['assign'];\r
- }\r
-\r
- if (isset($counter['assign'])) {\r
- $tplObj->assign($counter['assign'], $counter['count']);\r
- }\r
-\r
- $result = null;\r
- if (!isset($tagArgs['print']) || $tagArgs['print']) {\r
- $result = $counter['count'];\r
- } \r
- \r
- if (isset($tagArgs['skip'])) {\r
- $counter['skip'] = intval($tagArgs['skip']);\r
- }\r
-\r
- // get direction\r
- if (isset($tagArgs['direction'])) {\r
- $counter['direction'] = $tagArgs['direction'];\r
- }\r
-\r
- if ($counter['direction'] == 'down') {\r
- $counter['count'] -= $counter['skip'];\r
- }\r
- else {\r
- $counter['count'] += $counter['skip'];\r
- }\r
-\r
- return $result;\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginFunction;
+use wcf\system\template\TemplateEngine;
+
+/**
+ * The 'counter' template function is used to print out a count.
+ *
+ * Usage:
+ * {counter assign=i}
+ * {counter start=10 skip=2}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginFunctionCounter implements ITemplatePluginFunction {
+ protected $counters = array();
+
+ /**
+ * @see wcf\system\template\ITemplatePluginFunction::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ if (!isset($tagArgs['name'])) {
+ $tagArgs['name'] = 'default';
+ }
+
+ if (!isset($this->counters[$tagArgs['name']])) {
+ $this->counters[$tagArgs['name']] = array(
+ 'start' => 1,
+ 'skip' => 1,
+ 'direction' => 'up',
+ 'count' => 1
+ );
+ }
+
+ $counter =& $this->counters[$tagArgs['name']];
+
+ if (isset($tagArgs['start'])) {
+ $counter['start'] = $counter['count'] = intval($tagArgs['start']);
+ }
+
+ if (isset($tagArgs['assign']) && !empty($tagArgs['assign'])) {
+ $counter['assign'] = $tagArgs['assign'];
+ }
+
+ if (isset($counter['assign'])) {
+ $tplObj->assign($counter['assign'], $counter['count']);
+ }
+
+ $result = null;
+ if (!isset($tagArgs['print']) || $tagArgs['print']) {
+ $result = $counter['count'];
+ }
+
+ if (isset($tagArgs['skip'])) {
+ $counter['skip'] = intval($tagArgs['skip']);
+ }
+
+ // get direction
+ if (isset($tagArgs['direction'])) {
+ $counter['direction'] = $tagArgs['direction'];
+ }
+
+ if ($counter['direction'] == 'down') {
+ $counter['count'] -= $counter['skip'];
+ }
+ else {
+ $counter['count'] += $counter['skip'];
+ }
+
+ return $result;
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\ITemplatePluginFunction;\r
-use wcf\system\template\TemplateEngine;\r
-\r
-/**\r
- * The 'cycle' template function cycles through given values.\r
- * \r
- * Usage:\r
- * {cycle values="#eee,#fff"}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginFunctionCycle implements ITemplatePluginFunction {\r
- protected $cycles = array();\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginFunction::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- // get params\r
- $name = isset($tagArgs['name']) ? $tagArgs['name'] : 'default';\r
- $print = isset($tagArgs['print']) ? $tagArgs['print'] : 1;\r
- $advance = isset($tagArgs['advance']) ? $tagArgs['advance'] : 1;\r
- $reset = isset($tagArgs['reset']) ? $tagArgs['reset'] : 0;\r
- \r
- // get values\r
- if (!isset($tagArgs['values']) ) {\r
- if (!isset($this->cycles[$name]['values'])) {\r
- throw new SystemException("missing 'values' argument in cycle tag", 12001);\r
- }\r
- }\r
- else {\r
- if (isset($this->cycles[$name]['values']) && $this->cycles[$name]['values'] != $tagArgs['values'] ) {\r
- $this->cycles[$name]['index'] = 0;\r
- }\r
- $this->cycles[$name]['values'] = $tagArgs['values'];\r
- }\r
- \r
- // get delimiter\r
- if (!isset($this->cycles[$name]['delimiter'])) {\r
- // set default delimiter\r
- $this->cycles[$name]['delimiter'] = ',';\r
- }\r
- if (isset($tagArgs['delimiter'])) {\r
- $this->cycles[$name]['delimiter'] = $tagArgs['delimiter'];\r
- }\r
- \r
- // split values\r
- if (is_array($this->cycles[$name]['values'])) {\r
- $cycleArray = $this->cycles[$name]['values'];\r
- }\r
- else {\r
- $cycleArray = explode($this->cycles[$name]['delimiter'], $this->cycles[$name]['values']);\r
- }\r
- \r
- // set index\r
- if (!isset($this->cycles[$name]['index']) || $reset) {\r
- $this->cycles[$name]['index'] = 0;\r
- }\r
- \r
- // get result\r
- $result = $cycleArray[$this->cycles[$name]['index']];\r
- \r
- // assign result to template var\r
- if (isset($tagArgs['assign'])) {\r
- $print = false;\r
- $tplObj->assign($tagArgs['assign'], $result);\r
- }\r
- \r
- // update index\r
- if ($advance) {\r
- if ($this->cycles[$name]['index'] >= count($cycleArray) - 1) {\r
- $this->cycles[$name]['index'] = 0;\r
- }\r
- else {\r
- $this->cycles[$name]['index']++;\r
- }\r
- }\r
- \r
- // print var\r
- if ($print) {\r
- return $result;\r
- }\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\exception\SystemException;
+use wcf\system\template\ITemplatePluginFunction;
+use wcf\system\template\TemplateEngine;
+
+/**
+ * The 'cycle' template function cycles through given values.
+ *
+ * Usage:
+ * {cycle values="#eee,#fff"}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginFunctionCycle implements ITemplatePluginFunction {
+ protected $cycles = array();
+
+ /**
+ * @see wcf\system\template\ITemplatePluginFunction::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ // get params
+ $name = isset($tagArgs['name']) ? $tagArgs['name'] : 'default';
+ $print = isset($tagArgs['print']) ? $tagArgs['print'] : 1;
+ $advance = isset($tagArgs['advance']) ? $tagArgs['advance'] : 1;
+ $reset = isset($tagArgs['reset']) ? $tagArgs['reset'] : 0;
+
+ // get values
+ if (!isset($tagArgs['values']) ) {
+ if (!isset($this->cycles[$name]['values'])) {
+ throw new SystemException("missing 'values' argument in cycle tag", 12001);
+ }
+ }
+ else {
+ if (isset($this->cycles[$name]['values']) && $this->cycles[$name]['values'] != $tagArgs['values'] ) {
+ $this->cycles[$name]['index'] = 0;
+ }
+ $this->cycles[$name]['values'] = $tagArgs['values'];
+ }
+
+ // get delimiter
+ if (!isset($this->cycles[$name]['delimiter'])) {
+ // set default delimiter
+ $this->cycles[$name]['delimiter'] = ',';
+ }
+ if (isset($tagArgs['delimiter'])) {
+ $this->cycles[$name]['delimiter'] = $tagArgs['delimiter'];
+ }
+
+ // split values
+ if (is_array($this->cycles[$name]['values'])) {
+ $cycleArray = $this->cycles[$name]['values'];
+ }
+ else {
+ $cycleArray = explode($this->cycles[$name]['delimiter'], $this->cycles[$name]['values']);
+ }
+
+ // set index
+ if (!isset($this->cycles[$name]['index']) || $reset) {
+ $this->cycles[$name]['index'] = 0;
+ }
+
+ // get result
+ $result = $cycleArray[$this->cycles[$name]['index']];
+
+ // assign result to template var
+ if (isset($tagArgs['assign'])) {
+ $print = false;
+ $tplObj->assign($tagArgs['assign'], $result);
+ }
+
+ // update index
+ if ($advance) {
+ if ($this->cycles[$name]['index'] >= count($cycleArray) - 1) {
+ $this->cycles[$name]['index'] = 0;
+ }
+ else {
+ $this->cycles[$name]['index']++;
+ }
+ }
+
+ // print var
+ if ($print) {
+ return $result;
+ }
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\ITemplatePluginFunction;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'htmlcheckboxes' template function generates a list of html checkboxes.\r
- * \r
- * Usage:\r
- * {htmlcheckboxes name="x" options=$array}\r
- * {htmlcheckboxes name="x" options=$array selected=$foo}\r
- * {htmlcheckboxes name="x" output=$outputArray}\r
- * {htmlcheckboxes name="x" output=$outputArray values=$valueArray}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginFunctionHtmlcheckboxes implements ITemplatePluginFunction {\r
- protected $disableEncoding = false;\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginFunction::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- // get options\r
- if (isset($tagArgs['output']) && is_array($tagArgs['output'])) {\r
- if (isset($tagArgs['values']) && is_array($tagArgs['values'])) {\r
- $tagArgs['options'] = array_combine($tagArgs['values'], $tagArgs['output']);\r
- }\r
- else {\r
- $tagArgs['options'] = array_combine($tagArgs['output'], $tagArgs['output']);\r
- }\r
- }\r
-\r
- if (!isset($tagArgs['options']) || !is_array($tagArgs['options'])) {\r
- throw new SystemException("missing 'options' argument in htmlCheckboxes tag", 12001);\r
- }\r
- \r
- if (!isset($tagArgs['name'])) {\r
- throw new SystemException("missing 'name' argument in htmlCheckboxes tag", 12001);\r
- }\r
- \r
- if (isset($tagArgs['disableEncoding']) && $tagArgs['disableEncoding']) {\r
- $this->disableEncoding = true;\r
- }\r
- else {\r
- $this->disableEncoding = false;\r
- }\r
- \r
- // get selected values\r
- if (isset($tagArgs['selected'])) {\r
- if (!is_array($tagArgs['selected'])) $tagArgs['selected'] = array($tagArgs['selected']); \r
- }\r
- else {\r
- $tagArgs['selected'] = array();\r
- }\r
- if (!isset($tagArgs['separator'])) {\r
- $tagArgs['separator'] = '';\r
- }\r
- \r
- // build html\r
- $html = '';\r
- foreach ($tagArgs['options'] as $key => $value) {\r
- if (!empty($html)) $html .= $tagArgs['separator'];\r
- $html .= '<label><input type="checkbox" name="'.$this->encodeHTML($tagArgs['name']).'[]" value="'.$this->encodeHTML($key).'"'.(in_array($key, $tagArgs['selected']) ? ' checked="checked"' : '').' /> '.$this->encodeHTML($value).'</label>'; \r
- }\r
- \r
- return $html;\r
- }\r
- \r
- /**\r
- * Executes StringUtil::encodeHTML on the given text if disableEncoding is false.\r
- * @see StringUtil::encodeHTML()\r
- */\r
- protected function encodeHTML($text) {\r
- if (!$this->disableEncoding) {\r
- $text = StringUtil::encodeHTML($text);\r
- }\r
- \r
- return $text;\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\exception\SystemException;
+use wcf\system\template\ITemplatePluginFunction;
+use wcf\system\template\TemplateEngine;
+use wcf\util\StringUtil;
+
+/**
+ * The 'htmlcheckboxes' template function generates a list of html checkboxes.
+ *
+ * Usage:
+ * {htmlcheckboxes name="x" options=$array}
+ * {htmlcheckboxes name="x" options=$array selected=$foo}
+ * {htmlcheckboxes name="x" output=$outputArray}
+ * {htmlcheckboxes name="x" output=$outputArray values=$valueArray}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginFunctionHtmlcheckboxes implements ITemplatePluginFunction {
+ protected $disableEncoding = false;
+
+ /**
+ * @see wcf\system\template\ITemplatePluginFunction::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ // get options
+ if (isset($tagArgs['output']) && is_array($tagArgs['output'])) {
+ if (isset($tagArgs['values']) && is_array($tagArgs['values'])) {
+ $tagArgs['options'] = array_combine($tagArgs['values'], $tagArgs['output']);
+ }
+ else {
+ $tagArgs['options'] = array_combine($tagArgs['output'], $tagArgs['output']);
+ }
+ }
+
+ if (!isset($tagArgs['options']) || !is_array($tagArgs['options'])) {
+ throw new SystemException("missing 'options' argument in htmlCheckboxes tag", 12001);
+ }
+
+ if (!isset($tagArgs['name'])) {
+ throw new SystemException("missing 'name' argument in htmlCheckboxes tag", 12001);
+ }
+
+ if (isset($tagArgs['disableEncoding']) && $tagArgs['disableEncoding']) {
+ $this->disableEncoding = true;
+ }
+ else {
+ $this->disableEncoding = false;
+ }
+
+ // get selected values
+ if (isset($tagArgs['selected'])) {
+ if (!is_array($tagArgs['selected'])) $tagArgs['selected'] = array($tagArgs['selected']);
+ }
+ else {
+ $tagArgs['selected'] = array();
+ }
+ if (!isset($tagArgs['separator'])) {
+ $tagArgs['separator'] = '';
+ }
+
+ // build html
+ $html = '';
+ foreach ($tagArgs['options'] as $key => $value) {
+ if (!empty($html)) $html .= $tagArgs['separator'];
+ $html .= '<label><input type="checkbox" name="'.$this->encodeHTML($tagArgs['name']).'[]" value="'.$this->encodeHTML($key).'"'.(in_array($key, $tagArgs['selected']) ? ' checked="checked"' : '').' /> '.$this->encodeHTML($value).'</label>';
+ }
+
+ return $html;
+ }
+
+ /**
+ * Executes StringUtil::encodeHTML on the given text if disableEncoding is false.
+ * @see StringUtil::encodeHTML()
+ */
+ protected function encodeHTML($text) {
+ if (!$this->disableEncoding) {
+ $text = StringUtil::encodeHTML($text);
+ }
+
+ return $text;
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'htmloptions' template function generates the options of an html select list.\r
- * \r
- * Usage:\r
- * {htmloptions options=$array}\r
- * {htmloptions options=$array selected=$foo}\r
- * {htmloptions options=$array name="x"}\r
- * {htmloptions output=$outputArray}\r
- * {htmloptions output=$outputArray values=$valueArray}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginFunctionHtmloptions extends TemplatePluginFunctionHtmlcheckboxes {\r
- protected $selected = array();\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginFunction::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- if (isset($tagArgs['output']) && is_array($tagArgs['output'])) {\r
- if (count($tagArgs['output'])) {\r
- if (isset($tagArgs['values']) && is_array($tagArgs['values'])) {\r
- if (count($tagArgs['output']) == count($tagArgs['values'])) {\r
- $tagArgs['options'] = array_combine($tagArgs['values'], $tagArgs['output']);\r
- }\r
- else {\r
- $tagArgs['options'] = array();\r
- }\r
- }\r
- else {\r
- $tagArgs['options'] = array_combine($tagArgs['output'], $tagArgs['output']);\r
- }\r
- }\r
- else {\r
- $tagArgs['options'] = array();\r
- }\r
- }\r
-\r
- if (!isset($tagArgs['options']) || !is_array($tagArgs['options'])) {\r
- throw new SystemException("missing 'options' argument in htmloptions tag", 12001);\r
- }\r
- \r
- if (isset($tagArgs['disableEncoding']) && $tagArgs['disableEncoding']) {\r
- $this->disableEncoding = true;\r
- }\r
- else {\r
- $this->disableEncoding = false;\r
- }\r
- \r
- // get selected values\r
- $this->selected = array();\r
- if (isset($tagArgs['selected'])) {\r
- $this->selected = $tagArgs['selected'];\r
- if (!is_array($this->selected)) $this->selected = array($this->selected); \r
- }\r
- \r
- // create option list\r
- $htmloptions = $this->makeOptionGroup(null, $tagArgs['options']);\r
- \r
- // create also a 'select' tag\r
- if (isset($tagArgs['name'])) {\r
- // unset all system vars\r
- unset($tagArgs['options'], $tagArgs['selected'], $tagArgs['output'], $tagArgs['values'], $tagArgs['disableEncoding']);\r
- \r
- // generate 'select' parameters\r
- $params = '';\r
- foreach ($tagArgs as $key => $value) {\r
- $params .= ' '.$key.'="'.$this->encodeHTML($value).'"';\r
- }\r
- \r
- $htmloptions = '<select'.$params.'>'."\n".$htmloptions."</select>\n";\r
- }\r
- \r
- return $htmloptions;\r
- }\r
- \r
- /**\r
- * Makes the html for an option group.\r
- * \r
- * @param string $key\r
- * @param array $values\r
- * @return string html code of an option group\r
- */\r
- protected function makeOptionGroup($key, $values) {\r
- $html = '';\r
- if ($key !== null) {\r
- $html = '<optgroup label="'.$this->encodeHTML($key).'">'."\n";\r
- }\r
- \r
- foreach ($values as $childKey => $value) {\r
- if (is_array($value)) {\r
- $html .= $this->makeOptionGroup($childKey, $value);\r
- }\r
- else {\r
- $html .= $this->makeOption($childKey, $value);\r
- }\r
- }\r
- \r
- if ($key !== null) {\r
- $html .= "</optgroup>\n";\r
- }\r
- \r
- return $html;\r
- }\r
- \r
- /**\r
- * Makes the html for an option.\r
- * \r
- * @param string $key\r
- * @param string $value\r
- * @return string html code of an option tag\r
- */\r
- protected function makeOption($key, $value) {\r
- $value = $this->encodeHTML($value);\r
- return '<option label="'.$value.'" value="'.$this->encodeHTML($key).'"'.(in_array($key, $this->selected) ? ' selected="selected"' : '').'>'.$value."</option>\n";\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\exception\SystemException;
+use wcf\system\template\TemplateEngine;
+use wcf\util\StringUtil;
+
+/**
+ * The 'htmloptions' template function generates the options of an html select list.
+ *
+ * Usage:
+ * {htmloptions options=$array}
+ * {htmloptions options=$array selected=$foo}
+ * {htmloptions options=$array name="x"}
+ * {htmloptions output=$outputArray}
+ * {htmloptions output=$outputArray values=$valueArray}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginFunctionHtmloptions extends TemplatePluginFunctionHtmlcheckboxes {
+ protected $selected = array();
+
+ /**
+ * @see wcf\system\template\ITemplatePluginFunction::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ if (isset($tagArgs['output']) && is_array($tagArgs['output'])) {
+ if (count($tagArgs['output'])) {
+ if (isset($tagArgs['values']) && is_array($tagArgs['values'])) {
+ if (count($tagArgs['output']) == count($tagArgs['values'])) {
+ $tagArgs['options'] = array_combine($tagArgs['values'], $tagArgs['output']);
+ }
+ else {
+ $tagArgs['options'] = array();
+ }
+ }
+ else {
+ $tagArgs['options'] = array_combine($tagArgs['output'], $tagArgs['output']);
+ }
+ }
+ else {
+ $tagArgs['options'] = array();
+ }
+ }
+
+ if (!isset($tagArgs['options']) || !is_array($tagArgs['options'])) {
+ throw new SystemException("missing 'options' argument in htmloptions tag", 12001);
+ }
+
+ if (isset($tagArgs['disableEncoding']) && $tagArgs['disableEncoding']) {
+ $this->disableEncoding = true;
+ }
+ else {
+ $this->disableEncoding = false;
+ }
+
+ // get selected values
+ $this->selected = array();
+ if (isset($tagArgs['selected'])) {
+ $this->selected = $tagArgs['selected'];
+ if (!is_array($this->selected)) $this->selected = array($this->selected);
+ }
+
+ // create option list
+ $htmloptions = $this->makeOptionGroup(null, $tagArgs['options']);
+
+ // create also a 'select' tag
+ if (isset($tagArgs['name'])) {
+ // unset all system vars
+ unset($tagArgs['options'], $tagArgs['selected'], $tagArgs['output'], $tagArgs['values'], $tagArgs['disableEncoding']);
+
+ // generate 'select' parameters
+ $params = '';
+ foreach ($tagArgs as $key => $value) {
+ $params .= ' '.$key.'="'.$this->encodeHTML($value).'"';
+ }
+
+ $htmloptions = '<select'.$params.'>'."\n".$htmloptions."</select>\n";
+ }
+
+ return $htmloptions;
+ }
+
+ /**
+ * Makes the html for an option group.
+ *
+ * @param string $key
+ * @param array $values
+ * @return string html code of an option group
+ */
+ protected function makeOptionGroup($key, $values) {
+ $html = '';
+ if ($key !== null) {
+ $html = '<optgroup label="'.$this->encodeHTML($key).'">'."\n";
+ }
+
+ foreach ($values as $childKey => $value) {
+ if (is_array($value)) {
+ $html .= $this->makeOptionGroup($childKey, $value);
+ }
+ else {
+ $html .= $this->makeOption($childKey, $value);
+ }
+ }
+
+ if ($key !== null) {
+ $html .= "</optgroup>\n";
+ }
+
+ return $html;
+ }
+
+ /**
+ * Makes the html for an option.
+ *
+ * @param string $key
+ * @param string $value
+ * @return string html code of an option tag
+ */
+ protected function makeOption($key, $value) {
+ $value = $this->encodeHTML($value);
+ return '<option label="'.$value.'" value="'.$this->encodeHTML($key).'"'.(in_array($key, $this->selected) ? ' selected="selected"' : '').'>'.$value."</option>\n";
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\WCF;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginFunction;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'pages' template function is used to generate sliding pagers.\r
- * \r
- * Usage:\r
- * {pages pages=10 link='page-%d.html'}\r
- * {pages page=8 pages=10 link='page-%d.html'}\r
- * \r
- * assign to variable 'output'; do not print: \r
- * {pages page=8 pages=10 link='page-%d.html' assign='output'}\r
- * \r
- * assign to variable 'output' and do print also:\r
- * {pages page=8 pages=10 link='page-%d.html' assign='output' print=true}\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginFunctionPages implements ITemplatePluginFunction {\r
- const SHOW_LINKS = 11;\r
- const SHOW_SUB_LINKS = 20;\r
- \r
- /**\r
- * Inserts the page number into the link.\r
- * \r
- * @param string $link\r
- * @param integer $pageNo\r
- * @return string final link\r
- */\r
- protected static function insertPageNumber($link, $pageNo) {\r
- $startPos = StringUtil::indexOf($link, '%d');\r
- if ($startPos !== null) $link = StringUtil::substring($link, 0, $startPos) . $pageNo . StringUtil::substring($link, $startPos + 2);\r
- return $link;\r
- }\r
- \r
- /**\r
- * Generates html code of a link.\r
- * \r
- * @param string $link\r
- * @param integer $pageNo\r
- * @param integer $activePage\r
- * @param boolean $break\r
- * @return string\r
- */\r
- protected function makeLink($link, $pageNo, $activePage, $break = false) {\r
- // first page\r
- if ($activePage != $pageNo) {\r
- return '<li'.($break ? ' class="break"' : '').'><a href="'.$this->insertPageNumber($link, $pageNo).'">'.StringUtil::formatInteger($pageNo).'</a></li>'."\n";\r
- }\r
- else {\r
- return '<li class="'.($break ? 'break ' : '').'active"><span>'.StringUtil::formatInteger($pageNo).'</span></li>'."\n";\r
- }\r
- }\r
- \r
- /**\r
- * @see wcf\system\template\ITemplatePluginFunction::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- // needed params: link, page, pages\r
- if (!isset($tagArgs['link'])) throw new SystemException("missing 'link' argument in pages tag", 12001);\r
- if (!isset($tagArgs['pages'])) {\r
- if (($tagArgs['pages'] = $tplObj->get('pages')) === null) {\r
- throw new SystemException("missing 'pages' argument in pages tag", 12001);\r
- }\r
- }\r
- \r
- $html = '';\r
- \r
- if ($tagArgs['pages'] > 1) {\r
- // define page link for js function\r
- $html .= "<script type=\"text/javascript\">\n//<![CDATA[\nmultiPagesLinks.setPageLink('".StringUtil::replace("'", "\'", $tagArgs['link'])."');\n//]]>\n</script>";\r
- \r
- // encode link\r
- $tagArgs['link'] = StringUtil::encodeHTML($tagArgs['link']);\r
- \r
- if (!isset($tagArgs['page'])) {\r
- if (($tagArgs['page'] = $tplObj->get('pageNo')) === null) {\r
- $tagArgs['page'] = 0;\r
- }\r
- }\r
- \r
- // open div and ul\r
- $html .= "<div class=\"pageNavigation\">\n<ul>\n";\r
- \r
- // previous page\r
- $previousTitle = WCF::getLanguage()->getDynamicVariable('wcf.global.page.previous');\r
- if ($tagArgs['page'] > 1) {\r
- $html .= '<li class="skip"><a href="'.$this->insertPageNumber($tagArgs['link'], $tagArgs['page'] - 1).'" title="'.$previousTitle.'"><img src="'.self::getIconPath('previousS.png').'" alt="" /></a></li>'."\n";\r
- }\r
- else {\r
- $html .= '<li class="skip"><img src="'.self::getIconPath('previousDisabledS.png').'" alt="" /></li>'."\n";\r
- }\r
- \r
- // first page\r
- $html .= $this->makeLink($tagArgs['link'], 1, $tagArgs['page']);\r
- \r
- // calculate page links\r
- $maxLinks = self::SHOW_LINKS - 4;\r
- $linksBeforePage = $tagArgs['page'] - 2;\r
- if ($linksBeforePage < 0) $linksBeforePage = 0; \r
- $linksAfterPage = $tagArgs['pages'] - ($tagArgs['page'] + 1);\r
- if ($linksAfterPage < 0) $linksAfterPage = 0; \r
- if ($tagArgs['page'] > 1 && $tagArgs['page'] < $tagArgs['pages']) {\r
- $maxLinks--;\r
- }\r
- \r
- $half = $maxLinks / 2;\r
- $left = $right = $tagArgs['page'];\r
- if ($left < 1) $left = 1;\r
- if ($right < 1) $right = 1;\r
- if ($right > $tagArgs['pages'] - 1) $right = $tagArgs['pages'] - 1;\r
- \r
- if ($linksBeforePage >= $half) {\r
- $left -= $half;\r
- }\r
- else {\r
- $left -= $linksBeforePage;\r
- $right += $half - $linksBeforePage;\r
- }\r
- \r
- if ($linksAfterPage >= $half) {\r
- $right += $half;\r
- }\r
- else {\r
- $right += $linksAfterPage;\r
- $left -= $half - $linksAfterPage;\r
- }\r
- \r
- $right = intval(ceil($right));\r
- $left = intval(ceil($left));\r
- if ($left < 1) $left = 1;\r
- if ($right > $tagArgs['pages']) $right = $tagArgs['pages'];\r
- \r
- // left ... links\r
- if ($left > 1) {\r
- if ($left - 1 < 2) {\r
- $html .= $this->makeLink($tagArgs['link'], 2, $tagArgs['page']);\r
- }\r
- else {\r
- $html .= '<li class="children"><a onclick="multiPagesLinks.startPageNumberInput(this)">…<img src="'.self::getIconPath('arrowDown.png').'" alt="" /></a><input type="text" class="inputText" name="pageNo" /><div><ul>'."\n";\r
- \r
- $k = 0;\r
- $step = intval(ceil(($left - 2) / self::SHOW_SUB_LINKS));\r
- for ($i = 2; $i <= $left; $i += $step) {\r
- $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page'], $k != 0 && $k % 4 == 0);\r
- $k++;\r
- }\r
- \r
- $html .= "</ul></div></li>\n";\r
- }\r
- }\r
- \r
- // visible links\r
- for ($i = $left + 1; $i < $right; $i++) {\r
- $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page']);\r
- }\r
- \r
- // right ... links\r
- if ($right < $tagArgs['pages']) {\r
- if ($tagArgs['pages'] - $right < 2) {\r
- $html .= $this->makeLink($tagArgs['link'], $tagArgs['pages'] - 1, $tagArgs['page']);\r
- }\r
- else {\r
- $html .= '<li class="children"><a onclick="multiPagesLinks.startPageNumberInput(this)">…<img src="'.self::getIconPath('arrowDown.png').'" alt="" /></a><input type="text" class="inputText" name="page" /><div><ul>'."\n";\r
- \r
- $k = 0;\r
- $step = intval(ceil(($tagArgs['pages'] - $right) / self::SHOW_SUB_LINKS));\r
- for ($i = $right; $i < $tagArgs['pages']; $i += $step) {\r
- $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page'], $k != 0 && $k % 4 == 0);\r
- $k++;\r
- }\r
- \r
- $html .= "</ul></div></li>\n";\r
- }\r
- }\r
- \r
- // last page\r
- $html .= $this->makeLink($tagArgs['link'], $tagArgs['pages'], $tagArgs['page']);\r
- \r
- // next page\r
- $nextTitle = WCF::getLanguage()->getDynamicVariable('wcf.global.page.next');\r
- if ($tagArgs['page'] && $tagArgs['page'] < $tagArgs['pages']) {\r
- $html .= '<li class="skip"><a href="'.$this->insertPageNumber($tagArgs['link'], $tagArgs['page'] + 1).'" title="'.$nextTitle.'"><img src="'.self::getIconPath('nextS.png').'" alt="" /></a></li>'."\n";\r
- }\r
- else {\r
- $html .= '<li class="skip"><img src="'.self::getIconPath('nextDisabledS.png').'" alt="" /></li>'."\n";\r
- }\r
- \r
- // close div and ul\r
- $html .= "</ul></div>\n";\r
- }\r
- \r
- // assign html output to template var\r
- if (isset($tagArgs['assign'])) {\r
- $tplObj->assign($tagArgs['assign'], $html);\r
- if (!isset($tagArgs['print']) || !$tagArgs['print']) return '';\r
- }\r
- \r
- return $html;\r
- }\r
- \r
- private static function getIconPath($filename) {\r
- if (class_exists('StyleManager')) {\r
- return StyleManager::getStyle()->getIconPath($filename);\r
- }\r
- else {\r
- return RELATIVE_WCF_DIR.'icon/'.$filename;\r
- }\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\WCF;
+use wcf\system\exception\SystemException;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginFunction;
+use wcf\util\StringUtil;
+
+/**
+ * The 'pages' template function is used to generate sliding pagers.
+ *
+ * Usage:
+ * {pages pages=10 link='page-%d.html'}
+ * {pages page=8 pages=10 link='page-%d.html'}
+ *
+ * assign to variable 'output'; do not print:
+ * {pages page=8 pages=10 link='page-%d.html' assign='output'}
+ *
+ * assign to variable 'output' and do print also:
+ * {pages page=8 pages=10 link='page-%d.html' assign='output' print=true}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginFunctionPages implements ITemplatePluginFunction {
+ const SHOW_LINKS = 11;
+ const SHOW_SUB_LINKS = 20;
+
+ /**
+ * Inserts the page number into the link.
+ *
+ * @param string $link
+ * @param integer $pageNo
+ * @return string final link
+ */
+ protected static function insertPageNumber($link, $pageNo) {
+ $startPos = StringUtil::indexOf($link, '%d');
+ if ($startPos !== null) $link = StringUtil::substring($link, 0, $startPos) . $pageNo . StringUtil::substring($link, $startPos + 2);
+ return $link;
+ }
+
+ /**
+ * Generates html code of a link.
+ *
+ * @param string $link
+ * @param integer $pageNo
+ * @param integer $activePage
+ * @param boolean $break
+ * @return string
+ */
+ protected function makeLink($link, $pageNo, $activePage, $break = false) {
+ // first page
+ if ($activePage != $pageNo) {
+ return '<li'.($break ? ' class="break"' : '').'><a href="'.$this->insertPageNumber($link, $pageNo).'">'.StringUtil::formatInteger($pageNo).'</a></li>'."\n";
+ }
+ else {
+ return '<li class="'.($break ? 'break ' : '').'active"><span>'.StringUtil::formatInteger($pageNo).'</span></li>'."\n";
+ }
+ }
+
+ /**
+ * @see wcf\system\template\ITemplatePluginFunction::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ // needed params: link, page, pages
+ if (!isset($tagArgs['link'])) throw new SystemException("missing 'link' argument in pages tag", 12001);
+ if (!isset($tagArgs['pages'])) {
+ if (($tagArgs['pages'] = $tplObj->get('pages')) === null) {
+ throw new SystemException("missing 'pages' argument in pages tag", 12001);
+ }
+ }
+
+ $html = '';
+
+ if ($tagArgs['pages'] > 1) {
+ // define page link for js function
+ $html .= "<script type=\"text/javascript\">\n//<![CDATA[\nmultiPagesLinks.setPageLink('".StringUtil::replace("'", "\'", $tagArgs['link'])."');\n//]]>\n</script>";
+
+ // encode link
+ $tagArgs['link'] = StringUtil::encodeHTML($tagArgs['link']);
+
+ if (!isset($tagArgs['page'])) {
+ if (($tagArgs['page'] = $tplObj->get('pageNo')) === null) {
+ $tagArgs['page'] = 0;
+ }
+ }
+
+ // open div and ul
+ $html .= "<div class=\"pageNavigation\">\n<ul>\n";
+
+ // previous page
+ $previousTitle = WCF::getLanguage()->getDynamicVariable('wcf.global.page.previous');
+ if ($tagArgs['page'] > 1) {
+ $html .= '<li class="skip"><a href="'.$this->insertPageNumber($tagArgs['link'], $tagArgs['page'] - 1).'" title="'.$previousTitle.'"><img src="'.self::getIconPath('previousS.png').'" alt="" /></a></li>'."\n";
+ }
+ else {
+ $html .= '<li class="skip"><img src="'.self::getIconPath('previousDisabledS.png').'" alt="" /></li>'."\n";
+ }
+
+ // first page
+ $html .= $this->makeLink($tagArgs['link'], 1, $tagArgs['page']);
+
+ // calculate page links
+ $maxLinks = self::SHOW_LINKS - 4;
+ $linksBeforePage = $tagArgs['page'] - 2;
+ if ($linksBeforePage < 0) $linksBeforePage = 0;
+ $linksAfterPage = $tagArgs['pages'] - ($tagArgs['page'] + 1);
+ if ($linksAfterPage < 0) $linksAfterPage = 0;
+ if ($tagArgs['page'] > 1 && $tagArgs['page'] < $tagArgs['pages']) {
+ $maxLinks--;
+ }
+
+ $half = $maxLinks / 2;
+ $left = $right = $tagArgs['page'];
+ if ($left < 1) $left = 1;
+ if ($right < 1) $right = 1;
+ if ($right > $tagArgs['pages'] - 1) $right = $tagArgs['pages'] - 1;
+
+ if ($linksBeforePage >= $half) {
+ $left -= $half;
+ }
+ else {
+ $left -= $linksBeforePage;
+ $right += $half - $linksBeforePage;
+ }
+
+ if ($linksAfterPage >= $half) {
+ $right += $half;
+ }
+ else {
+ $right += $linksAfterPage;
+ $left -= $half - $linksAfterPage;
+ }
+
+ $right = intval(ceil($right));
+ $left = intval(ceil($left));
+ if ($left < 1) $left = 1;
+ if ($right > $tagArgs['pages']) $right = $tagArgs['pages'];
+
+ // left ... links
+ if ($left > 1) {
+ if ($left - 1 < 2) {
+ $html .= $this->makeLink($tagArgs['link'], 2, $tagArgs['page']);
+ }
+ else {
+ $html .= '<li class="children"><a onclick="multiPagesLinks.startPageNumberInput(this)">…<img src="'.self::getIconPath('arrowDown.png').'" alt="" /></a><input type="text" class="inputText" name="pageNo" /><div><ul>'."\n";
+
+ $k = 0;
+ $step = intval(ceil(($left - 2) / self::SHOW_SUB_LINKS));
+ for ($i = 2; $i <= $left; $i += $step) {
+ $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page'], $k != 0 && $k % 4 == 0);
+ $k++;
+ }
+
+ $html .= "</ul></div></li>\n";
+ }
+ }
+
+ // visible links
+ for ($i = $left + 1; $i < $right; $i++) {
+ $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page']);
+ }
+
+ // right ... links
+ if ($right < $tagArgs['pages']) {
+ if ($tagArgs['pages'] - $right < 2) {
+ $html .= $this->makeLink($tagArgs['link'], $tagArgs['pages'] - 1, $tagArgs['page']);
+ }
+ else {
+ $html .= '<li class="children"><a onclick="multiPagesLinks.startPageNumberInput(this)">…<img src="'.self::getIconPath('arrowDown.png').'" alt="" /></a><input type="text" class="inputText" name="page" /><div><ul>'."\n";
+
+ $k = 0;
+ $step = intval(ceil(($tagArgs['pages'] - $right) / self::SHOW_SUB_LINKS));
+ for ($i = $right; $i < $tagArgs['pages']; $i += $step) {
+ $html .= $this->makeLink($tagArgs['link'], $i, $tagArgs['page'], $k != 0 && $k % 4 == 0);
+ $k++;
+ }
+
+ $html .= "</ul></div></li>\n";
+ }
+ }
+
+ // last page
+ $html .= $this->makeLink($tagArgs['link'], $tagArgs['pages'], $tagArgs['page']);
+
+ // next page
+ $nextTitle = WCF::getLanguage()->getDynamicVariable('wcf.global.page.next');
+ if ($tagArgs['page'] && $tagArgs['page'] < $tagArgs['pages']) {
+ $html .= '<li class="skip"><a href="'.$this->insertPageNumber($tagArgs['link'], $tagArgs['page'] + 1).'" title="'.$nextTitle.'"><img src="'.self::getIconPath('nextS.png').'" alt="" /></a></li>'."\n";
+ }
+ else {
+ $html .= '<li class="skip"><img src="'.self::getIconPath('nextDisabledS.png').'" alt="" /></li>'."\n";
+ }
+
+ // close div and ul
+ $html .= "</ul></div>\n";
+ }
+
+ // assign html output to template var
+ if (isset($tagArgs['assign'])) {
+ $tplObj->assign($tagArgs['assign'], $html);
+ if (!isset($tagArgs['print']) || !$tagArgs['print']) return '';
+ }
+
+ return $html;
+ }
+
+ private static function getIconPath($filename) {
+ if (class_exists('StyleManager')) {
+ return StyleManager::getStyle()->getIconPath($filename);
+ }
+ else {
+ return RELATIVE_WCF_DIR.'icon/'.$filename;
+ }
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\exception\SystemException;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-\r
-/**\r
- * The 'concat' modifier returns the string that results from concatenating the arguments.\r
- * May have two or more arguments.\r
- * \r
- * Usage:\r
- * {"left"|concat:$right}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginModifierConcat implements ITemplatePluginModifier {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginModifier::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- if (count($tagArgs) < 2) {\r
- throw new SystemException("concat modifier needs two or more arguments", 12001);\r
- }\r
- \r
- $result = '';\r
- foreach ($tagArgs as $arg) {\r
- $result .= $arg;\r
- }\r
- \r
- return $result; \r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\exception\SystemException;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+
+/**
+ * The 'concat' modifier returns the string that results from concatenating the arguments.
+ * May have two or more arguments.
+ *
+ * Usage:
+ * {"left"|concat:$right}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginModifierConcat implements ITemplatePluginModifier {
+ /**
+ * @see wcf\system\template\ITemplatePluginModifier::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ if (count($tagArgs) < 2) {
+ throw new SystemException("concat modifier needs two or more arguments", 12001);
+ }
+
+ $result = '';
+ foreach ($tagArgs as $arg) {
+ $result .= $arg;
+ }
+
+ return $result;
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * The 'date' modifier formats a unix timestamp.\r
- * Default date format contains year, month and day.\r
- * \r
- * Usage:\r
- * {$timestamp|date}\r
- * {"132845333"|date:"Y-m-d"}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginModifierDate implements ITemplatePluginModifier {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginModifier::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- return DateUtil::format(DateUtil::getDateTimeByTimestamp($tagArgs[0]), (!empty($tagArgs[2]) ? $tagArgs[2] : DateUtil::DATE_FORMAT));\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\util\DateUtil;
+
+/**
+ * The 'date' modifier formats a unix timestamp.
+ * Default date format contains year, month and day.
+ *
+ * Usage:
+ * {$timestamp|date}
+ * {"132845333"|date:"Y-m-d"}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginModifierDate implements ITemplatePluginModifier {
+ /**
+ * @see wcf\system\template\ITemplatePluginModifier::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ return DateUtil::format(DateUtil::getDateTimeByTimestamp($tagArgs[0]), (!empty($tagArgs[2]) ? $tagArgs[2] : DateUtil::DATE_FORMAT));
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'encodejs' modifier formats a string for usage in a single quoted javascript string. \r
- * Escapes single quotes and new lines.\r
- * \r
- * Usage:\r
- * {$string|encodejs}\r
- * {"bl''ah"|encodejs}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginModifierEncodejs implements ITemplatePluginModifier {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginModifier::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- // escape backslash\r
- $tagArgs[0] = StringUtil::replace("\\", "\\\\", $tagArgs[0]);\r
- \r
- // escape singe quote\r
- $tagArgs[0] = StringUtil::replace("'", "\'", $tagArgs[0]);\r
- \r
- // escape new lines\r
- $tagArgs[0] = StringUtil::replace("\n", '\n', $tagArgs[0]);\r
- \r
- // escape slashes\r
- $tagArgs[0] = StringUtil::replace("/", '\/', $tagArgs[0]);\r
- \r
- return $tagArgs[0];\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\util\StringUtil;
+
+/**
+ * The 'encodejs' modifier formats a string for usage in a single quoted javascript string.
+ * Escapes single quotes and new lines.
+ *
+ * Usage:
+ * {$string|encodejs}
+ * {"bl''ah"|encodejs}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginModifierEncodejs implements ITemplatePluginModifier {
+ /**
+ * @see wcf\system\template\ITemplatePluginModifier::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ // escape backslash
+ $tagArgs[0] = StringUtil::replace("\\", "\\\\", $tagArgs[0]);
+
+ // escape singe quote
+ $tagArgs[0] = StringUtil::replace("'", "\'", $tagArgs[0]);
+
+ // escape new lines
+ $tagArgs[0] = StringUtil::replace("\n", '\n', $tagArgs[0]);
+
+ // escape slashes
+ $tagArgs[0] = StringUtil::replace("/", '\/', $tagArgs[0]);
+
+ return $tagArgs[0];
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\util\FileUtil;\r
-\r
-/**\r
- * The 'filesize' modifier formats a filesize (given in bytes).\r
- * \r
- * Usage:\r
- * {$string|filesize}\r
- * {123456789|filesize}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginModifierFilesize implements ITemplatePluginModifier {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginModifier::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- return FileUtil::formatFilesize($tagArgs[0]);\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\util\FileUtil;
+
+/**
+ * The 'filesize' modifier formats a filesize (given in bytes).
+ *
+ * Usage:
+ * {$string|filesize}
+ * {123456789|filesize}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginModifierFilesize implements ITemplatePluginModifier {
+ /**
+ * @see wcf\system\template\ITemplatePluginModifier::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ return FileUtil::formatFilesize($tagArgs[0]);
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * The 'plainTime' modifier formats a unix timestamp.\r
- * Default date format contains year, month, day, hour and minute.\r
- * \r
- * Usage:\r
- * {$timestamp|plainTime}\r
- * {"132845333"|plainTime}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginModifierPlainTime implements ITemplatePluginModifier {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginModifier::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- $dateTime = DateUtil::getDateTimeByTimestamp($tagArgs[0]);\r
- return str_replace('%time%', DateUtil::format($dateTime, DateUtil::TIME_FORMAT), str_replace('%date%', DateUtil::format($dateTime, DateUtil::DATE_FORMAT), WCF::getLanguage()->get('wcf.global.date.dateTimeFormat')));\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+
+/**
+ * The 'plainTime' modifier formats a unix timestamp.
+ * Default date format contains year, month, day, hour and minute.
+ *
+ * Usage:
+ * {$timestamp|plainTime}
+ * {"132845333"|plainTime}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginModifierPlainTime implements ITemplatePluginModifier {
+ /**
+ * @see wcf\system\template\ITemplatePluginModifier::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ $dateTime = DateUtil::getDateTimeByTimestamp($tagArgs[0]);
+ return str_replace('%time%', DateUtil::format($dateTime, DateUtil::TIME_FORMAT), str_replace('%date%', DateUtil::format($dateTime, DateUtil::DATE_FORMAT), WCF::getLanguage()->get('wcf.global.date.dateTimeFormat')));
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\system\WCF;\r
-use wcf\util\DateUtil;\r
-\r
-/**\r
- * The 'time' modifier formats a unix timestamp.\r
- * Default date format contains year, month, day, hour and minute.\r
- * \r
- * Usage:\r
- * {$timestamp|time}\r
- * {"132845333"|time}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginModifierTime implements ITemplatePluginModifier {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginModifier::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- $timestamp = intval($tagArgs[0]);\r
- $dateTimeObject = DateUtil::getDateTimeByTimestamp($timestamp);\r
- $date = DateUtil::format($dateTimeObject, DateUtil::DATE_FORMAT);\r
- $time = DateUtil::format($dateTimeObject, DateUtil::TIME_FORMAT);\r
- $dateTime = str_replace('%time%', $time, str_replace('%date%', $date, WCF::getLanguage()->get('wcf.global.date.dateTimeFormat')));\r
- \r
- return '<time datetime="'.DateUtil::format($dateTimeObject, 'c').'" class="datetime" data-timestamp="'.$timestamp.'" data-date="'.$date.'" data-time="'.$time.'" data-offset="'.$dateTimeObject->getOffset().'">'.$dateTime.'</time>';\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\system\WCF;
+use wcf\util\DateUtil;
+
+/**
+ * The 'time' modifier formats a unix timestamp.
+ * Default date format contains year, month, day, hour and minute.
+ *
+ * Usage:
+ * {$timestamp|time}
+ * {"132845333"|time}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginModifierTime implements ITemplatePluginModifier {
+ /**
+ * @see wcf\system\template\ITemplatePluginModifier::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ $timestamp = intval($tagArgs[0]);
+ $dateTimeObject = DateUtil::getDateTimeByTimestamp($timestamp);
+ $date = DateUtil::format($dateTimeObject, DateUtil::DATE_FORMAT);
+ $time = DateUtil::format($dateTimeObject, DateUtil::TIME_FORMAT);
+ $dateTime = str_replace('%time%', $time, str_replace('%date%', $date, WCF::getLanguage()->get('wcf.global.date.dateTimeFormat')));
+
+ return '<time datetime="'.DateUtil::format($dateTimeObject, 'c').'" class="datetime" data-timestamp="'.$timestamp.'" data-date="'.$date.'" data-time="'.$time.'" data-offset="'.$dateTimeObject->getOffset().'">'.$dateTime.'</time>';
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\TemplateEngine;\r
-use wcf\system\template\ITemplatePluginModifier;\r
-use wcf\util\StringUtil;\r
-\r
-/**\r
- * The 'truncate' modifier truncates a string.\r
- * \r
- * Usage:\r
- * {$foo|truncate:35:'...'}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginModifierTruncate implements ITemplatePluginModifier {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginModifier::execute()\r
- */\r
- public function execute($tagArgs, TemplateEngine $tplObj) {\r
- // default values\r
- $length = 80;\r
- $etc = '...';\r
- $breakWords = false;\r
- \r
- // get values\r
- $string = $tagArgs[0];\r
- if (isset($tagArgs[1])) $length = intval($tagArgs[1]);\r
- if (isset($tagArgs[2])) $etc = $tagArgs[2];\r
- if (isset($tagArgs[3])) $breakWords = $tagArgs[3];\r
- \r
- // execute plugin\r
- if ($length == 0) {\r
- return '';\r
- }\r
-\r
- if (StringUtil::length($string) > $length) {\r
- $length -= StringUtil::length($etc);\r
- \r
- if (!$breakWords) {\r
- $string = preg_replace('/\s+?(\S+)?$/', '', StringUtil::substring($string, 0, $length + 1));\r
- }\r
- \r
- return StringUtil::substring($string, 0, $length).$etc;\r
- }\r
- else {\r
- return $string;\r
- }\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\TemplateEngine;
+use wcf\system\template\ITemplatePluginModifier;
+use wcf\util\StringUtil;
+
+/**
+ * The 'truncate' modifier truncates a string.
+ *
+ * Usage:
+ * {$foo|truncate:35:'...'}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginModifierTruncate implements ITemplatePluginModifier {
+ /**
+ * @see wcf\system\template\ITemplatePluginModifier::execute()
+ */
+ public function execute($tagArgs, TemplateEngine $tplObj) {
+ // default values
+ $length = 80;
+ $etc = '...';
+ $breakWords = false;
+
+ // get values
+ $string = $tagArgs[0];
+ if (isset($tagArgs[1])) $length = intval($tagArgs[1]);
+ if (isset($tagArgs[2])) $etc = $tagArgs[2];
+ if (isset($tagArgs[3])) $breakWords = $tagArgs[3];
+
+ // execute plugin
+ if ($length == 0) {
+ return '';
+ }
+
+ if (StringUtil::length($string) > $length) {
+ $length -= StringUtil::length($etc);
+
+ if (!$breakWords) {
+ $string = preg_replace('/\s+?(\S+)?$/', '', StringUtil::substring($string, 0, $length + 1));
+ }
+
+ return StringUtil::substring($string, 0, $length).$etc;
+ }
+ else {
+ return $string;
+ }
+ }
}
-<?php\r
-namespace wcf\system\template\plugin;\r
-use wcf\system\template\ITemplatePluginPrefilter;\r
-use wcf\system\template\TemplateScriptingCompiler;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * The 'lang' prefilter compiles static language variables.\r
- * Dynamic language variables will catched by the 'lang' compiler function.\r
- * It is recommended to use static language variables.\r
- * \r
- * Usage:\r
- * {lang}foo{/lang}\r
- * {lang}lang.foo.bar{/lang}\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage system.template.plugin\r
- * @category Community Framework\r
- */\r
-class TemplatePluginPrefilterLang implements ITemplatePluginPrefilter {\r
- /**\r
- * @see wcf\system\template\ITemplatePluginPrefilter::execute()\r
- */\r
- public function execute($templateName, $sourceContent, TemplateScriptingCompiler $compiler) {\r
- $ldq = preg_quote($compiler->getLeftDelimiter(), '~');\r
- $rdq = preg_quote($compiler->getRightDelimiter(), '~');\r
- $sourceContent = preg_replace("~{$ldq}lang{$rdq}([\w\.]+){$ldq}/lang{$rdq}~e", 'wcf\system\WCF::getLanguage()->get(\'$1\')', $sourceContent);\r
-\r
- return $sourceContent;\r
- }\r
+<?php
+namespace wcf\system\template\plugin;
+use wcf\system\template\ITemplatePluginPrefilter;
+use wcf\system\template\TemplateScriptingCompiler;
+use wcf\system\WCF;
+
+/**
+ * The 'lang' prefilter compiles static language variables.
+ * Dynamic language variables will catched by the 'lang' compiler function.
+ * It is recommended to use static language variables.
+ *
+ * Usage:
+ * {lang}foo{/lang}
+ * {lang}lang.foo.bar{/lang}
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage system.template.plugin
+ * @category Community Framework
+ */
+class TemplatePluginPrefilterLang implements ITemplatePluginPrefilter {
+ /**
+ * @see wcf\system\template\ITemplatePluginPrefilter::execute()
+ */
+ public function execute($templateName, $sourceContent, TemplateScriptingCompiler $compiler) {
+ $ldq = preg_quote($compiler->getLeftDelimiter(), '~');
+ $rdq = preg_quote($compiler->getRightDelimiter(), '~');
+ $sourceContent = preg_replace("~{$ldq}lang{$rdq}([\w\.]+){$ldq}/lang{$rdq}~e", 'wcf\system\WCF::getLanguage()->get(\'$1\')', $sourceContent);
+
+ return $sourceContent;
+ }
}
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Contains Array-related functions.\r
- *\r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-class ArrayUtil {\r
- /**\r
- * Applies StringUtil::trim() to all elements of an array.\r
- *\r
- * @param array $array\r
- * @param boolean $removeEmptyElements\r
- * @return array $array\r
- */\r
- public static function trim($array, $removeEmptyElements = true) {\r
- if (!is_array($array)) {\r
- return StringUtil::trim($array);\r
- }\r
- else {\r
- foreach ($array as $key => $val) {\r
- $temp = self::trim($val, $removeEmptyElements);\r
- if ($removeEmptyElements && empty($temp)) unset($array[$key]);\r
- else $array[$key] = $temp;\r
- }\r
- return $array;\r
- }\r
- }\r
- \r
- /**\r
- * Applies intval() to all elements of an array.\r
- *\r
- * @param array $array\r
- * @return array $array\r
- */\r
- public static function toIntegerArray($array) {\r
- if (!is_array($array)) {\r
- return intval($array);\r
- }\r
- else {\r
- foreach ($array as $key => $val) {\r
- $array[$key] = self::toIntegerArray($val);\r
- }\r
- return $array;\r
- }\r
- }\r
- \r
- /**\r
- * Converts html special characters in arrays.\r
- *\r
- * @param array $array\r
- * @return array $array\r
- */\r
- public static function encodeHTML($array) {\r
- if (!is_array($array)) {\r
- return StringUtil::encodeHTML($array);\r
- }\r
- else {\r
- foreach ($array as $key => $val) {\r
- $array[$key] = self::encodeHTML($val);\r
- }\r
- return $array;\r
- }\r
- }\r
- \r
- /**\r
- * Applies stripslashes on all elements of an array.\r
- *\r
- * @param array $array\r
- * @return array $array\r
- */\r
- public static function stripslashes($array) {\r
- if (!is_array($array)) {\r
- return stripslashes($array);\r
- }\r
- else {\r
- foreach ($array as $key => $val) {\r
- $array[$key] = self::stripslashes($val);\r
- }\r
- return $array;\r
- }\r
- }\r
- \r
- /**\r
- * Appends a suffix to all elements of the given array.\r
- *\r
- * @param array $array\r
- * @param string $suffix\r
- * @return array\r
- */\r
- public static function appendSuffix($array, $suffix) {\r
- foreach ($array as $key => $value) {\r
- $array[$key] = $value . $suffix;\r
- }\r
- \r
- return $array;\r
- }\r
- \r
- /**\r
- * Computes the intersection of arrays using keys for comparison\r
- * Alias to php array_intersect_key() function\r
- *\r
- * @param array $array1 The array with master keys to check. \r
- * @param array $array2 An array to compare keys against.\r
- * @return Returns an associative array containing all the values of array1 which have matching keys that are present in all arguments. \r
- * @see array_intersect_key\r
- */\r
- public static function intersectKeys($array1, $array2) {\r
- if (!function_exists('array_intersect_key')) {\r
- $numberOfArguments = func_num_args();\r
- for ($i = 1; !empty($array1) && $i < $numberOfArguments; $i++) {\r
- $currentArray = func_get_arg($i);\r
- foreach (array_keys($array1) as $key) {\r
- if (!isset($currentArray[$key])) {\r
- unset($array1[$key]);\r
- }\r
- }\r
- }\r
- return $array1;\r
- } \r
- else {\r
- $parameters = func_get_args();\r
- return call_user_func_array('array_intersect_key', $parameters);\r
- }\r
- }\r
- \r
- /**\r
- * Converts dos to unix newlines.\r
- *\r
- * @param array $array\r
- * @return array $array\r
- */\r
- public static function unifyNewlines($array) {\r
- if (!is_array($array)) {\r
- return StringUtil::unifyNewlines($array);\r
- }\r
- else {\r
- foreach ($array as $key => $val) {\r
- $array[$key] = self::unifyNewlines($val);\r
- }\r
- return $array;\r
- }\r
- }\r
- \r
- /**\r
- * Converts a array of strings to requested character encoding.\r
- * @see mb_convert_encoding()\r
- * \r
- * @param string $inCharset\r
- * @param string $outCharset\r
- * @param string $array\r
- * @return string $array\r
- */\r
- public static function convertEncoding($inCharset, $outCharset, $array) {\r
- if (!is_array($array)) {\r
- return StringUtil::convertEncoding($inCharset, $outCharset, $array);\r
- }\r
- else {\r
- foreach ($array as $key => $val) {\r
- $array[$key] = self::convertEncoding($inCharset, $outCharset, $val);\r
- }\r
- return $array;\r
- }\r
- }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Contains Array-related functions.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage util
+ * @category Community Framework
+ */
+class ArrayUtil {
+ /**
+ * Applies StringUtil::trim() to all elements of an array.
+ *
+ * @param array $array
+ * @param boolean $removeEmptyElements
+ * @return array $array
+ */
+ public static function trim($array, $removeEmptyElements = true) {
+ if (!is_array($array)) {
+ return StringUtil::trim($array);
+ }
+ else {
+ foreach ($array as $key => $val) {
+ $temp = self::trim($val, $removeEmptyElements);
+ if ($removeEmptyElements && empty($temp)) unset($array[$key]);
+ else $array[$key] = $temp;
+ }
+ return $array;
+ }
+ }
+
+ /**
+ * Applies intval() to all elements of an array.
+ *
+ * @param array $array
+ * @return array $array
+ */
+ public static function toIntegerArray($array) {
+ if (!is_array($array)) {
+ return intval($array);
+ }
+ else {
+ foreach ($array as $key => $val) {
+ $array[$key] = self::toIntegerArray($val);
+ }
+ return $array;
+ }
+ }
+
+ /**
+ * Converts html special characters in arrays.
+ *
+ * @param array $array
+ * @return array $array
+ */
+ public static function encodeHTML($array) {
+ if (!is_array($array)) {
+ return StringUtil::encodeHTML($array);
+ }
+ else {
+ foreach ($array as $key => $val) {
+ $array[$key] = self::encodeHTML($val);
+ }
+ return $array;
+ }
+ }
+
+ /**
+ * Applies stripslashes on all elements of an array.
+ *
+ * @param array $array
+ * @return array $array
+ */
+ public static function stripslashes($array) {
+ if (!is_array($array)) {
+ return stripslashes($array);
+ }
+ else {
+ foreach ($array as $key => $val) {
+ $array[$key] = self::stripslashes($val);
+ }
+ return $array;
+ }
+ }
+
+ /**
+ * Appends a suffix to all elements of the given array.
+ *
+ * @param array $array
+ * @param string $suffix
+ * @return array
+ */
+ public static function appendSuffix($array, $suffix) {
+ foreach ($array as $key => $value) {
+ $array[$key] = $value . $suffix;
+ }
+
+ return $array;
+ }
+
+ /**
+ * Computes the intersection of arrays using keys for comparison
+ * Alias to php array_intersect_key() function
+ *
+ * @param array $array1 The array with master keys to check.
+ * @param array $array2 An array to compare keys against.
+ * @return Returns an associative array containing all the values of array1 which have matching keys that are present in all arguments.
+ * @see array_intersect_key
+ */
+ public static function intersectKeys($array1, $array2) {
+ if (!function_exists('array_intersect_key')) {
+ $numberOfArguments = func_num_args();
+ for ($i = 1; !empty($array1) && $i < $numberOfArguments; $i++) {
+ $currentArray = func_get_arg($i);
+ foreach (array_keys($array1) as $key) {
+ if (!isset($currentArray[$key])) {
+ unset($array1[$key]);
+ }
+ }
+ }
+ return $array1;
+ }
+ else {
+ $parameters = func_get_args();
+ return call_user_func_array('array_intersect_key', $parameters);
+ }
+ }
+
+ /**
+ * Converts dos to unix newlines.
+ *
+ * @param array $array
+ * @return array $array
+ */
+ public static function unifyNewlines($array) {
+ if (!is_array($array)) {
+ return StringUtil::unifyNewlines($array);
+ }
+ else {
+ foreach ($array as $key => $val) {
+ $array[$key] = self::unifyNewlines($val);
+ }
+ return $array;
+ }
+ }
+
+ /**
+ * Converts a array of strings to requested character encoding.
+ * @see mb_convert_encoding()
+ *
+ * @param string $inCharset
+ * @param string $outCharset
+ * @param string $array
+ * @return string $array
+ */
+ public static function convertEncoding($inCharset, $outCharset, $array) {
+ if (!is_array($array)) {
+ return StringUtil::convertEncoding($inCharset, $outCharset, $array);
+ }
+ else {
+ foreach ($array as $key => $val) {
+ $array[$key] = self::convertEncoding($inCharset, $outCharset, $val);
+ }
+ return $array;
+ }
+ }
}
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Contains file-related functions.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-class BasicFileUtil {\r
- /**\r
- * Tries to find the temp folder.\r
- * \r
- * @return string\r
- */\r
- public static function getTempFolder() {\r
- // use tmp folder in document root by default\r
- if (!empty($_SERVER['DOCUMENT_ROOT'])) {\r
- if (strpos($_SERVER['DOCUMENT_ROOT'], 'strato') !== false) {\r
- // strato bugfix\r
- // create tmp folder in document root automatically\r
- if (!@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp')) { \r
- @mkdir($_SERVER['DOCUMENT_ROOT'].'/tmp/', 0777);\r
- @chmod($_SERVER['DOCUMENT_ROOT'].'/tmp/', 0777);\r
- }\r
- }\r
- if (@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp') && @is_writable($_SERVER['DOCUMENT_ROOT'].'/tmp')) {\r
- return $_SERVER['DOCUMENT_ROOT'].'/tmp/';\r
- }\r
- }\r
- \r
- if (isset($_ENV['TMP']) && @is_writable($_ENV['TMP'])) {\r
- return $_ENV['TMP'] . '/';\r
- }\r
- if (isset($_ENV['TEMP']) && @is_writable($_ENV['TEMP'])) {\r
- return $_ENV['TEMP'] . '/';\r
- }\r
- if (isset($_ENV['TMPDIR']) && @is_writable($_ENV['TMPDIR'])) {\r
- return $_ENV['TMPDIR'] . '/';\r
- }\r
- \r
- // workaround for a bug in php 5.1.2 that returns true for is_writable('/tmp/') with safe_mode = on\r
- if (!preg_match('/^5\.1\.2(?![.0-9])/', phpversion())) {\r
- if (($path = ini_get('upload_tmp_dir')) && @is_writable($path)) {\r
- return $path . '/';\r
- }\r
- if (@file_exists('/tmp/') && @is_writable('/tmp/')) {\r
- return '/tmp/';\r
- }\r
- if (function_exists('session_save_path') && ($path = session_save_path()) && @is_writable($path)) {\r
- return $path . '/';\r
- }\r
- }\r
- \r
- $path = WCF_DIR.'tmp/';\r
- if (@file_exists($path) && @is_writable($path)) {\r
- return $path;\r
- }\r
- else {\r
- if (ini_get('safe_mode')) $reason = "due to php safe_mode restrictions";\r
- else $reason = "due to an unknown reason";\r
- throw new SystemException('There is no access to the system temporary folder '.$reason.' and no user specific temporary folder exists in '.WCF_DIR.'! This is a misconfiguration of your webserver software! Please create a folder called '.$path.' using your favorite ftp program, make it writable and then retry this installation.', 10000);\r
- }\r
- }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Contains file-related functions.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage util
+ * @category Community Framework
+ */
+class BasicFileUtil {
+ /**
+ * Tries to find the temp folder.
+ *
+ * @return string
+ */
+ public static function getTempFolder() {
+ // use tmp folder in document root by default
+ if (!empty($_SERVER['DOCUMENT_ROOT'])) {
+ if (strpos($_SERVER['DOCUMENT_ROOT'], 'strato') !== false) {
+ // strato bugfix
+ // create tmp folder in document root automatically
+ if (!@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp')) {
+ @mkdir($_SERVER['DOCUMENT_ROOT'].'/tmp/', 0777);
+ @chmod($_SERVER['DOCUMENT_ROOT'].'/tmp/', 0777);
+ }
+ }
+ if (@file_exists($_SERVER['DOCUMENT_ROOT'].'/tmp') && @is_writable($_SERVER['DOCUMENT_ROOT'].'/tmp')) {
+ return $_SERVER['DOCUMENT_ROOT'].'/tmp/';
+ }
+ }
+
+ if (isset($_ENV['TMP']) && @is_writable($_ENV['TMP'])) {
+ return $_ENV['TMP'] . '/';
+ }
+ if (isset($_ENV['TEMP']) && @is_writable($_ENV['TEMP'])) {
+ return $_ENV['TEMP'] . '/';
+ }
+ if (isset($_ENV['TMPDIR']) && @is_writable($_ENV['TMPDIR'])) {
+ return $_ENV['TMPDIR'] . '/';
+ }
+
+ // workaround for a bug in php 5.1.2 that returns true for is_writable('/tmp/') with safe_mode = on
+ if (!preg_match('/^5\.1\.2(?![.0-9])/', phpversion())) {
+ if (($path = ini_get('upload_tmp_dir')) && @is_writable($path)) {
+ return $path . '/';
+ }
+ if (@file_exists('/tmp/') && @is_writable('/tmp/')) {
+ return '/tmp/';
+ }
+ if (function_exists('session_save_path') && ($path = session_save_path()) && @is_writable($path)) {
+ return $path . '/';
+ }
+ }
+
+ $path = WCF_DIR.'tmp/';
+ if (@file_exists($path) && @is_writable($path)) {
+ return $path;
+ }
+ else {
+ if (ini_get('safe_mode')) $reason = "due to php safe_mode restrictions";
+ else $reason = "due to an unknown reason";
+ throw new SystemException('There is no access to the system temporary folder '.$reason.' and no user specific temporary folder exists in '.WCF_DIR.'! This is a misconfiguration of your webserver software! Please create a folder called '.$path.' using your favorite ftp program, make it writable and then retry this installation.', 10000);
+ }
+ }
}
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Provides methods for class interactions.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-class ClassUtil {\r
- /**\r
- * Checks wether given class extends or implements the target class or interface.\r
- * You SHOULD NOT call this method if 'instanceof' satisfies your request!\r
- *\r
- * @param string $className\r
- * @param string $targetClass\r
- * @return boolean\r
- */\r
- public static function isInstanceOf($className, $targetClass) {\r
- if (!is_string($className)) return false;\r
- \r
- if (class_exists($targetClass)) {\r
- return is_subclass_of($className, $targetClass);\r
- }\r
- else if (interface_exists($targetClass)) {\r
- $reflectionClass = new \ReflectionClass($className);\r
- return $reflectionClass->implementsInterface($targetClass);\r
- }\r
- \r
- return false;\r
- }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Provides methods for class interactions.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage util
+ * @category Community Framework
+ */
+class ClassUtil {
+ /**
+ * Checks wether given class extends or implements the target class or interface.
+ * You SHOULD NOT call this method if 'instanceof' satisfies your request!
+ *
+ * @param string $className
+ * @param string $targetClass
+ * @return boolean
+ */
+ public static function isInstanceOf($className, $targetClass) {
+ if (!is_string($className)) return false;
+
+ if (class_exists($targetClass)) {
+ return is_subclass_of($className, $targetClass);
+ }
+ else if (interface_exists($targetClass)) {
+ $reflectionClass = new \ReflectionClass($className);
+ return $reflectionClass->implementsInterface($targetClass);
+ }
+
+ return false;
+ }
}
\ No newline at end of file
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Provides methods used for cron-like time calculations.\r
- * As against the official cron-documentation, this implementation\r
- * does not support using nicknames (prefixed by the '@' character).\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-abstract class CronjobUtil {\r
- /**\r
- * Set to true if day of month is '*'\r
- * \r
- * @var boolean\r
- */\r
- protected static $domRestricted = false;\r
- \r
- /**\r
- * Set to true if day of week is '*'\r
- * \r
- * @var boolean\r
- */\r
- protected static $dowRestricted = false;\r
- \r
- /**\r
- * Result date\r
- * \r
- * @var array<integer>\r
- */\r
- protected static $result = array();\r
- \r
- /**\r
- * Time based used as reference for finding the next time of execution\r
- * \r
- * @var integer\r
- */\r
- protected static $timeBase = 0;\r
- \r
- /**\r
- * Valid ranges for each known field. Note that the range for\r
- * 'day of month' is missing, since it varies on each month.\r
- * \r
- * @var array<array>\r
- */\r
- public static $ranges = array(\r
- 'minute' => array(0, 59),\r
- 'hour' => array(0, 23),\r
- 'dom' => array(1, 31),\r
- 'month' => array(1, 12),\r
- 'dow' => array(0, 6)\r
- );\r
- \r
- /**\r
- * Calculates timestamp for next execution based on cron-like expressions and a given time base.\r
- * \r
- * @param string $minute\r
- * @param string $hour\r
- * @param string $dom\r
- * @param string $month\r
- * @param string $dow\r
- * @param integer $timeBase\r
- * @return integer\r
- */\r
- public static function calculateNextExec($minute, $hour, $dom, $month, $dow, $timeBase = TIME_NOW) {\r
- // initialize fields\r
- self::$timeBase = $timeBase;\r
- self::$result = array(\r
- 'minute' => 0,\r
- 'hour' => 0,\r
- 'day' => 0,\r
- 'month' => 0,\r
- 'year' => 0\r
- );\r
- \r
- $fields = array(\r
- 'minute' => $minute,\r
- 'hour' => $hour,\r
- 'dom' => $dom,\r
- 'month' => $month,\r
- 'dow' => $dow\r
- );\r
- \r
- self::$domRestricted = ($dom != '*') ? true : false;\r
- self::$dowRestricted = ($dow != '*') ? true : false;\r
- \r
- // calculate values based upon each expression\r
- foreach ($fields as $fieldName => $fieldValue) {\r
- $fieldValue = StringUtil::toLowerCase($fieldValue);\r
- \r
- // Names can also be used for the "month" and "day of week" fields.\r
- // Use the first three letters of the particular day or month (case\r
- // doesn't matter). Ranges or lists of names are not allowed.\r
- // -- crontab (5)\r
- \r
- switch ($fieldName) {\r
- case 'dow':\r
- $dayNames = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');\r
- \r
- if (strlen($fieldValue) == 3 && in_array($fieldName, $dayNames)) {\r
- $fieldValue = $monthNames[$fieldValue];\r
- }\r
- // When specifying day of week, both day 0 and day 7\r
- // will be considered Sunday. -- crontab(5) \r
- else if ($fieldValue == 7) {\r
- $fieldValue = 0;\r
- }\r
- break;\r
- \r
- case 'month':\r
- $monthNames = array('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec');\r
- \r
- if (strlen($fieldValue) == 3 && in_array($fieldValue, $monthNames)) {\r
- $fieldValue = $monthNames[$fieldValue] + 1;\r
- }\r
- break;\r
- }\r
- \r
- $values[$fieldName] = self::calculateValue($fieldName, $fieldValue);\r
- }\r
- \r
- // calculate date of next execution\r
- self::calculateTime($values);\r
- \r
- // return timestamp\r
- return mktime(\r
- self::$result['hour'],\r
- self::$result['minute'],\r
- 1,\r
- self::$result['month'],\r
- self::$result['day'],\r
- self::$result['year']\r
- );\r
- }\r
- \r
- /**\r
- * Calculates the date of next execution.\r
- * \r
- * @param array $values\r
- */\r
- protected static function calculateTime(array &$values) {\r
- $timestamp = false;\r
- \r
- // calculation starts with month, thus start with\r
- // month of $time (if within values)\r
- $currentMonth = date('n', self::$timeBase);\r
- $currentYear = date('Y', self::$timeBase);\r
- $index = self::findKey($currentMonth, $values['month']);\r
- \r
- self::calculateDay($values);\r
- }\r
- \r
- /**\r
- * Calculates the day while adjusting month and year to match given criteria.\r
- * \r
- * Note: The day of a command's execution can be specified by two fields - day\r
- * of month, and day of week. If both fields are restricted (ie, aren't *), the\r
- * command will be run when either field matches the current time. -- crontab(5)\r
- * \r
- * @param array $values\r
- * @see CronjobUtil::getDom()\r
- */\r
- protected static function calculateDay(array &$values) {\r
- $addAnDay = self::calculateHour($values, self::$timeBase);\r
- $timeBase = self::$timeBase;\r
- \r
- if ($addAnDay) {\r
- $date = getdate($timeBase);\r
- $timeBase = mktime(0, 0, 1, $date['mon'], $date['mday'] + 1, $date['year']);\r
- }\r
- \r
- $day = date('j', $timeBase);\r
- $month = date('n', $timeBase);\r
- $year = date('Y', $timeBase);\r
- \r
- // calculate date of next execution based upon day of week\r
- $dateDow = self::calculateDow($month, $year, $values, $day);\r
- $dateDowTimestamp = mktime(0, 0, 1, $dateDow['month'], $dateDow['day'], $dateDow['year']);\r
- \r
- // calculate date of next execution based upon day of month\r
- $dateDom = self::calculateDom($month, $year, $values, $day);\r
- $dateDomTimestamp = mktime(0, 0, 1, $dateDom['month'], $dateDom['day'], $dateDom['year']);\r
- \r
- // pick the earlier date if both dom and dow are restricted\r
- if (self::$domRestricted && self::$dowRestricted) {\r
- if ($dateDowTimestamp < $dateDomTimestamp) {\r
- self::$result['day'] = $dateDow['day'];\r
- self::$result['month'] = $dateDow['month'];\r
- self::$result['year'] = $dateDow['year'];\r
- }\r
- else {\r
- self::$result['day'] = $dateDom['day'];\r
- self::$result['month'] = $dateDom['month'];\r
- self::$result['year'] = $dateDom['year'];\r
- }\r
- }\r
- else {\r
- if (self::$domRestricted) {\r
- self::$result['day'] = $dateDom['day'];\r
- self::$result['month'] = $dateDom['month'];\r
- self::$result['year'] = $dateDom['year'];\r
- }\r
- else if (self::$dowRestricted) {\r
- self::$result['day'] = $dateDow['day'];\r
- self::$result['month'] = $dateDow['month'];\r
- self::$result['year'] = $dateDow['year'];\r
- }\r
- // neither dom nor dow are restricted, thus pick the date given by time base\r
- else {\r
- self::$result['day'] = $day;\r
- self::$result['month'] = $month;\r
- self::$result['year'] = $year;\r
- }\r
- \r
- }\r
- \r
- // compare day, month and year wether we have to recalculate hour and minute\r
- if (($day != self::$result['day']) || ($month != self::$result['month']) || ($year != self::$result['year'])) {\r
- // calculate new time base\r
- $timeBase = mktime(0, 0, 1, self::$result['month'], self::$result['day'], self::$result['year']);\r
- \r
- self::calculateHour($values, $timeBase);\r
- }\r
- }\r
- \r
- /**\r
- * Calculates the date of next execution based upon a given set for day of week.\r
- * \r
- * @param integer $month\r
- * @param integer $year\r
- * @param array $values\r
- * @param integer $day\r
- * @return array\r
- */\r
- protected static function calculateDow($month, $year, array &$values, $day = 1) {\r
- $days = date('t', mktime(0, 0, 1, $month, $day, $year));\r
- \r
- for ($i = $day; $i <= $days; $i++) {\r
- // get dow\r
- $dow = date('w', mktime(0, 0, 1, $month, $i, $year));\r
- \r
- if (in_array($dow, $values['dow'])) {\r
- return array(\r
- 'day' => $i,\r
- 'month' => $month,\r
- 'year' => $year\r
- );\r
- }\r
- }\r
- \r
- // try next month\r
- return self::calculateDow(++$month, $year, $values);\r
- }\r
- \r
- /**\r
- * Calculates the date of next execution based upon a given set for day of month.\r
- * \r
- * @param integer $month\r
- * @param integer $year\r
- * @param array $values\r
- * @param integer $day\r
- * @return array\r
- */\r
- protected static function calculateDom($month, $year, array &$values, $day = 1) {\r
- $days = date('t', mktime(0, 0, 1, $month, $day, $year));\r
- \r
- for ($i = $day; $i <= $days; $i++) {\r
- if (in_array($i, $values['dom'])) {\r
- return array(\r
- 'day' => $i,\r
- 'month' => $month,\r
- 'year' => $year\r
- );\r
- }\r
- }\r
- \r
- // try next month\r
- return self::calculateDom(++$month, $year, $values);\r
- }\r
- \r
- /**\r
- * Calculates hour of next execution. Returns number of days which\r
- * had been added in order to match expression for hour and minutes.\r
- * \r
- * @param array $values\r
- * @param integer $timeBase\r
- * @return integer\r
- */\r
- protected static function calculateHour(array &$values, &$timeBase) {\r
- $addAnDay = false;\r
- \r
- // compare hour\r
- $hour = intval(date('G', $timeBase));\r
- $index = self::findKey($hour, $values['hour'], false);\r
- if ($index === false) {\r
- $index = self::findKey($hour, $values['hour']);\r
- $addAnDay = true;\r
- }\r
- $hour = $values['hour'][$index];\r
- \r
- // calculate minutes\r
- $addAnHour = self::calculateMinute($values, $timeBase, $addAnDay);\r
- \r
- if ($addAnHour) {\r
- $hour++;\r
- $index = self::findKey($hour, $values['hour'], false);\r
- \r
- if ($index === false) {\r
- if ($index === false) {\r
- $index = self::findKey($hour, $values['hour']);\r
- $addAnDay = true;\r
- }\r
- $hour = $values['hour'][$index];\r
- }\r
- }\r
- \r
- self::$result['hour'] = $hour;\r
- \r
- return $addAnDay;\r
- }\r
- \r
- /**\r
- * Calculates minutes of next execution. Returns false if minute-declaration\r
- * is past the current hour, thus requires to add at least one hour.\r
- * \r
- * @param array $values\r
- * @param integer $timeBase\r
- * @return boolean\r
- */\r
- protected static function calculateMinute(array &$values, &$timeBase, $addAnDay) {\r
- $returnValue = false;\r
- \r
- if ($addAnDay) {\r
- $minute = 0;\r
- }\r
- else {\r
- $minute = date('i', $timeBase);\r
- }\r
- \r
- $index = self::findKey($minute, $values['minute'], false);\r
- \r
- // if index was out of bounds, pick the first item but\r
- // notify calling method that we had to increase the hour\r
- if ($index === false) {\r
- $index = self::findKey($minute, $values['minute']);\r
- $returnValue = true;\r
- }\r
- \r
- self::$result['minute'] = $values['minute'][$index];\r
- \r
- return $returnValue;\r
- }\r
- \r
- /**\r
- * Tries to find index of an array element which is bigger or equal the current\r
- * needle. If $continue is not set to false and foreach-loop is out of bounds,\r
- * then the array-index '0' is returned, referring the first item.\r
- * \r
- * @param integer $needle\r
- * @param array $haystack\r
- * @param boolean $continue\r
- * @return mixed\r
- */\r
- protected static function findKey($needle, array &$haystack, $continue = true) {\r
- $index = array_search($needle, $haystack);\r
- \r
- if ($index === false) {\r
- foreach ($haystack as $key => $value) {\r
- if ($needle < $value) {\r
- $index = $key;\r
- break;\r
- }\r
- }\r
- \r
- if ($continue && $index === false) {\r
- $index = 0;\r
- }\r
- }\r
- \r
- return $index;\r
- }\r
- \r
- /**\r
- * Calculates all values matching possible expressions.\r
- * \r
- * @param string $fieldName\r
- * @param string $fieldValue\r
- * @return array\r
- */\r
- protected static function calculateValue($fieldName, $fieldValue) {\r
- $values = array();\r
- \r
- // examinate first char\r
- $char = StringUtil::substring($fieldValue, 0, 1);\r
- \r
- // could be a single value, range or list\r
- if (is_numeric($char)) {\r
- $items = self::getListItems($fieldValue);\r
- \r
- foreach ($items as $item) {\r
- $values = array_merge($values, self::getRanges($item));\r
- }\r
- }\r
- // asterisk may be followed by a step value\r
- else if ($char == '*') {\r
- $step = 1;\r
- \r
- if (StringUtil::indexOf($fieldValue, '/') !== false) {\r
- $rangeData = explode('/', $fieldValue);\r
- $step = $rangeData[1];\r
- }\r
- \r
- $values = self::calculateRange(self::$ranges[$fieldName][0], self::$ranges[$fieldName][1], $step);\r
- }\r
- \r
- sort($values, SORT_NUMERIC);\r
- \r
- return $values;\r
- }\r
- \r
- /**\r
- * Tries to parse list items separated by a comma.\r
- * \r
- * @param string $fieldValue\r
- * @return array\r
- */\r
- protected static function getListItems($fieldValue) {\r
- if (StringUtil::indexOf($fieldValue, ',') !== false) {\r
- return explode(',', $fieldValue);\r
- }\r
- \r
- return array($fieldValue);\r
- }\r
- \r
- /**\r
- * Parses a possible range of values including a step value.\r
- * \r
- * @param string $value\r
- * @return array\r
- */\r
- protected static function getRanges($value) {\r
- // this is a single value\r
- if (StringUtil::indexOf($value, '-') === false) {\r
- return array($value);\r
- }\r
- \r
- $step = 1;\r
- if (StringUtil::indexOf($value, '/') !== false) {\r
- $data = explode('/', $value);\r
- $step = $data[1];\r
- $value = $data[0];\r
- }\r
- \r
- $data = explode('-', $value);\r
- \r
- return self::calculateRange($data[0], $data[1], $step);\r
- }\r
- \r
- /**\r
- * Calculates all values for a given range.\r
- * \r
- * @param integer $startValue\r
- * @param integer $endValue\r
- * @param integer $step\r
- * @return array\r
- */\r
- protected static function calculateRange($startValue, $endValue, $step = 1) {\r
- $values = array();\r
- \r
- for ($i = $startValue; $i <= $endValue; $i = $i + $step) {\r
- $values[] = $i;\r
- }\r
- \r
- return $values;\r
- }\r
- \r
- /**\r
- * Validates all cronjob attributes.\r
- * \r
- * @param string $startMinute\r
- * @param string $startHour\r
- * @param string $startDom\r
- * @param string $startMonth\r
- * @param string $startDow\r
- * \r
- * @todo Move code to seperate class, e.g. CronjobUtil\r
- */\r
- public static function validate($startMinute, $startHour, $startDom, $startMonth, $startDow) {\r
- self::validateAttribute('startMinute', $startMinute);\r
- self::validateAttribute('startHour', $startHour);\r
- self::validateAttribute('startDom', $startDom);\r
- self::validateAttribute('startMonth', $startMonth);\r
- self::validateAttribute('startDow', $startDow);\r
- }\r
- \r
- /**\r
- * Validates a cronjob attribute.\r
- * \r
- * @param string $name\r
- * @param string $value\r
- * @todo Move code to seperate class, e.g. CronjobUtil\r
- */\r
- protected static function validateAttribute($name, $value) {\r
- if ($value === '') {\r
- throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");\r
- }\r
- \r
- $pattern = '';\r
- $step = '[1-9]?[0-9]';\r
- $months = 'jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec';\r
- $days = 'mon|tue|wed|thu|fri|sat|sun';\r
- $namesArr = array();\r
- \r
- switch ($name) {\r
- // check if startMinute is a valid minute or a list of valid minutes.\r
- case 'startMinute':\r
- $pattern = '[ ]*(\b[0-5]?[0-9]\b)[ ]*';\r
- break;\r
- \r
- // check if startHour is a valid hour or a list of valid hours.\r
- case 'startHour':\r
- $pattern = '[ ]*(\b[01]?[0-9]\b|\b2[0-3]\b)[ ]*';\r
- break;\r
- \r
- // check if startDom is a valid day of month or a list of valid days of month.\r
- case 'startDom':\r
- $pattern = '[ ]*(\b[01]?[1-9]\b|\b2[0-9]\b|\b3[01]\b)[ ]*';\r
- break;\r
- \r
- // check if startMonth is a valid month or a list of valid months.\r
- case 'startMonth':\r
- $digits = '[ ]*(\b[0-1]?[0-9]\b)[ ]*';\r
- $namesArr = explode('|', $months);\r
- $pattern = '('.$digits.')|([ ]*('.$months.')[ ]*)';\r
- break;\r
- \r
- // check if startDow is a valid day of week or a list of valid days of week.\r
- case 'startDow':\r
- $digits = '[ ]*(\b[0]?[0-7]\b)[ ]*';\r
- $namesArr = explode('|', $days);\r
- $pattern = '('.$digits.')|([ ]*('.$days.')[ ]*)';\r
- break;\r
- }\r
- \r
- // perform the actual regex pattern matching.\r
- $range = '((('.$pattern.')|(\*\/'.$step.')?)|((('.$pattern.')-('.$pattern.'))(\/'.$step.')?))';\r
- \r
- // $longPattern prototype: ^\d+(,\d)*$\r
- // $longPattern = '/^(?<!,)'.$range.'+(,'.$range.')*$/i'; // with assertions?\r
- // $longPattern = '/^'.$range.'+(,'.$range.')*$/i'; / does not work on some php installations\r
- $longPattern = '/^'.$range.'(,'.$range.')*$/i';\r
- \r
- preg_match($longPattern, $value);\r
- if ($value != '*' && !preg_match($longPattern, $value)) {\r
- throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");\r
- }\r
- // test whether the user provided a meaningful order inside a range.\r
- else {\r
- $testArr = explode(',', $value);\r
- foreach ($testArr as $testField) {\r
- if ($pattern && preg_match('/^((('.$pattern.')-('.$pattern.'))(\/'.$step.')?)+$/', $testField)) {\r
- $compare = explode('-', $testField);\r
- $compareSlash = explode('/', $compare['1']);\r
- if (count($compareSlash) == 2) $compare['1'] = $compareSlash['0'];\r
- \r
- // see if digits or names are being given.\r
- $left = array_search(StringUtil::toLowerCase($compare['0']), $namesArr);\r
- $right = array_search(StringUtil::toLowerCase($compare['1']), $namesArr);\r
- if (!$left) $left = $compare['0'];\r
- if (!$right) $right = $compare['1'];\r
- // now check the values.\r
- if (intval($left) > intval($right)) {\r
- throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");\r
- }\r
- }\r
- }\r
- }\r
- }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Provides methods used for cron-like time calculations.
+ * As against the official cron-documentation, this implementation
+ * does not support using nicknames (prefixed by the '@' character).
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage util
+ * @category Community Framework
+ */
+abstract class CronjobUtil {
+ /**
+ * Set to true if day of month is '*'
+ *
+ * @var boolean
+ */
+ protected static $domRestricted = false;
+
+ /**
+ * Set to true if day of week is '*'
+ *
+ * @var boolean
+ */
+ protected static $dowRestricted = false;
+
+ /**
+ * Result date
+ *
+ * @var array<integer>
+ */
+ protected static $result = array();
+
+ /**
+ * Time based used as reference for finding the next time of execution
+ *
+ * @var integer
+ */
+ protected static $timeBase = 0;
+
+ /**
+ * Valid ranges for each known field. Note that the range for
+ * 'day of month' is missing, since it varies on each month.
+ *
+ * @var array<array>
+ */
+ public static $ranges = array(
+ 'minute' => array(0, 59),
+ 'hour' => array(0, 23),
+ 'dom' => array(1, 31),
+ 'month' => array(1, 12),
+ 'dow' => array(0, 6)
+ );
+
+ /**
+ * Calculates timestamp for next execution based on cron-like expressions and a given time base.
+ *
+ * @param string $minute
+ * @param string $hour
+ * @param string $dom
+ * @param string $month
+ * @param string $dow
+ * @param integer $timeBase
+ * @return integer
+ */
+ public static function calculateNextExec($minute, $hour, $dom, $month, $dow, $timeBase = TIME_NOW) {
+ // initialize fields
+ self::$timeBase = $timeBase;
+ self::$result = array(
+ 'minute' => 0,
+ 'hour' => 0,
+ 'day' => 0,
+ 'month' => 0,
+ 'year' => 0
+ );
+
+ $fields = array(
+ 'minute' => $minute,
+ 'hour' => $hour,
+ 'dom' => $dom,
+ 'month' => $month,
+ 'dow' => $dow
+ );
+
+ self::$domRestricted = ($dom != '*') ? true : false;
+ self::$dowRestricted = ($dow != '*') ? true : false;
+
+ // calculate values based upon each expression
+ foreach ($fields as $fieldName => $fieldValue) {
+ $fieldValue = StringUtil::toLowerCase($fieldValue);
+
+ // Names can also be used for the "month" and "day of week" fields.
+ // Use the first three letters of the particular day or month (case
+ // doesn't matter). Ranges or lists of names are not allowed.
+ // -- crontab (5)
+
+ switch ($fieldName) {
+ case 'dow':
+ $dayNames = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
+
+ if (strlen($fieldValue) == 3 && in_array($fieldName, $dayNames)) {
+ $fieldValue = $monthNames[$fieldValue];
+ }
+ // When specifying day of week, both day 0 and day 7
+ // will be considered Sunday. -- crontab(5)
+ else if ($fieldValue == 7) {
+ $fieldValue = 0;
+ }
+ break;
+
+ case 'month':
+ $monthNames = array('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec');
+
+ if (strlen($fieldValue) == 3 && in_array($fieldValue, $monthNames)) {
+ $fieldValue = $monthNames[$fieldValue] + 1;
+ }
+ break;
+ }
+
+ $values[$fieldName] = self::calculateValue($fieldName, $fieldValue);
+ }
+
+ // calculate date of next execution
+ self::calculateTime($values);
+
+ // return timestamp
+ return mktime(
+ self::$result['hour'],
+ self::$result['minute'],
+ 1,
+ self::$result['month'],
+ self::$result['day'],
+ self::$result['year']
+ );
+ }
+
+ /**
+ * Calculates the date of next execution.
+ *
+ * @param array $values
+ */
+ protected static function calculateTime(array &$values) {
+ $timestamp = false;
+
+ // calculation starts with month, thus start with
+ // month of $time (if within values)
+ $currentMonth = date('n', self::$timeBase);
+ $currentYear = date('Y', self::$timeBase);
+ $index = self::findKey($currentMonth, $values['month']);
+
+ self::calculateDay($values);
+ }
+
+ /**
+ * Calculates the day while adjusting month and year to match given criteria.
+ *
+ * Note: The day of a command's execution can be specified by two fields - day
+ * of month, and day of week. If both fields are restricted (ie, aren't *), the
+ * command will be run when either field matches the current time. -- crontab(5)
+ *
+ * @param array $values
+ * @see CronjobUtil::getDom()
+ */
+ protected static function calculateDay(array &$values) {
+ $addAnDay = self::calculateHour($values, self::$timeBase);
+ $timeBase = self::$timeBase;
+
+ if ($addAnDay) {
+ $date = getdate($timeBase);
+ $timeBase = mktime(0, 0, 1, $date['mon'], $date['mday'] + 1, $date['year']);
+ }
+
+ $day = date('j', $timeBase);
+ $month = date('n', $timeBase);
+ $year = date('Y', $timeBase);
+
+ // calculate date of next execution based upon day of week
+ $dateDow = self::calculateDow($month, $year, $values, $day);
+ $dateDowTimestamp = mktime(0, 0, 1, $dateDow['month'], $dateDow['day'], $dateDow['year']);
+
+ // calculate date of next execution based upon day of month
+ $dateDom = self::calculateDom($month, $year, $values, $day);
+ $dateDomTimestamp = mktime(0, 0, 1, $dateDom['month'], $dateDom['day'], $dateDom['year']);
+
+ // pick the earlier date if both dom and dow are restricted
+ if (self::$domRestricted && self::$dowRestricted) {
+ if ($dateDowTimestamp < $dateDomTimestamp) {
+ self::$result['day'] = $dateDow['day'];
+ self::$result['month'] = $dateDow['month'];
+ self::$result['year'] = $dateDow['year'];
+ }
+ else {
+ self::$result['day'] = $dateDom['day'];
+ self::$result['month'] = $dateDom['month'];
+ self::$result['year'] = $dateDom['year'];
+ }
+ }
+ else {
+ if (self::$domRestricted) {
+ self::$result['day'] = $dateDom['day'];
+ self::$result['month'] = $dateDom['month'];
+ self::$result['year'] = $dateDom['year'];
+ }
+ else if (self::$dowRestricted) {
+ self::$result['day'] = $dateDow['day'];
+ self::$result['month'] = $dateDow['month'];
+ self::$result['year'] = $dateDow['year'];
+ }
+ // neither dom nor dow are restricted, thus pick the date given by time base
+ else {
+ self::$result['day'] = $day;
+ self::$result['month'] = $month;
+ self::$result['year'] = $year;
+ }
+
+ }
+
+ // compare day, month and year wether we have to recalculate hour and minute
+ if (($day != self::$result['day']) || ($month != self::$result['month']) || ($year != self::$result['year'])) {
+ // calculate new time base
+ $timeBase = mktime(0, 0, 1, self::$result['month'], self::$result['day'], self::$result['year']);
+
+ self::calculateHour($values, $timeBase);
+ }
+ }
+
+ /**
+ * Calculates the date of next execution based upon a given set for day of week.
+ *
+ * @param integer $month
+ * @param integer $year
+ * @param array $values
+ * @param integer $day
+ * @return array
+ */
+ protected static function calculateDow($month, $year, array &$values, $day = 1) {
+ $days = date('t', mktime(0, 0, 1, $month, $day, $year));
+
+ for ($i = $day; $i <= $days; $i++) {
+ // get dow
+ $dow = date('w', mktime(0, 0, 1, $month, $i, $year));
+
+ if (in_array($dow, $values['dow'])) {
+ return array(
+ 'day' => $i,
+ 'month' => $month,
+ 'year' => $year
+ );
+ }
+ }
+
+ // try next month
+ return self::calculateDow(++$month, $year, $values);
+ }
+
+ /**
+ * Calculates the date of next execution based upon a given set for day of month.
+ *
+ * @param integer $month
+ * @param integer $year
+ * @param array $values
+ * @param integer $day
+ * @return array
+ */
+ protected static function calculateDom($month, $year, array &$values, $day = 1) {
+ $days = date('t', mktime(0, 0, 1, $month, $day, $year));
+
+ for ($i = $day; $i <= $days; $i++) {
+ if (in_array($i, $values['dom'])) {
+ return array(
+ 'day' => $i,
+ 'month' => $month,
+ 'year' => $year
+ );
+ }
+ }
+
+ // try next month
+ return self::calculateDom(++$month, $year, $values);
+ }
+
+ /**
+ * Calculates hour of next execution. Returns number of days which
+ * had been added in order to match expression for hour and minutes.
+ *
+ * @param array $values
+ * @param integer $timeBase
+ * @return integer
+ */
+ protected static function calculateHour(array &$values, &$timeBase) {
+ $addAnDay = false;
+
+ // compare hour
+ $hour = intval(date('G', $timeBase));
+ $index = self::findKey($hour, $values['hour'], false);
+ if ($index === false) {
+ $index = self::findKey($hour, $values['hour']);
+ $addAnDay = true;
+ }
+ $hour = $values['hour'][$index];
+
+ // calculate minutes
+ $addAnHour = self::calculateMinute($values, $timeBase, $addAnDay);
+
+ if ($addAnHour) {
+ $hour++;
+ $index = self::findKey($hour, $values['hour'], false);
+
+ if ($index === false) {
+ if ($index === false) {
+ $index = self::findKey($hour, $values['hour']);
+ $addAnDay = true;
+ }
+ $hour = $values['hour'][$index];
+ }
+ }
+
+ self::$result['hour'] = $hour;
+
+ return $addAnDay;
+ }
+
+ /**
+ * Calculates minutes of next execution. Returns false if minute-declaration
+ * is past the current hour, thus requires to add at least one hour.
+ *
+ * @param array $values
+ * @param integer $timeBase
+ * @return boolean
+ */
+ protected static function calculateMinute(array &$values, &$timeBase, $addAnDay) {
+ $returnValue = false;
+
+ if ($addAnDay) {
+ $minute = 0;
+ }
+ else {
+ $minute = date('i', $timeBase);
+ }
+
+ $index = self::findKey($minute, $values['minute'], false);
+
+ // if index was out of bounds, pick the first item but
+ // notify calling method that we had to increase the hour
+ if ($index === false) {
+ $index = self::findKey($minute, $values['minute']);
+ $returnValue = true;
+ }
+
+ self::$result['minute'] = $values['minute'][$index];
+
+ return $returnValue;
+ }
+
+ /**
+ * Tries to find index of an array element which is bigger or equal the current
+ * needle. If $continue is not set to false and foreach-loop is out of bounds,
+ * then the array-index '0' is returned, referring the first item.
+ *
+ * @param integer $needle
+ * @param array $haystack
+ * @param boolean $continue
+ * @return mixed
+ */
+ protected static function findKey($needle, array &$haystack, $continue = true) {
+ $index = array_search($needle, $haystack);
+
+ if ($index === false) {
+ foreach ($haystack as $key => $value) {
+ if ($needle < $value) {
+ $index = $key;
+ break;
+ }
+ }
+
+ if ($continue && $index === false) {
+ $index = 0;
+ }
+ }
+
+ return $index;
+ }
+
+ /**
+ * Calculates all values matching possible expressions.
+ *
+ * @param string $fieldName
+ * @param string $fieldValue
+ * @return array
+ */
+ protected static function calculateValue($fieldName, $fieldValue) {
+ $values = array();
+
+ // examinate first char
+ $char = StringUtil::substring($fieldValue, 0, 1);
+
+ // could be a single value, range or list
+ if (is_numeric($char)) {
+ $items = self::getListItems($fieldValue);
+
+ foreach ($items as $item) {
+ $values = array_merge($values, self::getRanges($item));
+ }
+ }
+ // asterisk may be followed by a step value
+ else if ($char == '*') {
+ $step = 1;
+
+ if (StringUtil::indexOf($fieldValue, '/') !== false) {
+ $rangeData = explode('/', $fieldValue);
+ $step = $rangeData[1];
+ }
+
+ $values = self::calculateRange(self::$ranges[$fieldName][0], self::$ranges[$fieldName][1], $step);
+ }
+
+ sort($values, SORT_NUMERIC);
+
+ return $values;
+ }
+
+ /**
+ * Tries to parse list items separated by a comma.
+ *
+ * @param string $fieldValue
+ * @return array
+ */
+ protected static function getListItems($fieldValue) {
+ if (StringUtil::indexOf($fieldValue, ',') !== false) {
+ return explode(',', $fieldValue);
+ }
+
+ return array($fieldValue);
+ }
+
+ /**
+ * Parses a possible range of values including a step value.
+ *
+ * @param string $value
+ * @return array
+ */
+ protected static function getRanges($value) {
+ // this is a single value
+ if (StringUtil::indexOf($value, '-') === false) {
+ return array($value);
+ }
+
+ $step = 1;
+ if (StringUtil::indexOf($value, '/') !== false) {
+ $data = explode('/', $value);
+ $step = $data[1];
+ $value = $data[0];
+ }
+
+ $data = explode('-', $value);
+
+ return self::calculateRange($data[0], $data[1], $step);
+ }
+
+ /**
+ * Calculates all values for a given range.
+ *
+ * @param integer $startValue
+ * @param integer $endValue
+ * @param integer $step
+ * @return array
+ */
+ protected static function calculateRange($startValue, $endValue, $step = 1) {
+ $values = array();
+
+ for ($i = $startValue; $i <= $endValue; $i = $i + $step) {
+ $values[] = $i;
+ }
+
+ return $values;
+ }
+
+ /**
+ * Validates all cronjob attributes.
+ *
+ * @param string $startMinute
+ * @param string $startHour
+ * @param string $startDom
+ * @param string $startMonth
+ * @param string $startDow
+ *
+ * @todo Move code to seperate class, e.g. CronjobUtil
+ */
+ public static function validate($startMinute, $startHour, $startDom, $startMonth, $startDow) {
+ self::validateAttribute('startMinute', $startMinute);
+ self::validateAttribute('startHour', $startHour);
+ self::validateAttribute('startDom', $startDom);
+ self::validateAttribute('startMonth', $startMonth);
+ self::validateAttribute('startDow', $startDow);
+ }
+
+ /**
+ * Validates a cronjob attribute.
+ *
+ * @param string $name
+ * @param string $value
+ * @todo Move code to seperate class, e.g. CronjobUtil
+ */
+ protected static function validateAttribute($name, $value) {
+ if ($value === '') {
+ throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");
+ }
+
+ $pattern = '';
+ $step = '[1-9]?[0-9]';
+ $months = 'jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec';
+ $days = 'mon|tue|wed|thu|fri|sat|sun';
+ $namesArr = array();
+
+ switch ($name) {
+ // check if startMinute is a valid minute or a list of valid minutes.
+ case 'startMinute':
+ $pattern = '[ ]*(\b[0-5]?[0-9]\b)[ ]*';
+ break;
+
+ // check if startHour is a valid hour or a list of valid hours.
+ case 'startHour':
+ $pattern = '[ ]*(\b[01]?[0-9]\b|\b2[0-3]\b)[ ]*';
+ break;
+
+ // check if startDom is a valid day of month or a list of valid days of month.
+ case 'startDom':
+ $pattern = '[ ]*(\b[01]?[1-9]\b|\b2[0-9]\b|\b3[01]\b)[ ]*';
+ break;
+
+ // check if startMonth is a valid month or a list of valid months.
+ case 'startMonth':
+ $digits = '[ ]*(\b[0-1]?[0-9]\b)[ ]*';
+ $namesArr = explode('|', $months);
+ $pattern = '('.$digits.')|([ ]*('.$months.')[ ]*)';
+ break;
+
+ // check if startDow is a valid day of week or a list of valid days of week.
+ case 'startDow':
+ $digits = '[ ]*(\b[0]?[0-7]\b)[ ]*';
+ $namesArr = explode('|', $days);
+ $pattern = '('.$digits.')|([ ]*('.$days.')[ ]*)';
+ break;
+ }
+
+ // perform the actual regex pattern matching.
+ $range = '((('.$pattern.')|(\*\/'.$step.')?)|((('.$pattern.')-('.$pattern.'))(\/'.$step.')?))';
+
+ // $longPattern prototype: ^\d+(,\d)*$
+ // $longPattern = '/^(?<!,)'.$range.'+(,'.$range.')*$/i'; // with assertions?
+ // $longPattern = '/^'.$range.'+(,'.$range.')*$/i'; / does not work on some php installations
+ $longPattern = '/^'.$range.'(,'.$range.')*$/i';
+
+ preg_match($longPattern, $value);
+ if ($value != '*' && !preg_match($longPattern, $value)) {
+ throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");
+ }
+ // test whether the user provided a meaningful order inside a range.
+ else {
+ $testArr = explode(',', $value);
+ foreach ($testArr as $testField) {
+ if ($pattern && preg_match('/^((('.$pattern.')-('.$pattern.'))(\/'.$step.')?)+$/', $testField)) {
+ $compare = explode('-', $testField);
+ $compareSlash = explode('/', $compare['1']);
+ if (count($compareSlash) == 2) $compare['1'] = $compareSlash['0'];
+
+ // see if digits or names are being given.
+ $left = array_search(StringUtil::toLowerCase($compare['0']), $namesArr);
+ $right = array_search(StringUtil::toLowerCase($compare['1']), $namesArr);
+ if (!$left) $left = $compare['0'];
+ if (!$right) $right = $compare['1'];
+ // now check the values.
+ if (intval($left) > intval($right)) {
+ throw new SystemException("invalid value '".$value."' given for cronjob attribute '".$name."'");
+ }
+ }
+ }
+ }
+ }
}
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Contains image-related functions.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf.data.image\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-class ImageUtil {\r
- /**\r
- * Checks the content of an image for bad sections. \r
- * e.g. the use of javascript.\r
- * Returns false, if any bad stuff was found.\r
- * \r
- * @return boolean \r
- */\r
- public static function checkImageContent($file) {\r
- // get file content\r
- $content = file_get_contents($file);\r
- \r
- // remove some characters\r
- $content = strtolower(preg_replace('/[^a-z0-9<\(]+/i', '', $content));\r
- $content = str_replace('description', '', $content);\r
- \r
- // search for javascript\r
- if (strstr($content, 'script') || strstr($content, 'javascript') || strstr($content, 'expression(')) return false;\r
- \r
- return true;\r
- }\r
- \r
- /**\r
- * Examines the right file extension for an image by the given mime type.\r
- * @see http://www.php.net/manual/en/function.image-type-to-mime-type.php\r
- * \r
- * @param string $mimeType\r
- * @return string file extension\r
- */\r
- public static function getExtensionByMimeType($mimeType) {\r
- switch ($mimeType) {\r
- case 'image/gif': return 'gif';\r
- case 'image/jpeg': return 'jpg';\r
- case 'image/png': return 'png';\r
- case 'application/x-shockwave-flash': return 'swf';\r
- case 'image/psd': return 'psd';\r
- case 'image/bmp':\r
- case 'image/x-ms-bmp': return 'bmp';\r
- case 'image/tiff': return 'tiff';\r
- default: return '';\r
- }\r
- }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Contains image-related functions.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf.data.image
+ * @subpackage util
+ * @category Community Framework
+ */
+class ImageUtil {
+ /**
+ * Checks the content of an image for bad sections.
+ * e.g. the use of javascript.
+ * Returns false, if any bad stuff was found.
+ *
+ * @return boolean
+ */
+ public static function checkImageContent($file) {
+ // get file content
+ $content = file_get_contents($file);
+
+ // remove some characters
+ $content = strtolower(preg_replace('/[^a-z0-9<\(]+/i', '', $content));
+ $content = str_replace('description', '', $content);
+
+ // search for javascript
+ if (strstr($content, 'script') || strstr($content, 'javascript') || strstr($content, 'expression(')) return false;
+
+ return true;
+ }
+
+ /**
+ * Examines the right file extension for an image by the given mime type.
+ * @see http://www.php.net/manual/en/function.image-type-to-mime-type.php
+ *
+ * @param string $mimeType
+ * @return string file extension
+ */
+ public static function getExtensionByMimeType($mimeType) {
+ switch ($mimeType) {
+ case 'image/gif': return 'gif';
+ case 'image/jpeg': return 'jpg';
+ case 'image/png': return 'png';
+ case 'application/x-shockwave-flash': return 'swf';
+ case 'image/psd': return 'psd';
+ case 'image/bmp':
+ case 'image/x-ms-bmp': return 'bmp';
+ case 'image/tiff': return 'tiff';
+ default: return '';
+ }
+ }
}
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Provides methods for JSON.\r
- *\r
- * @author Alexander Ebert\r
- * @copyright 2001-2010 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-class JSON {\r
- /**\r
- * Returns the JSON representation of a value.\r
- * \r
- * @param mixed $data\r
- * @return string\r
- */\r
- public static function encode($data) {\r
- return json_encode($data);\r
- }\r
- \r
- /**\r
- * Decodes a JSON string.\r
- * \r
- * @param string $json\r
- * @param boolean $asArray\r
- * @return array\r
- */\r
- public static function decode($json, $asArray = true) {\r
- // decodes JSON\r
- $data = json_decode($json, $asArray);\r
- \r
- return $data;\r
- }\r
- \r
- /**\r
- * Returns the last error occurred.\r
- * \r
- * @return integer\r
- */\r
- public static function getLastError() {\r
- return json_last_error();\r
- }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Provides methods for JSON.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2010 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage util
+ * @category Community Framework
+ */
+class JSON {
+ /**
+ * Returns the JSON representation of a value.
+ *
+ * @param mixed $data
+ * @return string
+ */
+ public static function encode($data) {
+ return json_encode($data);
+ }
+
+ /**
+ * Decodes a JSON string.
+ *
+ * @param string $json
+ * @param boolean $asArray
+ * @return array
+ */
+ public static function decode($json, $asArray = true) {
+ // decodes JSON
+ $data = json_decode($json, $asArray);
+
+ return $data;
+ }
+
+ /**
+ * Returns the last error occurred.
+ *
+ * @return integer
+ */
+ public static function getLastError() {
+ return json_last_error();
+ }
}
\ No newline at end of file
-<?php\r
-namespace wcf\util;\r
-\r
-/**\r
- * Replaces quoted strings in a text.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-class StringStack {\r
- protected static $stringStack = array();\r
- \r
- /**\r
- * Replaces a string with an unique hash value.\r
- *\r
- * @param string $string\r
- * @param string $type\r
- * @return string $hash\r
- */\r
- public static function pushToStringStack($string, $type = 'default') {\r
- $hash = '@@'.StringUtil::getHash(uniqid(microtime()).$string).'@@';\r
- \r
- if (!isset(self::$stringStack[$type])) {\r
- self::$stringStack[$type] = array();\r
- }\r
- \r
- self::$stringStack[$type][$hash] = $string;\r
- \r
- return $hash;\r
- }\r
- \r
- /**\r
- * Reinserts Strings that have been replaced by unique hash values.\r
- *\r
- * @param string $string\r
- * @param string $type\r
- * @return string $string\r
- */\r
- public static function reinsertStrings($string, $type = 'default') {\r
- if (isset(self::$stringStack[$type])) {\r
- foreach (self::$stringStack[$type] as $hash => $value) {\r
- if (StringUtil::indexOf($string, $hash) !== false) {\r
- $string = StringUtil::replace($hash, $value, $string);\r
- unset(self::$stringStack[$type][$hash]);\r
- }\r
- }\r
- }\r
- \r
- return $string;\r
- }\r
- \r
- /**\r
- * Returns the stack.\r
- *\r
- * @param string $type\r
- * @return array\r
- */\r
- public static function getStack($type = 'default') {\r
- if (isset(self::$stringStack[$type])) {\r
- return self::$stringStack[$type];\r
- }\r
- \r
- return array();\r
- }\r
+<?php
+namespace wcf\util;
+
+/**
+ * Replaces quoted strings in a text.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage util
+ * @category Community Framework
+ */
+class StringStack {
+ protected static $stringStack = array();
+
+ /**
+ * Replaces a string with an unique hash value.
+ *
+ * @param string $string
+ * @param string $type
+ * @return string $hash
+ */
+ public static function pushToStringStack($string, $type = 'default') {
+ $hash = '@@'.StringUtil::getHash(uniqid(microtime()).$string).'@@';
+
+ if (!isset(self::$stringStack[$type])) {
+ self::$stringStack[$type] = array();
+ }
+
+ self::$stringStack[$type][$hash] = $string;
+
+ return $hash;
+ }
+
+ /**
+ * Reinserts Strings that have been replaced by unique hash values.
+ *
+ * @param string $string
+ * @param string $type
+ * @return string $string
+ */
+ public static function reinsertStrings($string, $type = 'default') {
+ if (isset(self::$stringStack[$type])) {
+ foreach (self::$stringStack[$type] as $hash => $value) {
+ if (StringUtil::indexOf($string, $hash) !== false) {
+ $string = StringUtil::replace($hash, $value, $string);
+ unset(self::$stringStack[$type][$hash]);
+ }
+ }
+ }
+
+ return $string;
+ }
+
+ /**
+ * Returns the stack.
+ *
+ * @param string $type
+ * @return array
+ */
+ public static function getStack($type = 'default') {
+ if (isset(self::$stringStack[$type])) {
+ return self::$stringStack[$type];
+ }
+
+ return array();
+ }
}
-<?php\r
-namespace wcf\util;\r
-use wcf\system\WCF;\r
-\r
-/**\r
- * Contains user-related functions.\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2009 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-class UserUtil {\r
- protected static $privateIpList = array("/^0\./", "/^127\.0\.0\.1/", "/^192\.168\..*/", "/^172\.16\..*/", "/^10..*/", "/^224..*/", "/^240..*/");\r
- \r
- /**\r
- * Returns true, if the given name is a valid username.\r
- * \r
- * @param string $name username\r
- * @return boolean\r
- */\r
- public static function isValidUsername($name) {\r
- // check illegal characters\r
- if (!preg_match('!^[^,\n]+$!', $name)) {\r
- return false;\r
- }\r
- // check long words\r
- $words = preg_split('!\s+!', $name, -1, PREG_SPLIT_NO_EMPTY);\r
- foreach ($words as $word) {\r
- if (StringUtil::length($word) > 20) {\r
- return false;\r
- }\r
- }\r
- return true;\r
- }\r
- \r
- /**\r
- * Returns true, if the given username is available.\r
- * \r
- * @param string $name username\r
- * @return boolean\r
- */\r
- public static function isAvailableUsername($name) {\r
- $sql = "SELECT COUNT(username) AS count\r
- FROM wcf".WCF_N."_user\r
- WHERE username = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($name));\r
- $row = $statement->fetchArray();\r
- return $row['count'] == 0;\r
- }\r
- \r
- /**\r
- * Returns true, if the given e-mail is a valid address.\r
- * @see http://www.faqs.org/rfcs/rfc821.html\r
- * \r
- * @param string $email\r
- * @return boolean\r
- */\r
- public static function isValidEmail($email) {\r
- // local-part\r
- $c = '!#\$%&\'\*\+\-\/0-9=\?a-z\^_`\{\}\|~';\r
- $string = '['.$c.']*(?:\\\\[\x00-\x7F]['.$c.']*)*';\r
- $localPart = $string.'(?:\.'.$string.')*';\r
- \r
- // domain\r
- $name = '[a-z0-9](?:[a-z0-9-]*[a-z0-9])?';\r
- $domain = $name.'(?:\.'.$name.')*\.[a-z]{2,}';\r
- \r
- // mailbox\r
- $mailbox = $localPart.'@'.$domain;\r
- \r
- return preg_match('/^'.$mailbox.'$/i', $email);\r
- }\r
- \r
- /**\r
- * Returns true, if the given email address is available.\r
- * \r
- * @param string $email email address\r
- * @return boolean\r
- */\r
- public static function isAvailableEmail($email) {\r
- $sql = "SELECT COUNT(email) AS count\r
- FROM wcf".WCF_N."_user\r
- WHERE email = ?";\r
- $statement = WCF::getDB()->prepareStatement($sql);\r
- $statement->execute(array($email));\r
- $row = $statement->fetchArray();\r
- return $row['count'] == 0;\r
- }\r
- \r
- /**\r
- * Returns the user agent of the client.\r
- * \r
- * @return string\r
- */\r
- public static function getUserAgent() {\r
- if (isset($_SERVER['HTTP_USER_AGENT'])) return substr($_SERVER['HTTP_USER_AGENT'], 0, 255);\r
- return '';\r
- }\r
- \r
- /**\r
- * Returns the ip address of the client.\r
- *\r
- * @return string ip address\r
- */\r
- public static function getIpAddress() {\r
- $REMOTE_ADDR = '';\r
- if (isset($_SERVER['REMOTE_ADDR'])) $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];\r
- if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR'];\r
- else $HTTP_X_FORWARDED_FOR = '';\r
- \r
- if (!empty($HTTP_X_FORWARDED_FOR)) {\r
- $match = array();\r
- if (preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $HTTP_X_FORWARDED_FOR, $match)) {\r
- $REMOTE_ADDR = preg_replace(self::$privateIpList, $REMOTE_ADDR, $match[1]); \r
- }\r
- }\r
- \r
- // darwin fix\r
- if ($REMOTE_ADDR == '::1' || $REMOTE_ADDR == 'fe80::1') {\r
- $REMOTE_ADDR = '127.0.0.1'; \r
- }\r
- \r
- return $REMOTE_ADDR;\r
- }\r
- \r
- /**\r
- * Returns the request uri of the active request.\r
- * \r
- * @return string\r
- */\r
- public static function getRequestURI() {\r
- $REQUEST_URI = '';\r
- /*if (!empty($_SERVER['REQUEST_URI'])) {\r
- $REQUEST_URI = $_SERVER['REQUEST_URI'];\r
- }\r
- else {*/\r
- if (!empty($_SERVER['ORIG_PATH_INFO']) && strpos($_SERVER['ORIG_PATH_INFO'], '.php') !== false) {\r
- $REQUEST_URI = $_SERVER['ORIG_PATH_INFO'];\r
- }\r
- else if (!empty($_SERVER['ORIG_SCRIPT_NAME'])) {\r
- $REQUEST_URI = $_SERVER['ORIG_SCRIPT_NAME'];\r
- }\r
- else if (!empty($_SERVER['SCRIPT_NAME'])) {\r
- $REQUEST_URI = $_SERVER['SCRIPT_NAME'];\r
- }\r
- else if (!empty($_SERVER['PHP_SELF'])) {\r
- $REQUEST_URI = $_SERVER['PHP_SELF'];\r
- }\r
- else if (!empty($_SERVER['PATH_INFO'])) {\r
- $REQUEST_URI = $_SERVER['PATH_INFO'];\r
- }\r
- if (!empty($_SERVER['QUERY_STRING'])) {\r
- $REQUEST_URI .= '?'.$_SERVER['QUERY_STRING'];\r
- }\r
- //}\r
- \r
- //if (!strstr($REQUEST_URI, '.')) $REQUEST_URI = 'index.php';\r
- \r
- return substr(FileUtil::unifyDirSeperator($REQUEST_URI), 0, 255);\r
- }\r
+<?php
+namespace wcf\util;
+use wcf\system\WCF;
+
+/**
+ * Contains user-related functions.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2009 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage util
+ * @category Community Framework
+ */
+class UserUtil {
+ protected static $privateIpList = array("/^0\./", "/^127\.0\.0\.1/", "/^192\.168\..*/", "/^172\.16\..*/", "/^10..*/", "/^224..*/", "/^240..*/");
+
+ /**
+ * Returns true, if the given name is a valid username.
+ *
+ * @param string $name username
+ * @return boolean
+ */
+ public static function isValidUsername($name) {
+ // check illegal characters
+ if (!preg_match('!^[^,\n]+$!', $name)) {
+ return false;
+ }
+ // check long words
+ $words = preg_split('!\s+!', $name, -1, PREG_SPLIT_NO_EMPTY);
+ foreach ($words as $word) {
+ if (StringUtil::length($word) > 20) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Returns true, if the given username is available.
+ *
+ * @param string $name username
+ * @return boolean
+ */
+ public static function isAvailableUsername($name) {
+ $sql = "SELECT COUNT(username) AS count
+ FROM wcf".WCF_N."_user
+ WHERE username = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($name));
+ $row = $statement->fetchArray();
+ return $row['count'] == 0;
+ }
+
+ /**
+ * Returns true, if the given e-mail is a valid address.
+ * @see http://www.faqs.org/rfcs/rfc821.html
+ *
+ * @param string $email
+ * @return boolean
+ */
+ public static function isValidEmail($email) {
+ // local-part
+ $c = '!#\$%&\'\*\+\-\/0-9=\?a-z\^_`\{\}\|~';
+ $string = '['.$c.']*(?:\\\\[\x00-\x7F]['.$c.']*)*';
+ $localPart = $string.'(?:\.'.$string.')*';
+
+ // domain
+ $name = '[a-z0-9](?:[a-z0-9-]*[a-z0-9])?';
+ $domain = $name.'(?:\.'.$name.')*\.[a-z]{2,}';
+
+ // mailbox
+ $mailbox = $localPart.'@'.$domain;
+
+ return preg_match('/^'.$mailbox.'$/i', $email);
+ }
+
+ /**
+ * Returns true, if the given email address is available.
+ *
+ * @param string $email email address
+ * @return boolean
+ */
+ public static function isAvailableEmail($email) {
+ $sql = "SELECT COUNT(email) AS count
+ FROM wcf".WCF_N."_user
+ WHERE email = ?";
+ $statement = WCF::getDB()->prepareStatement($sql);
+ $statement->execute(array($email));
+ $row = $statement->fetchArray();
+ return $row['count'] == 0;
+ }
+
+ /**
+ * Returns the user agent of the client.
+ *
+ * @return string
+ */
+ public static function getUserAgent() {
+ if (isset($_SERVER['HTTP_USER_AGENT'])) return substr($_SERVER['HTTP_USER_AGENT'], 0, 255);
+ return '';
+ }
+
+ /**
+ * Returns the ip address of the client.
+ *
+ * @return string ip address
+ */
+ public static function getIpAddress() {
+ $REMOTE_ADDR = '';
+ if (isset($_SERVER['REMOTE_ADDR'])) $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
+ if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR'];
+ else $HTTP_X_FORWARDED_FOR = '';
+
+ if (!empty($HTTP_X_FORWARDED_FOR)) {
+ $match = array();
+ if (preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $HTTP_X_FORWARDED_FOR, $match)) {
+ $REMOTE_ADDR = preg_replace(self::$privateIpList, $REMOTE_ADDR, $match[1]);
+ }
+ }
+
+ // darwin fix
+ if ($REMOTE_ADDR == '::1' || $REMOTE_ADDR == 'fe80::1') {
+ $REMOTE_ADDR = '127.0.0.1';
+ }
+
+ return $REMOTE_ADDR;
+ }
+
+ /**
+ * Returns the request uri of the active request.
+ *
+ * @return string
+ */
+ public static function getRequestURI() {
+ $REQUEST_URI = '';
+ /*if (!empty($_SERVER['REQUEST_URI'])) {
+ $REQUEST_URI = $_SERVER['REQUEST_URI'];
+ }
+ else {*/
+ if (!empty($_SERVER['ORIG_PATH_INFO']) && strpos($_SERVER['ORIG_PATH_INFO'], '.php') !== false) {
+ $REQUEST_URI = $_SERVER['ORIG_PATH_INFO'];
+ }
+ else if (!empty($_SERVER['ORIG_SCRIPT_NAME'])) {
+ $REQUEST_URI = $_SERVER['ORIG_SCRIPT_NAME'];
+ }
+ else if (!empty($_SERVER['SCRIPT_NAME'])) {
+ $REQUEST_URI = $_SERVER['SCRIPT_NAME'];
+ }
+ else if (!empty($_SERVER['PHP_SELF'])) {
+ $REQUEST_URI = $_SERVER['PHP_SELF'];
+ }
+ else if (!empty($_SERVER['PATH_INFO'])) {
+ $REQUEST_URI = $_SERVER['PATH_INFO'];
+ }
+ if (!empty($_SERVER['QUERY_STRING'])) {
+ $REQUEST_URI .= '?'.$_SERVER['QUERY_STRING'];
+ }
+ //}
+
+ //if (!strstr($REQUEST_URI, '.')) $REQUEST_URI = 'index.php';
+
+ return substr(FileUtil::unifyDirSeperator($REQUEST_URI), 0, 255);
+ }
}
-<?php\r
-namespace wcf\util;\r
-use wcf\system\exception\SystemException;\r
-\r
-/**\r
- * Reads and validates xml documents.\r
- * \r
- * @author Alexander Ebert\r
- * @copyright 2001-2011 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- * @package com.woltlab.wcf\r
- * @subpackage util\r
- * @category Community Framework\r
- */\r
-class XML {\r
- /**\r
- * DOMDocument object\r
- * \r
- * @var DOMDocument\r
- */\r
- protected $document = null;\r
- \r
- /**\r
- * document path\r
- * \r
- * @var string\r
- */\r
- protected $path = '';\r
- \r
- /**\r
- * schema file path\r
- * \r
- * @var string\r
- */\r
- protected $schema = '';\r
- \r
- /**\r
- * DOMXPath object\r
- * \r
- * @var DOMXPath\r
- */\r
- protected $xpath = null;\r
- \r
- /**\r
- * Prepares a new instance of DOMDocument and enables own error handler for libxml.\r
- */ \r
- public function __construct() {\r
- libxml_use_internal_errors(true);\r
- $this->document = new \DOMDocument('1.0', 'UTF-8');\r
- $this->document->preserveWhiteSpace = false;\r
- }\r
- \r
- /**\r
- * Loads a xml file for processing.\r
- * \r
- * @param string $path\r
- */\r
- public function load($path) {\r
- $this->path = $path;\r
- \r
- // ensure file exists and is readable\r
- if (!file_exists($this->path) || !is_readable($this->path)) {\r
- throw new SystemException("Could not read xml document located at '".$this->path."'.");\r
- }\r
- \r
- // load xml document\r
- $this->document->load($path);\r
- \r
- // check for errors occured in libxml\r
- $errors = $this->pollErrors();\r
- if (count($errors)) {\r
- $this->throwException("XML document '".$this->path."' is not valid XML.", $errors);\r
- }\r
- }\r
- \r
- /**\r
- * Loads a xml string, specifying $path is mandatory to provide detailied error handling.\r
- * \r
- * @param string $path\r
- * @param string $xml\r
- */\r
- public function loadXML($path, $xml) {\r
- $this->path = $path;\r
- \r
- // load xml document\r
- $this->document->loadXML($xml);\r
- \r
- // check for errors occured in libxml\r
- $errors = $this->pollErrors();\r
- if (count($errors)) {\r
- $this->throwException("XML document '".$this->path."' is not valid XML.", $errors);\r
- }\r
- }\r
- \r
- /**\r
- * Validate the loaded document against the specified xml schema definition.\r
- */\r
- public function validate() {\r
- // determine schema\r
- $this->getSchema();\r
- \r
- // validate document against schema\r
- $this->document->schemaValidate($this->schema);\r
- \r
- // check for errors occured in libxml\r
- $errors = $this->pollErrors();\r
- if (count($errors)) {\r
- $this->throwException("XML document '".$this->path."' violates XML schema definition.", $errors);\r
- }\r
- }\r
- \r
- /**\r
- * Determines schema for given document.\r
- */\r
- protected function getSchema() {\r
- // determine schema by looking for xsi:schemaLocation\r
- $this->schema = $this->document->documentElement->getAttributeNS($this->document->documentElement->lookupNamespaceURI('xsi'), 'schemaLocation');\r
- \r
- // no valid schema found or it's lacking a valid namespace\r
- if (strpos($this->schema, ' ') === false) {\r
- throw new SystemException("XML document '".$this->path."' does not provide a valid schema.");\r
- }\r
- \r
- // build file path upon namespace and filename\r
- $tmp = explode(' ', $this->schema);\r
- $this->schema = WCF_DIR.'xsd/'.StringUtil::substring(sha1($tmp[0]), 0, 8) . '_' . basename($tmp[1]);\r
- \r
- if (!file_exists($this->schema) || !is_readable($this->schema)) {\r
- throw new SystemException("Could not read XML schema definition located at '".$this->schema."'.");\r
- }\r
- }\r
- \r
- /**\r
- * Returns a DOMXPath object bound to current DOMDocument object. Default\r
- * namespace will be bound to prefix 'ns'.\r
- * \r
- * @return DOMXPath\r
- */\r
- public function xpath() {\r
- if ($this->xpath === null) {\r
- $this->xpath = new \DOMXPath($this->document);\r
- \r
- // register default namespace with prefix 'ns'\r
- $namespace = $this->document->documentElement->getAttribute('xmlns');\r
- $this->xpath->registerNamespace('ns', $namespace);\r
- }\r
- \r
- return $this->xpath;\r
- }\r
- \r
- /**\r
- * Reads errors from libxml since be bypassed built-in error handler.\r
- * \r
- * @see XML::__construct()\r
- * @return array<array>\r
- */\r
- protected function pollErrors() {\r
- $errors = array();\r
- $errorList = libxml_get_errors();\r
- \r
- foreach ($errorList as $error) {\r
- $errors[] = array(\r
- 'message' => $error->message,\r
- 'line' => $error->line,\r
- 'file' => $this->path\r
- );\r
- }\r
- \r
- libxml_clear_errors();\r
- \r
- return $errors;\r
- }\r
- \r
- /**\r
- * Throws a SystemException providing details on xml errors if applicable.\r
- * \r
- * @param string $message\r
- * @param array $errors\r
- */\r
- protected function throwException($message, array $errors = array()) {\r
- if (count($errors)) {\r
- $description = '<b>LibXML output:</b><pre>';\r
- foreach ($errors as $error) {\r
- $description .= "#".$error['line']."\t".$error['message'];\r
- }\r
- $description .= '</pre>';\r
- \r
- throw new SystemException($message, 0, $description);\r
- }\r
- else {\r
- throw new SystemException($message);\r
- }\r
- }\r
+<?php
+namespace wcf\util;
+use wcf\system\exception\SystemException;
+
+/**
+ * Reads and validates xml documents.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2011 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package com.woltlab.wcf
+ * @subpackage util
+ * @category Community Framework
+ */
+class XML {
+ /**
+ * DOMDocument object
+ *
+ * @var DOMDocument
+ */
+ protected $document = null;
+
+ /**
+ * document path
+ *
+ * @var string
+ */
+ protected $path = '';
+
+ /**
+ * schema file path
+ *
+ * @var string
+ */
+ protected $schema = '';
+
+ /**
+ * DOMXPath object
+ *
+ * @var DOMXPath
+ */
+ protected $xpath = null;
+
+ /**
+ * Prepares a new instance of DOMDocument and enables own error handler for libxml.
+ */
+ public function __construct() {
+ libxml_use_internal_errors(true);
+ $this->document = new \DOMDocument('1.0', 'UTF-8');
+ $this->document->preserveWhiteSpace = false;
+ }
+
+ /**
+ * Loads a xml file for processing.
+ *
+ * @param string $path
+ */
+ public function load($path) {
+ $this->path = $path;
+
+ // ensure file exists and is readable
+ if (!file_exists($this->path) || !is_readable($this->path)) {
+ throw new SystemException("Could not read xml document located at '".$this->path."'.");
+ }
+
+ // load xml document
+ $this->document->load($path);
+
+ // check for errors occured in libxml
+ $errors = $this->pollErrors();
+ if (count($errors)) {
+ $this->throwException("XML document '".$this->path."' is not valid XML.", $errors);
+ }
+ }
+
+ /**
+ * Loads a xml string, specifying $path is mandatory to provide detailied error handling.
+ *
+ * @param string $path
+ * @param string $xml
+ */
+ public function loadXML($path, $xml) {
+ $this->path = $path;
+
+ // load xml document
+ $this->document->loadXML($xml);
+
+ // check for errors occured in libxml
+ $errors = $this->pollErrors();
+ if (count($errors)) {
+ $this->throwException("XML document '".$this->path."' is not valid XML.", $errors);
+ }
+ }
+
+ /**
+ * Validate the loaded document against the specified xml schema definition.
+ */
+ public function validate() {
+ // determine schema
+ $this->getSchema();
+
+ // validate document against schema
+ $this->document->schemaValidate($this->schema);
+
+ // check for errors occured in libxml
+ $errors = $this->pollErrors();
+ if (count($errors)) {
+ $this->throwException("XML document '".$this->path."' violates XML schema definition.", $errors);
+ }
+ }
+
+ /**
+ * Determines schema for given document.
+ */
+ protected function getSchema() {
+ // determine schema by looking for xsi:schemaLocation
+ $this->schema = $this->document->documentElement->getAttributeNS($this->document->documentElement->lookupNamespaceURI('xsi'), 'schemaLocation');
+
+ // no valid schema found or it's lacking a valid namespace
+ if (strpos($this->schema, ' ') === false) {
+ throw new SystemException("XML document '".$this->path."' does not provide a valid schema.");
+ }
+
+ // build file path upon namespace and filename
+ $tmp = explode(' ', $this->schema);
+ $this->schema = WCF_DIR.'xsd/'.StringUtil::substring(sha1($tmp[0]), 0, 8) . '_' . basename($tmp[1]);
+
+ if (!file_exists($this->schema) || !is_readable($this->schema)) {
+ throw new SystemException("Could not read XML schema definition located at '".$this->schema."'.");
+ }
+ }
+
+ /**
+ * Returns a DOMXPath object bound to current DOMDocument object. Default
+ * namespace will be bound to prefix 'ns'.
+ *
+ * @return DOMXPath
+ */
+ public function xpath() {
+ if ($this->xpath === null) {
+ $this->xpath = new \DOMXPath($this->document);
+
+ // register default namespace with prefix 'ns'
+ $namespace = $this->document->documentElement->getAttribute('xmlns');
+ $this->xpath->registerNamespace('ns', $namespace);
+ }
+
+ return $this->xpath;
+ }
+
+ /**
+ * Reads errors from libxml since be bypassed built-in error handler.
+ *
+ * @see XML::__construct()
+ * @return array<array>
+ */
+ protected function pollErrors() {
+ $errors = array();
+ $errorList = libxml_get_errors();
+
+ foreach ($errorList as $error) {
+ $errors[] = array(
+ 'message' => $error->message,
+ 'line' => $error->line,
+ 'file' => $this->path
+ );
+ }
+
+ libxml_clear_errors();
+
+ return $errors;
+ }
+
+ /**
+ * Throws a SystemException providing details on xml errors if applicable.
+ *
+ * @param string $message
+ * @param array $errors
+ */
+ protected function throwException($message, array $errors = array()) {
+ if (count($errors)) {
+ $description = '<b>LibXML output:</b><pre>';
+ foreach ($errors as $error) {
+ $description .= "#".$error['line']."\t".$error['message'];
+ }
+ $description .= '</pre>';
+
+ throw new SystemException($message, 0, $description);
+ }
+ else {
+ throw new SystemException($message);
+ }
+ }
}
-<?php\r
-/**\r
- * default options.inc.php for package installation of package com.woltlab.wcf.\r
- *\r
- * @author Marcel Werk \r
- * @copyright 2001-2007 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-define('COOKIE_PREFIX', 'wcf_');\r
-define('COOKIE_PATH', '');\r
-define('COOKIE_DOMAIN', '');\r
-\r
-define('HTTP_ENABLE_NO_CACHE_HEADERS', 0);\r
-define('HTTP_ENABLE_GZIP', 0);\r
-define('HTTP_GZIP_LEVEL', 1);\r
-\r
-define('BLACKLIST_IP_ADDRESSES', '');\r
-define('BLACKLIST_USER_AGENTS', '');\r
-define('BLACKLIST_HOSTNAMES', '');\r
-\r
-define('SESSION_TIMEOUT', 3600);\r
-\r
-define('CACHE_SOURCE_TYPE', 'disk');\r
-define('ENABLE_SESSION_DATA_CACHE', 0);\r
+<?php
+/**
+ * default options.inc.php for package installation of package com.woltlab.wcf.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2007 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+define('COOKIE_PREFIX', 'wcf_');
+define('COOKIE_PATH', '');
+define('COOKIE_DOMAIN', '');
+
+define('HTTP_ENABLE_NO_CACHE_HEADERS', 0);
+define('HTTP_ENABLE_GZIP', 0);
+define('HTTP_GZIP_LEVEL', 1);
+
+define('BLACKLIST_IP_ADDRESSES', '');
+define('BLACKLIST_USER_AGENTS', '');
+define('BLACKLIST_HOSTNAMES', '');
+
+define('SESSION_TIMEOUT', 3600);
+
+define('CACHE_SOURCE_TYPE', 'disk');
+define('ENABLE_SESSION_DATA_CACHE', 0);
define('MODULE_MASTER_PASSWORD', 1);
-/**\r
- * Container Styles\r
- *\r
- * @author Arian Glander, Harald Szekely\r
- * @copyright 2006-2011 WoltLab GmbH\r
- */\r
- \r
-/* -- -- -- -- -- Border -- -- -- -- -- */\r
-\r
-.border {\r
- border-width: 1px;\r
- margin-bottom: 7px;\r
- padding: 1px 0 0 1px;\r
-}\r
-\r
-/* Special */\r
-\r
-.borderMarginRemove {\r
- margin-top: -8px;\r
-}\r
-\r
-/* -- -- -- -- -- Container Globals -- -- -- -- -- */\r
-\r
-.container-1, .container-2, .container-3, .containerHead {\r
- margin: 0 1px 1px 0;\r
-}\r
-\r
-.containerHead {\r
- padding: 2px 5px;\r
-}\r
-\r
-.content > div {\r
- padding: 7px 25px;\r
-}\r
-\r
-.contentStyler p {\r
- margin: 5px 0; \r
-}\r
-\r
-/* -- -- -- -- -- Info Box -- -- -- -- -- */\r
-\r
-.infoBox .container-1, .infoBox .container-2 {\r
- padding: 4px;\r
- clear: both;\r
-}\r
-\r
-.infoBox h3 {\r
- margin: 0 !important;\r
- font-weight: bold;\r
-}\r
-\r
-/* -- -- -- -- -- Containers with Icons -- -- -- -- -- */\r
-\r
-/* Small (16px Icon) */\r
-\r
-.containerIconSmall {\r
- text-align: center;\r
- float: left;\r
- width: 30px;\r
-}\r
-\r
-.containerContentSmall {\r
- margin-left: 30px;\r
-}\r
-\r
-/* Standard (24px Icon) */\r
-\r
-.containerIcon {\r
- text-align: center;\r
- float: left;\r
- width: 30px;\r
-}\r
-\r
-.containerContent {\r
- margin-left: 35px;\r
-}\r
-\r
-/* Large (48px Icon) */\r
-\r
-.containerIconLarge {\r
- text-align: center;\r
- float: left;\r
- width: 50px;\r
-}\r
-\r
-.containerContentLarge {\r
- margin-left: 60px;\r
-}\r
-\r
-/* -- -- -- -- -- Main Headline -- -- -- -- -- */\r
-\r
-.mainHeadline {\r
- margin: 3px 0 7px 0;\r
- padding: 0;\r
- clear: both;\r
- display: block;\r
- min-height: 50px;\r
- width: 100%;\r
-}\r
-\r
-.mainHeadline img {\r
- float: left;\r
-}\r
-\r
-.mainHeadline .headlineContainer img {\r
- float: none;\r
-}\r
-\r
-.mainHeadline .headlineContainer {\r
- margin: 7px 0 7px 60px;\r
- min-height: 48px;\r
-}\r
-\r
-.mainHeadline .headlineContainer h2 {\r
- margin: 0;\r
- padding: 0;\r
- overflow: hidden;\r
-}\r
-\r
-.mainHeadline .headlineContainer h2 a {\r
- text-decoration: none;\r
-}\r
-\r
-.mainHeadline .headlineContainer p {\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-/* -- -- -- -- -- Sub Headline -- -- -- -- -- */\r
-\r
-.subHeadline {\r
- font-size: 1.5em;\r
- font-weight: normal;\r
- border-left-width: 0 !important;\r
- border-right-width: 0 !important;\r
- border-top-width: 0 !important;\r
- margin-top: 7px;\r
- margin-bottom: 10px !important;\r
- padding-bottom: 7px;\r
-}\r
-\r
-.subHeadline a {\r
- text-decoration: none;\r
-}\r
-\r
-.subHeadline span {\r
- font-size: 75%;\r
-}\r
-\r
-.subHeadline .inputText {\r
- width: 95%;\r
-}\r
-\r
-/* -- -- -- -- -- Fieldset -- -- -- -- -- */\r
-\r
-fieldset {\r
- border-width: 1px;\r
- margin: 10px 0;\r
- padding: 5px 13px 10px 13px;\r
- display: block;\r
-}\r
-\r
-fieldset:after {\r
- content: "";\r
- display: block;\r
- clear: both;\r
- height: 0;\r
-}\r
-\r
-fieldset legend {\r
- margin: 0 0 0 -5px;\r
- padding: 0 5px;\r
-}\r
-\r
-fieldset fieldset {\r
- margin-bottom: 5px;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Container Styles
+ *
+ * @author Arian Glander, Harald Szekely
+ * @copyright 2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Border -- -- -- -- -- */
+
+.border {
+ border-width: 1px;
+ margin-bottom: 7px;
+ padding: 1px 0 0 1px;
+}
+
+/* Special */
+
+.borderMarginRemove {
+ margin-top: -8px;
+}
+
+/* -- -- -- -- -- Container Globals -- -- -- -- -- */
+
+.container-1, .container-2, .container-3, .containerHead {
+ margin: 0 1px 1px 0;
+}
+
+.containerHead {
+ padding: 2px 5px;
+}
+
+.content > div {
+ padding: 7px 25px;
+}
+
+.contentStyler p {
+ margin: 5px 0;
+}
+
+/* -- -- -- -- -- Info Box -- -- -- -- -- */
+
+.infoBox .container-1, .infoBox .container-2 {
+ padding: 4px;
+ clear: both;
+}
+
+.infoBox h3 {
+ margin: 0 !important;
+ font-weight: bold;
+}
+
+/* -- -- -- -- -- Containers with Icons -- -- -- -- -- */
+
+/* Small (16px Icon) */
+
+.containerIconSmall {
+ text-align: center;
+ float: left;
+ width: 30px;
+}
+
+.containerContentSmall {
+ margin-left: 30px;
+}
+
+/* Standard (24px Icon) */
+
+.containerIcon {
+ text-align: center;
+ float: left;
+ width: 30px;
+}
+
+.containerContent {
+ margin-left: 35px;
+}
+
+/* Large (48px Icon) */
+
+.containerIconLarge {
+ text-align: center;
+ float: left;
+ width: 50px;
+}
+
+.containerContentLarge {
+ margin-left: 60px;
+}
+
+/* -- -- -- -- -- Main Headline -- -- -- -- -- */
+
+.mainHeadline {
+ margin: 3px 0 7px 0;
+ padding: 0;
+ clear: both;
+ display: block;
+ min-height: 50px;
+ width: 100%;
+}
+
+.mainHeadline img {
+ float: left;
+}
+
+.mainHeadline .headlineContainer img {
+ float: none;
+}
+
+.mainHeadline .headlineContainer {
+ margin: 7px 0 7px 60px;
+ min-height: 48px;
+}
+
+.mainHeadline .headlineContainer h2 {
+ margin: 0;
+ padding: 0;
+ overflow: hidden;
+}
+
+.mainHeadline .headlineContainer h2 a {
+ text-decoration: none;
+}
+
+.mainHeadline .headlineContainer p {
+ margin: 0;
+ padding: 0;
+}
+
+/* -- -- -- -- -- Sub Headline -- -- -- -- -- */
+
+.subHeadline {
+ font-size: 1.5em;
+ font-weight: normal;
+ border-left-width: 0 !important;
+ border-right-width: 0 !important;
+ border-top-width: 0 !important;
+ margin-top: 7px;
+ margin-bottom: 10px !important;
+ padding-bottom: 7px;
+}
+
+.subHeadline a {
+ text-decoration: none;
+}
+
+.subHeadline span {
+ font-size: 75%;
+}
+
+.subHeadline .inputText {
+ width: 95%;
+}
+
+/* -- -- -- -- -- Fieldset -- -- -- -- -- */
+
+fieldset {
+ border-width: 1px;
+ margin: 10px 0;
+ padding: 5px 13px 10px 13px;
+ display: block;
+}
+
+fieldset:after {
+ content: "";
+ display: block;
+ clear: both;
+ height: 0;
+}
+
+fieldset legend {
+ margin: 0 0 0 -5px;
+ padding: 0 5px;
+}
+
+fieldset fieldset {
+ margin-bottom: 5px;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-/**\r
- * Print Styles (RTL)\r
- *\r
- * @author Arian Glander, Harald Szekely\r
- * @copyright 2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- General -- -- -- -- -- */\r
-\r
-a {\r
- color: black;\r
-}\r
-\r
-.copyright {\r
- font-size: .7em;\r
- text-align: center;\r
- padding-top: 20px;\r
- clear: both;\r
- display: block;\r
-}\r
-\r
-#page {\r
- width: auto !important;\r
-}\r
-\r
-/* -- -- -- -- -- Hidden Elements -- -- -- -- -- */\r
-\r
-.hidden, #header, #userPanel, .tabMenu, .subTabMenu, .signature, .pmView, th img, .messageNumber, .editNote, .pmFolders, .infoBox, .largeButtons, .smallButtons, .optionButtons, .pageNavigation, .pageOptions, .quickJump, .userExtras, .scrollUp, .userMessenger, .mainHeadline img, .userAvatar, .userAvatarFramed, .columnUsername img, .userProfileBox, .containerIcon, .userPosts, .userName img, .boardlistLastPost, .boardlistCounter,.boardlistStats, .boardlistUsersOnline, .moderators, .smallPages, .columnIcon img, .columnMarkTopics, .columnMark, .columnReplies, .columnAvatar, .columnViews, .columnLastPost, .breadCrumbs img, legend img, .columnHomepage a img, .columnEmail a img, .columnPosts, .columnRegistrationDate, .userRank, .userTitle, .messageCount, .footerMenu, .footerOptions, .mainMenu, .quickReply, .userSymbols, .userCredits, .statusDisplay, .info, #userCard, #tplUserGalleryPhoto form, .thumbnailButtons, .quoteHeader img, #tplCalendarEvent form, #tplCalendarEvent #participation img, .monthJump {\r
- display: none;\r
-}\r
-\r
-/* -- -- -- -- -- Tables -- -- -- -- -- */\r
-\r
-table {\r
- border-collapse: collapse;\r
- width: 100%;\r
-}\r
-\r
-td, th {\r
- border: 1px solid black;\r
-}\r
-\r
-th, th a {\r
- color: #fff;\r
- text-align: right;\r
- white-space: nowrap;\r
- background-color: #000;\r
+/**
+ * Print Styles (RTL)
+ *
+ * @author Arian Glander, Harald Szekely
+ * @copyright 2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- General -- -- -- -- -- */
+
+a {
+ color: black;
+}
+
+.copyright {
+ font-size: .7em;
+ text-align: center;
+ padding-top: 20px;
+ clear: both;
+ display: block;
+}
+
+#page {
+ width: auto !important;
+}
+
+/* -- -- -- -- -- Hidden Elements -- -- -- -- -- */
+
+.hidden, #header, #userPanel, .tabMenu, .subTabMenu, .signature, .pmView, th img, .messageNumber, .editNote, .pmFolders, .infoBox, .largeButtons, .smallButtons, .optionButtons, .pageNavigation, .pageOptions, .quickJump, .userExtras, .scrollUp, .userMessenger, .mainHeadline img, .userAvatar, .userAvatarFramed, .columnUsername img, .userProfileBox, .containerIcon, .userPosts, .userName img, .boardlistLastPost, .boardlistCounter,.boardlistStats, .boardlistUsersOnline, .moderators, .smallPages, .columnIcon img, .columnMarkTopics, .columnMark, .columnReplies, .columnAvatar, .columnViews, .columnLastPost, .breadCrumbs img, legend img, .columnHomepage a img, .columnEmail a img, .columnPosts, .columnRegistrationDate, .userRank, .userTitle, .messageCount, .footerMenu, .footerOptions, .mainMenu, .quickReply, .userSymbols, .userCredits, .statusDisplay, .info, #userCard, #tplUserGalleryPhoto form, .thumbnailButtons, .quoteHeader img, #tplCalendarEvent form, #tplCalendarEvent #participation img, .monthJump {
+ display: none;
+}
+
+/* -- -- -- -- -- Tables -- -- -- -- -- */
+
+table {
+ border-collapse: collapse;
+ width: 100%;
+}
+
+td, th {
+ border: 1px solid black;
+}
+
+th, th a {
+ color: #fff;
+ text-align: right;
+ white-space: nowrap;
+ background-color: #000;
}
td {
vertical-align: top;
-}\r
-\r
-.mainHeadline .headlineContainer h1 {\r
- font-size: 1.5em;\r
-}\r
-\r
-.columnIcon {\r
- width: 0;\r
-}\r
-\r
-td p, th p {\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.columnRating {\r
- text-align: center;\r
- width: 0;\r
-}\r
-\r
-.columnTopic {\r
- width: 80%;\r
-}\r
-\r
-.columnTitle p {\r
- overflow: hidden;\r
-}\r
-\r
-.columnDate {\r
- white-space: nowrap;\r
-}\r
-\r
-td.columnHomepage a:after {\r
- content: ""attr(href)"";\r
-}\r
-\r
-td.columnEmail a[href^="mailto:"]:after {\r
- content: ""attr(href)"";\r
-}\r
-\r
-/* -- -- -- -- -- Breadcrumb Style Navigation -- -- -- -- -- */\r
-\r
-.breadCrumbs {\r
- list-style: none;\r
- padding: 0;\r
- margin: 0;\r
-}\r
-\r
-.breadCrumbs li {\r
- font-style: italic;\r
- margin-left: 5px;\r
- display: inline;\r
-}\r
-\r
-/* -- -- -- -- -- Message Layout -- -- -- -- -- */\r
-\r
-.message {\r
- border: 1px solid black;\r
- margin: 7px 3px;\r
- padding: 13px;\r
-}\r
-\r
-.message hr {\r
- display: none;\r
-}\r
-\r
-.messageHeader {\r
- font-style: italic;\r
- margin: -1em 0 0 0;\r
- padding: 0;\r
- text-align: left;\r
-}\r
-\r
-.messageHeader p {\r
- margin: 0;\r
-}\r
-\r
-.messageContent h3 {\r
- font-size: 1em;\r
- margin: 0;\r
- padding: 7px;\r
- clear: both;\r
-}\r
-\r
-.messageBody {\r
- border-top: 1px solid black;\r
- padding-top: 7px;\r
- clear: both;\r
-}\r
-\r
-.messageInner {\r
- margin: -10px 0;\r
- padding: 0;\r
-}\r
-\r
-.messageText {\r
- margin: 7px 0;\r
-}\r
-\r
-.messageAuthor, .messageAuthor .userName {\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.messageAuthor .userName {\r
- font-style: italic;\r
- font-weight: bold;\r
- display: inline;\r
-}\r
-\r
-.messageAuthor .userCredits .userTitle {\r
- font-size: .8em;\r
- margin: 0 0 -10px 0;\r
- padding: 0;\r
-}\r
-\r
-blockquote {\r
- margin: 5px;\r
-}\r
-\r
-.quoteBox {\r
- border: 1px solid black;\r
- margin-bottom: 5px;\r
- padding: 10px;\r
-}\r
-\r
-.quoteBox h3 {\r
- font-style: italic;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.codeBox h3 {\r
- font-style: italic;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.poll .containerContent h3 {\r
- font-style: italic;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.attachmentPreview fieldset {\r
- margin-top: 13px;\r
-}\r
-\r
-.attachmentPreview ul {\r
- margin: 0;\r
- list-style: none;\r
- padding: 0;\r
-}\r
-\r
-.attachmentPreview li {\r
- margin-left: 10px;\r
- float: right;\r
-}\r
-\r
-.attachmentPreview li img {\r
- margin: 0 !important;\r
-}\r
-\r
-.attachmentFile img {\r
- display: none;\r
-}\r
-\r
-
-/* -- -- -- -- -- calendar.css -- -- -- -- -- */\r
-\r
-#tplCalendarEvent #participation .messageHeader {\r
- text-align: right;\r
-}\r
-\r
-/* -- -- -- -- -- Form Element -- -- -- -- -- */\r
-\r
-.formElement {\r
- margin: 5px 0 3px 0;\r
- min-height: 0;\r
-}\r
-\r
-.formElement:after {\r
- content: "";\r
- height: 0;\r
- display: block;\r
- clear: both;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field -- -- -- -- -- */\r
-\r
-.formField {\r
- padding: 0;\r
- min-height: 1em;\r
- border-bottom: 1px solid black;\r
-}\r
-\r
-.formElement .formField {\r
- margin-right: 216px;\r
- }\r
-\r
-/* -- -- -- -- -- Form Field Label -- -- -- -- -- */\r
-\r
-.formFieldLabel {\r
- text-align: left;\r
- float: right;\r
- width: 200px;\r
- margin: 0;\r
-}\r
-\r
-fieldset {\r
- margin: 20px 1px 0 1px !important;\r
-}\r
-\r
-.formSubmit {\r
- display: none;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+}
+
+.mainHeadline .headlineContainer h1 {
+ font-size: 1.5em;
+}
+
+.columnIcon {
+ width: 0;
+}
+
+td p, th p {
+ margin: 0;
+ padding: 0;
+}
+
+.columnRating {
+ text-align: center;
+ width: 0;
+}
+
+.columnTopic {
+ width: 80%;
+}
+
+.columnTitle p {
+ overflow: hidden;
+}
+
+.columnDate {
+ white-space: nowrap;
+}
+
+td.columnHomepage a:after {
+ content: ""attr(href)"";
+}
+
+td.columnEmail a[href^="mailto:"]:after {
+ content: ""attr(href)"";
+}
+
+/* -- -- -- -- -- Breadcrumb Style Navigation -- -- -- -- -- */
+
+.breadCrumbs {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.breadCrumbs li {
+ font-style: italic;
+ margin-left: 5px;
+ display: inline;
+}
+
+/* -- -- -- -- -- Message Layout -- -- -- -- -- */
+
+.message {
+ border: 1px solid black;
+ margin: 7px 3px;
+ padding: 13px;
+}
+
+.message hr {
+ display: none;
+}
+
+.messageHeader {
+ font-style: italic;
+ margin: -1em 0 0 0;
+ padding: 0;
+ text-align: left;
+}
+
+.messageHeader p {
+ margin: 0;
+}
+
+.messageContent h3 {
+ font-size: 1em;
+ margin: 0;
+ padding: 7px;
+ clear: both;
+}
+
+.messageBody {
+ border-top: 1px solid black;
+ padding-top: 7px;
+ clear: both;
+}
+
+.messageInner {
+ margin: -10px 0;
+ padding: 0;
+}
+
+.messageText {
+ margin: 7px 0;
+}
+
+.messageAuthor, .messageAuthor .userName {
+ margin: 0;
+ padding: 0;
+}
+
+.messageAuthor .userName {
+ font-style: italic;
+ font-weight: bold;
+ display: inline;
+}
+
+.messageAuthor .userCredits .userTitle {
+ font-size: .8em;
+ margin: 0 0 -10px 0;
+ padding: 0;
+}
+
+blockquote {
+ margin: 5px;
+}
+
+.quoteBox {
+ border: 1px solid black;
+ margin-bottom: 5px;
+ padding: 10px;
+}
+
+.quoteBox h3 {
+ font-style: italic;
+ margin: 0;
+ padding: 0;
+}
+
+.codeBox h3 {
+ font-style: italic;
+ margin: 0;
+ padding: 0;
+}
+
+.poll .containerContent h3 {
+ font-style: italic;
+ margin: 0;
+ padding: 0;
+}
+
+.attachmentPreview fieldset {
+ margin-top: 13px;
+}
+
+.attachmentPreview ul {
+ margin: 0;
+ list-style: none;
+ padding: 0;
+}
+
+.attachmentPreview li {
+ margin-left: 10px;
+ float: right;
+}
+
+.attachmentPreview li img {
+ margin: 0 !important;
+}
+
+.attachmentFile img {
+ display: none;
+}
+
+
+/* -- -- -- -- -- calendar.css -- -- -- -- -- */
+
+#tplCalendarEvent #participation .messageHeader {
+ text-align: right;
+}
+
+/* -- -- -- -- -- Form Element -- -- -- -- -- */
+
+.formElement {
+ margin: 5px 0 3px 0;
+ min-height: 0;
+}
+
+.formElement:after {
+ content: "";
+ height: 0;
+ display: block;
+ clear: both;
+}
+
+/* -- -- -- -- -- Form Field -- -- -- -- -- */
+
+.formField {
+ padding: 0;
+ min-height: 1em;
+ border-bottom: 1px solid black;
+}
+
+.formElement .formField {
+ margin-right: 216px;
+ }
+
+/* -- -- -- -- -- Form Field Label -- -- -- -- -- */
+
+.formFieldLabel {
+ text-align: left;
+ float: right;
+ width: 200px;
+ margin: 0;
+}
+
+fieldset {
+ margin: 20px 1px 0 1px !important;
+}
+
+.formSubmit {
+ display: none;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-/**\r
- * Print Styles (LTR)\r
- *\r
- * @author Arian Glander, Harald Szekely\r
- * @copyright 2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- General -- -- -- -- -- */\r
-\r
-a {\r
- color: black;\r
-}\r
-\r
-.copyright {\r
- font-size: .7em;\r
- text-align: center;\r
- padding-top: 20px;\r
- clear: both;\r
- display: block;\r
-}\r
-\r
-#page {\r
- width: auto !important;\r
-}\r
-\r
-/* -- -- -- -- -- Hidden Elements -- -- -- -- -- */\r
-\r
-.hidden, #header, #userPanel, .tabMenu, .subTabMenu, .signature, .pmView, th img, .messageNumber, .editNote, .pmFolders, .infoBox, .largeButtons, .smallButtons, .optionButtons, .pageNavigation, .pageOptions, .quickJump, .userExtras, .scrollUp, .userMessenger, .mainHeadline img, .userAvatar, .userAvatarFramed, .columnUsername img, .userProfileBox, .containerIcon, .userPosts, .userName img, .boardlistLastPost, .boardlistCounter,.boardlistStats, .boardlistUsersOnline, .moderators, .smallPages, .columnIcon img, .columnMarkTopics, .columnMark, .columnReplies, .columnAvatar, .columnViews, .columnLastPost, .breadCrumbs img, legend img, .columnHomepage a img, .columnEmail a img, .columnPosts, .columnRegistrationDate, .userRank, .userTitle, .messageCount, .footerMenu, .footerOptions, .mainMenu, .quickReply, .userSymbols, .userCredits, .statusDisplay, .info, #userCard, #tplUserGalleryPhoto form, .thumbnailButtons, .quoteHeader img, #tplCalendarEvent form, #tplCalendarEvent #participation img, .monthJump {\r
- display: none;\r
-}\r
-\r
-/* -- -- -- -- -- Tables -- -- -- -- -- */\r
-\r
-table {\r
- border-collapse: collapse;\r
- width: 100%;\r
-}\r
-\r
-td, th {\r
- border: 1px solid black;\r
-}\r
-\r
-th, th a {\r
- color: #fff;\r
- text-align: left;\r
- white-space: nowrap;\r
- background-color: #000;\r
+/**
+ * Print Styles (LTR)
+ *
+ * @author Arian Glander, Harald Szekely
+ * @copyright 2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- General -- -- -- -- -- */
+
+a {
+ color: black;
+}
+
+.copyright {
+ font-size: .7em;
+ text-align: center;
+ padding-top: 20px;
+ clear: both;
+ display: block;
+}
+
+#page {
+ width: auto !important;
+}
+
+/* -- -- -- -- -- Hidden Elements -- -- -- -- -- */
+
+.hidden, #header, #userPanel, .tabMenu, .subTabMenu, .signature, .pmView, th img, .messageNumber, .editNote, .pmFolders, .infoBox, .largeButtons, .smallButtons, .optionButtons, .pageNavigation, .pageOptions, .quickJump, .userExtras, .scrollUp, .userMessenger, .mainHeadline img, .userAvatar, .userAvatarFramed, .columnUsername img, .userProfileBox, .containerIcon, .userPosts, .userName img, .boardlistLastPost, .boardlistCounter,.boardlistStats, .boardlistUsersOnline, .moderators, .smallPages, .columnIcon img, .columnMarkTopics, .columnMark, .columnReplies, .columnAvatar, .columnViews, .columnLastPost, .breadCrumbs img, legend img, .columnHomepage a img, .columnEmail a img, .columnPosts, .columnRegistrationDate, .userRank, .userTitle, .messageCount, .footerMenu, .footerOptions, .mainMenu, .quickReply, .userSymbols, .userCredits, .statusDisplay, .info, #userCard, #tplUserGalleryPhoto form, .thumbnailButtons, .quoteHeader img, #tplCalendarEvent form, #tplCalendarEvent #participation img, .monthJump {
+ display: none;
+}
+
+/* -- -- -- -- -- Tables -- -- -- -- -- */
+
+table {
+ border-collapse: collapse;
+ width: 100%;
+}
+
+td, th {
+ border: 1px solid black;
+}
+
+th, th a {
+ color: #fff;
+ text-align: left;
+ white-space: nowrap;
+ background-color: #000;
}
td {
vertical-align: top;
-}\r
-\r
-.mainHeadline .headlineContainer h1 {\r
- font-size: 1.5em;\r
-}\r
-\r
-.columnIcon {\r
- width: 0;\r
-}\r
-\r
-td p, th p {\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.columnRating {\r
- text-align: center;\r
- width: 0;\r
-}\r
-\r
-.columnTopic {\r
- width: 80%;\r
-}\r
-\r
-.columnTitle p {\r
- overflow: hidden;\r
-}\r
-\r
-.columnDate {\r
- white-space: nowrap;\r
-}\r
-\r
-td.columnHomepage a:after {\r
- content: ""attr(href)"";\r
-}\r
-\r
-td.columnEmail a[href^="mailto:"]:after {\r
- content: ""attr(href)"";\r
-}\r
-\r
-/* -- -- -- -- -- Breadcrumb Style Navigation -- -- -- -- -- */\r
-\r
-.breadCrumbs {\r
- list-style: none;\r
- padding: 0;\r
- margin: 0;\r
-}\r
-\r
-.breadCrumbs li {\r
- font-style: italic;\r
- margin-right: 5px;\r
- display: inline;\r
-}\r
-\r
-/* -- -- -- -- -- Message Layout -- -- -- -- -- */\r
-\r
-.message {\r
- border: 1px solid black;\r
- margin: 7px 3px;\r
- padding: 13px;\r
-}\r
-\r
-.message hr {\r
- display: none;\r
-}\r
-\r
-.messageHeader {\r
- font-style: italic;\r
- margin: -1em 0 0 0;\r
- padding: 0;\r
- text-align: right;\r
-}\r
-\r
-.messageHeader p {\r
- margin: 0;\r
-}\r
-\r
-.messageContent h3 {\r
- font-size: 1em;\r
- margin: 0;\r
- padding: 7px;\r
- clear: both;\r
-}\r
-\r
-.messageBody {\r
- border-top: 1px solid black;\r
- padding-top: 7px;\r
- clear: both;\r
-}\r
-\r
-.messageInner {\r
- margin: -10px 0;\r
- padding: 0;\r
-}\r
-\r
-.messageText {\r
- margin: 7px 0;\r
-}\r
-\r
-.messageAuthor, .messageAuthor .userName {\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.messageAuthor .userName {\r
- font-style: italic;\r
- font-weight: bold;\r
- display: inline;\r
-}\r
-\r
-.messageAuthor .userCredits .userTitle {\r
- font-size: .8em;\r
- margin: 0 0 -10px 0;\r
- padding: 0;\r
-}\r
-\r
-blockquote {\r
- margin: 5px;\r
-}\r
-\r
-.quoteBox {\r
- border: 1px solid black;\r
- margin-bottom: 5px;\r
- padding: 10px;\r
-}\r
-\r
-.quoteBox h3 {\r
- font-style: italic;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.codeBox h3 {\r
- font-style: italic;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.poll .containerContent h3 {\r
- font-style: italic;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.attachmentPreview fieldset {\r
- margin-top: 13px;\r
-}\r
-\r
-.attachmentPreview ul {\r
- margin: 0;\r
- list-style: none;\r
- padding: 0;\r
-}\r
-\r
-.attachmentPreview li {\r
- margin-right: 10px;\r
- float: left;\r
-}\r
-\r
-.attachmentPreview li img {\r
- margin: 0 !important;\r
-}\r
-\r
-.attachmentFile img {\r
- display: none;\r
-}\r
-\r
-
-/* -- -- -- -- -- calendar.css -- -- -- -- -- */\r
-\r
-#tplCalendarEvent #participation .messageHeader {\r
- text-align: left;\r
-}\r
-\r
-/* -- -- -- -- -- Form Element -- -- -- -- -- */\r
-\r
-.formElement {\r
- margin: 5px 0 3px 0;\r
- min-height: 0;\r
-}\r
-\r
-.formElement:after {\r
- content: "";\r
- height: 0;\r
- display: block;\r
- clear: both;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field -- -- -- -- -- */\r
-\r
-.formField {\r
- padding: 0;\r
- min-height: 1em;\r
- border-bottom: 1px solid black;\r
-}\r
-\r
-.formElement .formField {\r
- margin-left: 216px;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field Label -- -- -- -- -- */\r
-\r
-.formFieldLabel {\r
- text-align: right;\r
- float: left;\r
- width: 200px;\r
- margin: 0;\r
-}\r
-\r
-fieldset {\r
- margin: 20px 1px 0 1px !important;\r
-}\r
-\r
-.formSubmit {\r
- display: none;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+}
+
+.mainHeadline .headlineContainer h1 {
+ font-size: 1.5em;
+}
+
+.columnIcon {
+ width: 0;
+}
+
+td p, th p {
+ margin: 0;
+ padding: 0;
+}
+
+.columnRating {
+ text-align: center;
+ width: 0;
+}
+
+.columnTopic {
+ width: 80%;
+}
+
+.columnTitle p {
+ overflow: hidden;
+}
+
+.columnDate {
+ white-space: nowrap;
+}
+
+td.columnHomepage a:after {
+ content: ""attr(href)"";
+}
+
+td.columnEmail a[href^="mailto:"]:after {
+ content: ""attr(href)"";
+}
+
+/* -- -- -- -- -- Breadcrumb Style Navigation -- -- -- -- -- */
+
+.breadCrumbs {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.breadCrumbs li {
+ font-style: italic;
+ margin-right: 5px;
+ display: inline;
+}
+
+/* -- -- -- -- -- Message Layout -- -- -- -- -- */
+
+.message {
+ border: 1px solid black;
+ margin: 7px 3px;
+ padding: 13px;
+}
+
+.message hr {
+ display: none;
+}
+
+.messageHeader {
+ font-style: italic;
+ margin: -1em 0 0 0;
+ padding: 0;
+ text-align: right;
+}
+
+.messageHeader p {
+ margin: 0;
+}
+
+.messageContent h3 {
+ font-size: 1em;
+ margin: 0;
+ padding: 7px;
+ clear: both;
+}
+
+.messageBody {
+ border-top: 1px solid black;
+ padding-top: 7px;
+ clear: both;
+}
+
+.messageInner {
+ margin: -10px 0;
+ padding: 0;
+}
+
+.messageText {
+ margin: 7px 0;
+}
+
+.messageAuthor, .messageAuthor .userName {
+ margin: 0;
+ padding: 0;
+}
+
+.messageAuthor .userName {
+ font-style: italic;
+ font-weight: bold;
+ display: inline;
+}
+
+.messageAuthor .userCredits .userTitle {
+ font-size: .8em;
+ margin: 0 0 -10px 0;
+ padding: 0;
+}
+
+blockquote {
+ margin: 5px;
+}
+
+.quoteBox {
+ border: 1px solid black;
+ margin-bottom: 5px;
+ padding: 10px;
+}
+
+.quoteBox h3 {
+ font-style: italic;
+ margin: 0;
+ padding: 0;
+}
+
+.codeBox h3 {
+ font-style: italic;
+ margin: 0;
+ padding: 0;
+}
+
+.poll .containerContent h3 {
+ font-style: italic;
+ margin: 0;
+ padding: 0;
+}
+
+.attachmentPreview fieldset {
+ margin-top: 13px;
+}
+
+.attachmentPreview ul {
+ margin: 0;
+ list-style: none;
+ padding: 0;
+}
+
+.attachmentPreview li {
+ margin-right: 10px;
+ float: left;
+}
+
+.attachmentPreview li img {
+ margin: 0 !important;
+}
+
+.attachmentFile img {
+ display: none;
+}
+
+
+/* -- -- -- -- -- calendar.css -- -- -- -- -- */
+
+#tplCalendarEvent #participation .messageHeader {
+ text-align: left;
+}
+
+/* -- -- -- -- -- Form Element -- -- -- -- -- */
+
+.formElement {
+ margin: 5px 0 3px 0;
+ min-height: 0;
+}
+
+.formElement:after {
+ content: "";
+ height: 0;
+ display: block;
+ clear: both;
+}
+
+/* -- -- -- -- -- Form Field -- -- -- -- -- */
+
+.formField {
+ padding: 0;
+ min-height: 1em;
+ border-bottom: 1px solid black;
+}
+
+.formElement .formField {
+ margin-left: 216px;
+}
+
+/* -- -- -- -- -- Form Field Label -- -- -- -- -- */
+
+.formFieldLabel {
+ text-align: right;
+ float: left;
+ width: 200px;
+ margin: 0;
+}
+
+fieldset {
+ margin: 20px 1px 0 1px !important;
+}
+
+.formSubmit {
+ display: none;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-/**\r
- * Footer Styles\r
- *\r
- * @author Arian Glander, Harald Szekely\r
- * @copyright 2008-2011 WoltLab GmbH\r
- */\r
- \r
-/* -- -- -- -- -- Footer -- -- -- -- -- */\r
-\r
-#footer {\r
- border-width: 1px 0 0 0;\r
- border-style: solid;\r
- padding: 10px 0;\r
-}\r
-\r
-#footerContainer {\r
- border-top-width: 0;\r
-}\r
-\r
-/* -- -- -- -- -- Footer Menu -- -- -- -- -- */\r
-\r
-.footerMenu {\r
- margin-bottom: 10px;\r
- float: left;\r
-}\r
-\r
-.footerMenu ul {\r
- list-style: none;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.footerMenu li {\r
- white-space: nowrap;\r
- border-width: 0 0 0 1px;\r
- border-style: solid;\r
- margin-top: 5px;\r
- padding: 0 10px;\r
- display: inline-block;\r
-}\r
-\r
-.footerMenu li.first, .footerMenu li.firstActive {\r
- border-width: 0;\r
- padding-left: 0;\r
-}\r
-\r
-.footerMenu a {\r
- text-decoration: none;\r
- display: block;\r
-}\r
-\r
-.footerMenu span {\r
- padding: 3px 0 2px 0; \r
-}\r
-\r
-.footerMenu a span {\r
- text-decoration: underline;\r
-}\r
-\r
-.footerMenu a:hover span {\r
- text-decoration: none;\r
-}\r
-\r
-.footerMenu div.popupMenu {\r
- font-size: 1em;\r
-}\r
-\r
-/* -- -- -- -- -- Footer Options -- -- -- -- -- */\r
-\r
-.footerOptions {\r
- margin-bottom: 10px;\r
- float: right;\r
-}\r
-\r
-.footerOptions ul {\r
- list-style: none;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.footerOptionsInner > ul > li {\r
- display: inline-block;\r
-}\r
- \r
-.footerOptions li {\r
- border-width: 0 1px 0 0;\r
- border-style: solid;\r
- margin-top: 5px;\r
- padding: 0 10px 0 7px;\r
-}\r
-\r
-.footerOptions li.last {\r
- border-width: 0;\r
-}\r
-\r
-.footerOptions a, .footerOptions em {\r
- font-style: normal;\r
- text-decoration: none;\r
- display: block;\r
-}\r
-\r
-.footerOptionsInner > ul > li > a {\r
- min-height: 16px;\r
-}\r
-\r
-.footerOptions span {\r
- padding: 3px 0 2px 0; \r
-}\r
-\r
-.footerOptions a span {\r
- text-decoration: underline;\r
-}\r
-\r
-.footerOptions a:hover span {\r
- text-decoration: none;\r
-}\r
-\r
-.footerOptions div.popupMenu {\r
- font-size: 1em;\r
-}\r
-\r
-/* -- -- -- -- -- Extra Button -- -- -- -- -- */\r
-\r
-.footerOptions li.extraButton {\r
- border-width: 1px;\r
- margin-top: 0 !important;\r
- padding: 0;\r
-}\r
-\r
-.footerOptions li.extraButton a {\r
- margin: 0;\r
- padding: 1px 2px 0 2px;\r
-}\r
-\r
-/* -- -- -- -- -- Copyright -- -- -- -- -- */\r
-\r
-.copyright {\r
- text-align: center;\r
- white-space: nowrap;\r
- padding: 10px 0 7px 0;\r
- clear: both;\r
-}\r
-\r
-.copyright a {\r
- text-decoration: none;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Footer Styles
+ *
+ * @author Arian Glander, Harald Szekely
+ * @copyright 2008-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Footer -- -- -- -- -- */
+
+#footer {
+ border-width: 1px 0 0 0;
+ border-style: solid;
+ padding: 10px 0;
+}
+
+#footerContainer {
+ border-top-width: 0;
+}
+
+/* -- -- -- -- -- Footer Menu -- -- -- -- -- */
+
+.footerMenu {
+ margin-bottom: 10px;
+ float: left;
+}
+
+.footerMenu ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.footerMenu li {
+ white-space: nowrap;
+ border-width: 0 0 0 1px;
+ border-style: solid;
+ margin-top: 5px;
+ padding: 0 10px;
+ display: inline-block;
+}
+
+.footerMenu li.first, .footerMenu li.firstActive {
+ border-width: 0;
+ padding-left: 0;
+}
+
+.footerMenu a {
+ text-decoration: none;
+ display: block;
+}
+
+.footerMenu span {
+ padding: 3px 0 2px 0;
+}
+
+.footerMenu a span {
+ text-decoration: underline;
+}
+
+.footerMenu a:hover span {
+ text-decoration: none;
+}
+
+.footerMenu div.popupMenu {
+ font-size: 1em;
+}
+
+/* -- -- -- -- -- Footer Options -- -- -- -- -- */
+
+.footerOptions {
+ margin-bottom: 10px;
+ float: right;
+}
+
+.footerOptions ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.footerOptionsInner > ul > li {
+ display: inline-block;
+}
+
+.footerOptions li {
+ border-width: 0 1px 0 0;
+ border-style: solid;
+ margin-top: 5px;
+ padding: 0 10px 0 7px;
+}
+
+.footerOptions li.last {
+ border-width: 0;
+}
+
+.footerOptions a, .footerOptions em {
+ font-style: normal;
+ text-decoration: none;
+ display: block;
+}
+
+.footerOptionsInner > ul > li > a {
+ min-height: 16px;
+}
+
+.footerOptions span {
+ padding: 3px 0 2px 0;
+}
+
+.footerOptions a span {
+ text-decoration: underline;
+}
+
+.footerOptions a:hover span {
+ text-decoration: none;
+}
+
+.footerOptions div.popupMenu {
+ font-size: 1em;
+}
+
+/* -- -- -- -- -- Extra Button -- -- -- -- -- */
+
+.footerOptions li.extraButton {
+ border-width: 1px;
+ margin-top: 0 !important;
+ padding: 0;
+}
+
+.footerOptions li.extraButton a {
+ margin: 0;
+ padding: 1px 2px 0 2px;
+}
+
+/* -- -- -- -- -- Copyright -- -- -- -- -- */
+
+.copyright {
+ text-align: center;
+ white-space: nowrap;
+ padding: 10px 0 7px 0;
+ clear: both;
+}
+
+.copyright a {
+ text-decoration: none;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-/**\r
- * Form Styles\r
- *\r
- * @author Arian Glander, Harald Szekely\r
- * @copyright 2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */\r
-\r
-form {\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-textarea, input, select {\r
- font-size: .95em;\r
-}\r
-\r
-input[type="submit"], input[type="reset"], input[type="button"], input[type="file"] {\r
- font-size: 1em;\r
-}\r
-\r
-.formSubmit { /* holds submit-buttons "preview, draft, submit" */\r
- text-align: center;\r
- margin-top: 10px;\r
- margin-bottom: 15px;\r
-}\r
-\r
-textarea, .inputText {\r
- border-width: 1px;\r
- width: 99.5%;\r
-}\r
-\r
-select {\r
- border-width: 1px;\r
- padding: 2px;\r
-}\r
-\r
-input[type="text"], input[type="password"] {\r
- padding: 3px 0 3px 2px;\r
-}\r
-\r
-input[type="file"] {\r
- padding: 2px 3px;\r
-}\r
-\r
-select[multiple="multiple"] {\r
- padding: 0 !important;\r
-}\r
-\r
-textarea {\r
- padding-left: 3px;\r
-}\r
-\r
-input[type="radio"] {\r
- margin-left: 0;\r
-}\r
-\r
-select[multiple="multiple"] {\r
- width: 100%;\r
-}\r
-\r
-input[type="image"] {\r
- margin: 0 3px -3px 0;\r
-}\r
-\r
-.searchInput > input[type="image"] {\r
- margin: 0;\r
-}\r
-\r
-.fourDigitInput {\r
- width: 40px !important;\r
-}\r
-\r
-.textareaSmall {\r
- height: 1.9em; \r
- line-height: 2;\r
-}\r
-\r
-/* -- -- -- -- -- Form Element -- -- -- -- -- */\r
-\r
-.formElement {\r
- margin: 5px 0 3px 0;\r
- min-height: 0;\r
-}\r
-\r
-.formElement:after {\r
- content: "";\r
- height: 0;\r
- display: block;\r
- clear: both;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field -- -- -- -- -- */\r
-\r
-.formField {\r
- padding: 0;\r
-}\r
-\r
-.formElement .formField {\r
- margin-left: 216px;\r
-}\r
-\r
-fieldset .formElement .formField {\r
- margin-left: 202px;\r
-}\r
-\r
-.formField input, .formField select, .formField textarea {\r
- margin: 2px 0;\r
-}\r
-\r
-.formField label {\r
- font-size: 1em !important;\r
- display: block;\r
-}\r
-\r
-.containerContent .formField {\r
- margin-top: -5px;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field Label -- -- -- -- -- */\r
-\r
-.formFieldLabel {\r
- text-align: right;\r
- float: left;\r
- width: 200px;\r
-}\r
-\r
-fieldset .formFieldLabel {\r
- width: 187px;\r
-}\r
-\r
-/* -- -- -- -- -- Form Field Description -- -- -- -- -- */\r
-\r
-.formFieldDesc {\r
- padding: 0 0 2px 0;\r
-}\r
-\r
-.formElement .formFieldDesc {\r
- margin-left: 216px;\r
-}\r
-\r
-fieldset .formElement .formFieldDesc {\r
- margin-left: 202px;\r
-}\r
-\r
-.formCheckBox .formFieldDesc {\r
- padding: 0 0 2px 18px;\r
-}\r
-\r
-.formFieldDesc code {\r
- font-size: 1.3em;\r
-}\r
-\r
-.formFieldDesc > p {\r
- clear: both;\r
-}\r
-\r
-/* -- -- -- -- -- Form Group -- -- -- -- -- */\r
-\r
-/* A form group contains serveral sub form elements within a fieldset */\r
-\r
-.formGroup {\r
- min-height: 0;\r
- margin: 5px 0 3px 0;\r
-}\r
-\r
-.formGroup .formGroupLabel {\r
- text-align: right;\r
- float: left;\r
- width: 200px;\r
-}\r
-\r
-fieldset .formGroup .formGroupLabel {\r
- width: 187px;\r
-}\r
-\r
-.formGroup .formGroupField {\r
- margin-left: 216px;\r
-}\r
-\r
-fieldset .formGroup .formGroupField {\r
- margin-left: 203px;\r
-}\r
-\r
-.formGroup .formGroupField legend {\r
- display: none;\r
-}\r
-\r
-/* ToDo: Find a better solution for that! Impossible to build long inputs as long as this is active! */\r
-.formGroup .formGroupField .formElement input {\r
- width: auto !important;\r
-}\r
-\r
-/* -- -- -- -- -- Form Prefix -- -- -- -- -- */\r
-\r
-.formPrefix select {\r
- float: left;\r
- width: 150px;\r
-}\r
-\r
-.formPrefix div {\r
- margin-left: 155px;\r
-}\r
-\r
-.formPrefix {\r
- min-height: 0;\r
-}\r
-\r
-/* -- -- -- -- -- Form Options -- -- -- -- -- */\r
-\r
-.formOptions {\r
- list-style: none;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.formOptions li {\r
- margin-top: 3px;\r
- padding-right: 2%;\r
- width: 23%;\r
- float: left;\r
-}\r
-\r
-.formOptions li span {\r
- float: none;\r
- padding-left: 12px;\r
-}\r
-\r
-/* -- -- -- -- -- Form Options Long -- -- -- -- -- */\r
-\r
-.formOptionsLong {\r
- list-style: none;\r
- margin: 0 0 7px 0;\r
- padding: 0;\r
-}\r
-\r
-.formOptionsLong li {\r
- margin: 3px 0 0 0;\r
- padding: 0;\r
-}\r
-\r
-.formOptionsLong span, .formOptionsLong label {\r
- display: inline;\r
-}\r
-\r
-/* -- -- -- -- -- Form Error -- -- -- -- -- */\r
-\r
-.formError, .formError a {\r
- color: #c00;\r
-}\r
-\r
-.formError .inputText, .formError textarea, .formError select {\r
- border-color: #c00;\r
- background-color: #fee;\r
-}\r
-\r
-.formError .mceToolbar select {\r
- /* prevents error with dropdown borders within the editor toolbar */\r
- border-color: transparent !important;\r
-}\r
-\r
-/* -- -- -- -- Long Select -- -- -- -- */\r
-\r
-.longSelect select {\r
- width: 100%;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Form Styles
+ *
+ * @author Arian Glander, Harald Szekely
+ * @copyright 2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Miscellaneous -- -- -- -- -- */
+
+form {
+ margin: 0;
+ padding: 0;
+}
+
+textarea, input, select {
+ font-size: .95em;
+}
+
+input[type="submit"], input[type="reset"], input[type="button"], input[type="file"] {
+ font-size: 1em;
+}
+
+.formSubmit { /* holds submit-buttons "preview, draft, submit" */
+ text-align: center;
+ margin-top: 10px;
+ margin-bottom: 15px;
+}
+
+textarea, .inputText {
+ border-width: 1px;
+ width: 99.5%;
+}
+
+select {
+ border-width: 1px;
+ padding: 2px;
+}
+
+input[type="text"], input[type="password"] {
+ padding: 3px 0 3px 2px;
+}
+
+input[type="file"] {
+ padding: 2px 3px;
+}
+
+select[multiple="multiple"] {
+ padding: 0 !important;
+}
+
+textarea {
+ padding-left: 3px;
+}
+
+input[type="radio"] {
+ margin-left: 0;
+}
+
+select[multiple="multiple"] {
+ width: 100%;
+}
+
+input[type="image"] {
+ margin: 0 3px -3px 0;
+}
+
+.searchInput > input[type="image"] {
+ margin: 0;
+}
+
+.fourDigitInput {
+ width: 40px !important;
+}
+
+.textareaSmall {
+ height: 1.9em;
+ line-height: 2;
+}
+
+/* -- -- -- -- -- Form Element -- -- -- -- -- */
+
+.formElement {
+ margin: 5px 0 3px 0;
+ min-height: 0;
+}
+
+.formElement:after {
+ content: "";
+ height: 0;
+ display: block;
+ clear: both;
+}
+
+/* -- -- -- -- -- Form Field -- -- -- -- -- */
+
+.formField {
+ padding: 0;
+}
+
+.formElement .formField {
+ margin-left: 216px;
+}
+
+fieldset .formElement .formField {
+ margin-left: 202px;
+}
+
+.formField input, .formField select, .formField textarea {
+ margin: 2px 0;
+}
+
+.formField label {
+ font-size: 1em !important;
+ display: block;
+}
+
+.containerContent .formField {
+ margin-top: -5px;
+}
+
+/* -- -- -- -- -- Form Field Label -- -- -- -- -- */
+
+.formFieldLabel {
+ text-align: right;
+ float: left;
+ width: 200px;
+}
+
+fieldset .formFieldLabel {
+ width: 187px;
+}
+
+/* -- -- -- -- -- Form Field Description -- -- -- -- -- */
+
+.formFieldDesc {
+ padding: 0 0 2px 0;
+}
+
+.formElement .formFieldDesc {
+ margin-left: 216px;
+}
+
+fieldset .formElement .formFieldDesc {
+ margin-left: 202px;
+}
+
+.formCheckBox .formFieldDesc {
+ padding: 0 0 2px 18px;
+}
+
+.formFieldDesc code {
+ font-size: 1.3em;
+}
+
+.formFieldDesc > p {
+ clear: both;
+}
+
+/* -- -- -- -- -- Form Group -- -- -- -- -- */
+
+/* A form group contains serveral sub form elements within a fieldset */
+
+.formGroup {
+ min-height: 0;
+ margin: 5px 0 3px 0;
+}
+
+.formGroup .formGroupLabel {
+ text-align: right;
+ float: left;
+ width: 200px;
+}
+
+fieldset .formGroup .formGroupLabel {
+ width: 187px;
+}
+
+.formGroup .formGroupField {
+ margin-left: 216px;
+}
+
+fieldset .formGroup .formGroupField {
+ margin-left: 203px;
+}
+
+.formGroup .formGroupField legend {
+ display: none;
+}
+
+/* ToDo: Find a better solution for that! Impossible to build long inputs as long as this is active! */
+.formGroup .formGroupField .formElement input {
+ width: auto !important;
+}
+
+/* -- -- -- -- -- Form Prefix -- -- -- -- -- */
+
+.formPrefix select {
+ float: left;
+ width: 150px;
+}
+
+.formPrefix div {
+ margin-left: 155px;
+}
+
+.formPrefix {
+ min-height: 0;
+}
+
+/* -- -- -- -- -- Form Options -- -- -- -- -- */
+
+.formOptions {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.formOptions li {
+ margin-top: 3px;
+ padding-right: 2%;
+ width: 23%;
+ float: left;
+}
+
+.formOptions li span {
+ float: none;
+ padding-left: 12px;
+}
+
+/* -- -- -- -- -- Form Options Long -- -- -- -- -- */
+
+.formOptionsLong {
+ list-style: none;
+ margin: 0 0 7px 0;
+ padding: 0;
+}
+
+.formOptionsLong li {
+ margin: 3px 0 0 0;
+ padding: 0;
+}
+
+.formOptionsLong span, .formOptionsLong label {
+ display: inline;
+}
+
+/* -- -- -- -- -- Form Error -- -- -- -- -- */
+
+.formError, .formError a {
+ color: #c00;
+}
+
+.formError .inputText, .formError textarea, .formError select {
+ border-color: #c00;
+ background-color: #fee;
+}
+
+.formError .mceToolbar select {
+ /* prevents error with dropdown borders within the editor toolbar */
+ border-color: transparent !important;
+}
+
+/* -- -- -- -- Long Select -- -- -- -- */
+
+.longSelect select {
+ width: 100%;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-/**\r
- * Inline Calendar Styles\r
- *\r
- * @author Arian Glander, Harald Szekely\r
- * @copyright 2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Inline Calendar -- -- -- -- -- */\r
-\r
-.inlineCalendar {\r
- position: absolute; \r
- display: none; \r
- z-index: 100;\r
- width: 170px;\r
-}\r
-\r
-.inlineCalendarHeader, .inlineCalendarFooter {\r
- color: #fff;\r
- width: 100%;\r
- border-collapse: collapse;\r
- border-spacing: 0;\r
- table-layout: fixed;\r
- border-width: 1px;\r
-}\r
-\r
-.inlineCalendarHeader td, .inlineCalendarFooter td {\r
- text-align: center;\r
- font-weight: bold;\r
- padding: 0;\r
-}\r
-\r
-.inlineCalendarHeader td a, .inlineCalendarFooter td a {\r
- text-decoration: none;\r
- border-width: 1px;\r
- border-style: solid;\r
- padding: 1px;\r
- display: block;\r
-}\r
-\r
-.inlineCalendarHeader td span, .inlineCalendarFooter td span {\r
- border-width: 1px 0;\r
- border-style: solid;\r
- padding: 1px;\r
- display: block;\r
-}\r
-\r
-.inlineCalendarHeader td a:hover, .inlineCalendarFooter td a:hover {\r
- text-decoration: none;\r
-}\r
-\r
-.changeElement {\r
- width: 1.5em;\r
-}\r
-\r
-.inlineCalendarTable {\r
- border-width: 0 1px !important;\r
- border-collapse: collapse;\r
- border-spacing: 0;\r
- border-top: 0;\r
- border-bottom: 0;\r
- table-layout: fixed;\r
- width: 100%; \r
-}\r
-\r
-.inlineCalendarTable td {\r
- padding: 0;\r
- margin: 0;\r
-}\r
-\r
-.inlineCalendarTable a {\r
- text-align: center;\r
- text-decoration: none;\r
- border-width: 1px;\r
- border-style: solid;\r
- margin: 1px;\r
- padding: 1px;\r
- display: block;\r
-}\r
-\r
-.weekDays {\r
- text-align: center;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Inline Calendar Styles
+ *
+ * @author Arian Glander, Harald Szekely
+ * @copyright 2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Inline Calendar -- -- -- -- -- */
+
+.inlineCalendar {
+ position: absolute;
+ display: none;
+ z-index: 100;
+ width: 170px;
+}
+
+.inlineCalendarHeader, .inlineCalendarFooter {
+ color: #fff;
+ width: 100%;
+ border-collapse: collapse;
+ border-spacing: 0;
+ table-layout: fixed;
+ border-width: 1px;
+}
+
+.inlineCalendarHeader td, .inlineCalendarFooter td {
+ text-align: center;
+ font-weight: bold;
+ padding: 0;
+}
+
+.inlineCalendarHeader td a, .inlineCalendarFooter td a {
+ text-decoration: none;
+ border-width: 1px;
+ border-style: solid;
+ padding: 1px;
+ display: block;
+}
+
+.inlineCalendarHeader td span, .inlineCalendarFooter td span {
+ border-width: 1px 0;
+ border-style: solid;
+ padding: 1px;
+ display: block;
+}
+
+.inlineCalendarHeader td a:hover, .inlineCalendarFooter td a:hover {
+ text-decoration: none;
+}
+
+.changeElement {
+ width: 1.5em;
+}
+
+.inlineCalendarTable {
+ border-width: 0 1px !important;
+ border-collapse: collapse;
+ border-spacing: 0;
+ border-top: 0;
+ border-bottom: 0;
+ table-layout: fixed;
+ width: 100%;
+}
+
+.inlineCalendarTable td {
+ padding: 0;
+ margin: 0;
+}
+
+.inlineCalendarTable a {
+ text-align: center;
+ text-decoration: none;
+ border-width: 1px;
+ border-style: solid;
+ margin: 1px;
+ padding: 1px;
+ display: block;
+}
+
+.weekDays {
+ text-align: center;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-/**\r
- * Page Navigation Styles\r
- *\r
- * @author Arian Glander, Harald Szekely\r
- * @copyright 2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Page Navigation -- -- -- -- -- */\r
-\r
-.pageNavigation {\r
- margin-top: .5em;\r
- margin-right: 20px;\r
- margin-bottom: 5px;\r
- float: left;\r
- clear: left;\r
-}\r
-\r
-.pageNavigation ul {\r
- list-style: none;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.pageNavigation li {\r
- border-width: 1px;\r
- border-style: solid;\r
- margin-right: 3px;\r
- float: left;\r
- position: relative;\r
-}\r
-\r
-.pageNavigation li.active, .pageNavigation li:active {\r
- border-width: 1px;\r
- border-style: solid;\r
-}\r
-\r
-.pageNavigation a, .pageNavigation li span {\r
- text-align: center;\r
- text-decoration: none;\r
- border-width: 1px;\r
- border-style: solid;\r
- padding: 0 4px;\r
- display: block;\r
-}\r
-\r
-.pageNavigation li div {\r
- text-align: center;\r
- margin-left: -1px;\r
- padding: 0 0 .4em 0;\r
- position: absolute;\r
- bottom: 1.6em;\r
- width: 12em; /* opera fix */\r
- z-index: 200;\r
- display: none;\r
- opacity: .9;\r
-}\r
-\r
-.pageNavigation li:hover div {\r
- display: block;\r
-}\r
-\r
-.pageNavigation li ul {\r
- border: 1px;\r
- padding: 0 0 2px 2px;\r
- float: left;\r
- clear: left;\r
-}\r
-\r
-.pageNavigation li ul li {\r
- text-align: right !important;\r
- margin-top: 2px;\r
-}\r
-\r
-.pageNavigation .skip, .pageNavigation .skip:hover, .pageNavigation .skip:active {\r
- border: none;\r
-}\r
-\r
-.pageNavigation .skip a, .pageNavigation .skip a:hover, .pageNavigation .skip a:active, .pageNavigation .skip span {\r
- background-color: transparent;\r
- background-image: none !important;\r
- border: none;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.pageNavigation .skip {\r
- padding: 1px 1px !important;\r
- width: 16px;\r
-}\r
-\r
-.pageNavigation .skip img {\r
- vertical-align: middle;\r
-}\r
-\r
-.pageNavigation input {\r
- text-align: center;\r
- background-color: transparent;\r
- border: none;\r
- margin: 0;\r
- padding: 2px 0;\r
- width: 2.5em;\r
- min-height: 1.84em;\r
- display: none;\r
-}\r
-\r
-.pageNavigation .children {\r
- padding: 0;\r
-}\r
-\r
-/* Drop Down Menus (also see pageMenu.css) */\r
-.pageNavigation a, .pageNavigation li ul, .pageNavigation li {\r
- border-width: 1px;\r
-}\r
-\r
-/* Drop Down Menus (also see pageMenu.css) */\r
-.pageNavigation a, .pageNavigation li.children span {\r
- border-color: #fff;\r
- border-style: solid;\r
-}\r
-\r
-.statusDisplay .pageNavigation {\r
- margin: 0;\r
- padding: 0 0 2px 0;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Page Navigation Styles
+ *
+ * @author Arian Glander, Harald Szekely
+ * @copyright 2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Page Navigation -- -- -- -- -- */
+
+.pageNavigation {
+ margin-top: .5em;
+ margin-right: 20px;
+ margin-bottom: 5px;
+ float: left;
+ clear: left;
+}
+
+.pageNavigation ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.pageNavigation li {
+ border-width: 1px;
+ border-style: solid;
+ margin-right: 3px;
+ float: left;
+ position: relative;
+}
+
+.pageNavigation li.active, .pageNavigation li:active {
+ border-width: 1px;
+ border-style: solid;
+}
+
+.pageNavigation a, .pageNavigation li span {
+ text-align: center;
+ text-decoration: none;
+ border-width: 1px;
+ border-style: solid;
+ padding: 0 4px;
+ display: block;
+}
+
+.pageNavigation li div {
+ text-align: center;
+ margin-left: -1px;
+ padding: 0 0 .4em 0;
+ position: absolute;
+ bottom: 1.6em;
+ width: 12em; /* opera fix */
+ z-index: 200;
+ display: none;
+ opacity: .9;
+}
+
+.pageNavigation li:hover div {
+ display: block;
+}
+
+.pageNavigation li ul {
+ border: 1px;
+ padding: 0 0 2px 2px;
+ float: left;
+ clear: left;
+}
+
+.pageNavigation li ul li {
+ text-align: right !important;
+ margin-top: 2px;
+}
+
+.pageNavigation .skip, .pageNavigation .skip:hover, .pageNavigation .skip:active {
+ border: none;
+}
+
+.pageNavigation .skip a, .pageNavigation .skip a:hover, .pageNavigation .skip a:active, .pageNavigation .skip span {
+ background-color: transparent;
+ background-image: none !important;
+ border: none;
+ margin: 0;
+ padding: 0;
+}
+
+.pageNavigation .skip {
+ padding: 1px 1px !important;
+ width: 16px;
+}
+
+.pageNavigation .skip img {
+ vertical-align: middle;
+}
+
+.pageNavigation input {
+ text-align: center;
+ background-color: transparent;
+ border: none;
+ margin: 0;
+ padding: 2px 0;
+ width: 2.5em;
+ min-height: 1.84em;
+ display: none;
+}
+
+.pageNavigation .children {
+ padding: 0;
+}
+
+/* Drop Down Menus (also see pageMenu.css) */
+.pageNavigation a, .pageNavigation li ul, .pageNavigation li {
+ border-width: 1px;
+}
+
+/* Drop Down Menus (also see pageMenu.css) */
+.pageNavigation a, .pageNavigation li.children span {
+ border-color: #fff;
+ border-style: solid;
+}
+
+.statusDisplay .pageNavigation {
+ margin: 0;
+ padding: 0 0 2px 0;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-/**\r
- * Tabbed Menu Styles\r
- *\r
- * @author Arian Glander, Harald Szekely\r
- * @copyright 2006-2011 WoltLab GmbH\r
- */\r
-\r
-/* -- -- -- -- -- Tabs -- -- -- -- -- */\r
-\r
-.tabMenu {\r
- margin-top: 5px;\r
- clear: both;\r
- width: 100%;\r
-}\r
-\r
-.tabMenu:after {\r
- content: "";\r
- clear: both;\r
- display: block;\r
- height: 0;\r
-}\r
-\r
-.tabMenu ul {\r
- margin: 0; \r
- padding: 0 0 0 10px; \r
-}\r
-\r
-.tabMenu li {\r
- list-style: none;\r
- border-width: 1px 1px 0 1px;\r
- margin-right: 3px;\r
- float: left;\r
-}\r
-\r
-.tabMenu li a {\r
- text-decoration: none;\r
- white-space: nowrap;\r
- border-width: 1px;\r
- border-style: solid;\r
- padding: 2px 5px 0 5px;\r
- display: block;\r
- position: relative;\r
- z-index: 10;\r
-}\r
-\r
-.tabMenu li.activeTabMenu a {\r
- border-bottom: none;\r
- padding-bottom: 3px;\r
- position: relative;\r
- z-index: 20;\r
-}\r
-\r
-.tabMenu li a, .tabMenu li.activeTabMenu a {\r
- min-height: 24px;\r
-}\r
-\r
-/* -- -- -- -- -- Sub Tab Menu -- -- -- -- -- */\r
- \r
-/* Elements inside the bar below the tabs */\r
- \r
-.subTabMenu {\r
- border: 1px;\r
- margin-bottom: -1px;\r
- margin-top: -2px;\r
- padding: 1px;\r
- position: relative;\r
- z-index: 0;\r
-}\r
-\r
-.subTabMenu:after {\r
- content: "";\r
- clear: both;\r
- display: block;\r
- height: 0;\r
-}\r
-\r
-.subTabMenu .containerHead {\r
- margin: 0;\r
- padding: 2px;\r
- min-height: 5px;\r
-}\r
-\r
-.subTabMenu .containerHead h2, .subTabMenu .containerHead h3 {\r
- padding: 2px 5px;\r
-}\r
-\r
-.subTabMenu .containerHead:after {\r
- content: "";\r
- clear: both;\r
- display: block;\r
- height: 0;\r
-}\r
-\r
-.subTabMenu ul {\r
- list-style: none;\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.subTabMenu li {\r
- float: left;\r
-}\r
-\r
-.subTabMenu li a {\r
- text-decoration: none;\r
- white-space: nowrap;\r
- margin: 1px 2px;\r
- padding: 2px 7px;\r
- display: block;\r
-}\r
-\r
-.subTabMenu li.activeSubTabMenu a, .subTabMenu li a:hover {\r
- border-width: 1px;\r
- padding: 1px 6px;\r
-}\r
-\r
-.subTabMenu .containerHead div {\r
- font-size: 5px;\r
- height: 5px;\r
-}\r
-\r
-/* -- -- -- -- -- Sub Container Menu -- -- -- -- -- */\r
-\r
-/* ToDo: Find a more flexible solution */\r
-\r
-.contentBox .border .subTabMenu {\r
- border: none;\r
- margin: 0 0 1px 0;\r
- padding: 0;\r
-}\r
-\r
-.contentBox .border .subTabMenu .containerHead {\r
- border: none;\r
- margin: 0 1px 0 0;\r
-}\r
-\r
-/* -- -- -- -- -- Tab Menu Content -- -- -- -- -- */\r
-\r
-/* Content below the Sub Tab Menu */\r
-\r
-.tabMenuContent {\r
- clear: both;\r
-}\r
-\r
-.tabMenuContent > div {\r
- padding: 15px 25px;\r
-}\r
-\r
-.tabMenuContent .subHeadline {\r
- margin-bottom: 2px;\r
-}\r
-\r
-.tabMenuContent h3.containerContent {\r
- margin-top: 0;\r
- margin-bottom: 0;\r
-}\r
-\r
-.tabMenuContent fieldset.noJavaScript {\r
- background: transparent;\r
- border: 0;\r
- margin: 0;\r
- padding-top: 13px;\r
-}\r
-\r
-.tabMenuContent legend.noJavaScript {\r
- display: none;\r
-}\r
-\r
-.tabMenuContentContainer {\r
- clear: both;\r
-}\r
-\r
-.tabMenuContent .message {\r
- margin-bottom: 7px;\r
-}\r
-\r
-.tabMenuContent .messageInner .smallButtons:after {\r
- clear: none;\r
-}\r
-\r
-.tabMenuContent .message .messageHeading {\r
- margin-top: 0 !important;\r
-}\r
-\r
-/* -- -- -- -- -- Specials -- -- -- -- -- */\r
-\r
-.tabNavigation { /* still necessary? */\r
- float: right;\r
-}\r
-\r
-/* -- -- -- -- -- EOF -- -- -- -- -- */\r
+/**
+ * Tabbed Menu Styles
+ *
+ * @author Arian Glander, Harald Szekely
+ * @copyright 2006-2011 WoltLab GmbH
+ */
+
+/* -- -- -- -- -- Tabs -- -- -- -- -- */
+
+.tabMenu {
+ margin-top: 5px;
+ clear: both;
+ width: 100%;
+}
+
+.tabMenu:after {
+ content: "";
+ clear: both;
+ display: block;
+ height: 0;
+}
+
+.tabMenu ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+}
+
+.tabMenu li {
+ list-style: none;
+ border-width: 1px 1px 0 1px;
+ margin-right: 3px;
+ float: left;
+}
+
+.tabMenu li a {
+ text-decoration: none;
+ white-space: nowrap;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2px 5px 0 5px;
+ display: block;
+ position: relative;
+ z-index: 10;
+}
+
+.tabMenu li.activeTabMenu a {
+ border-bottom: none;
+ padding-bottom: 3px;
+ position: relative;
+ z-index: 20;
+}
+
+.tabMenu li a, .tabMenu li.activeTabMenu a {
+ min-height: 24px;
+}
+
+/* -- -- -- -- -- Sub Tab Menu -- -- -- -- -- */
+
+/* Elements inside the bar below the tabs */
+
+.subTabMenu {
+ border: 1px;
+ margin-bottom: -1px;
+ margin-top: -2px;
+ padding: 1px;
+ position: relative;
+ z-index: 0;
+}
+
+.subTabMenu:after {
+ content: "";
+ clear: both;
+ display: block;
+ height: 0;
+}
+
+.subTabMenu .containerHead {
+ margin: 0;
+ padding: 2px;
+ min-height: 5px;
+}
+
+.subTabMenu .containerHead h2, .subTabMenu .containerHead h3 {
+ padding: 2px 5px;
+}
+
+.subTabMenu .containerHead:after {
+ content: "";
+ clear: both;
+ display: block;
+ height: 0;
+}
+
+.subTabMenu ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.subTabMenu li {
+ float: left;
+}
+
+.subTabMenu li a {
+ text-decoration: none;
+ white-space: nowrap;
+ margin: 1px 2px;
+ padding: 2px 7px;
+ display: block;
+}
+
+.subTabMenu li.activeSubTabMenu a, .subTabMenu li a:hover {
+ border-width: 1px;
+ padding: 1px 6px;
+}
+
+.subTabMenu .containerHead div {
+ font-size: 5px;
+ height: 5px;
+}
+
+/* -- -- -- -- -- Sub Container Menu -- -- -- -- -- */
+
+/* ToDo: Find a more flexible solution */
+
+.contentBox .border .subTabMenu {
+ border: none;
+ margin: 0 0 1px 0;
+ padding: 0;
+}
+
+.contentBox .border .subTabMenu .containerHead {
+ border: none;
+ margin: 0 1px 0 0;
+}
+
+/* -- -- -- -- -- Tab Menu Content -- -- -- -- -- */
+
+/* Content below the Sub Tab Menu */
+
+.tabMenuContent {
+ clear: both;
+}
+
+.tabMenuContent > div {
+ padding: 15px 25px;
+}
+
+.tabMenuContent .subHeadline {
+ margin-bottom: 2px;
+}
+
+.tabMenuContent h3.containerContent {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.tabMenuContent fieldset.noJavaScript {
+ background: transparent;
+ border: 0;
+ margin: 0;
+ padding-top: 13px;
+}
+
+.tabMenuContent legend.noJavaScript {
+ display: none;
+}
+
+.tabMenuContentContainer {
+ clear: both;
+}
+
+.tabMenuContent .message {
+ margin-bottom: 7px;
+}
+
+.tabMenuContent .messageInner .smallButtons:after {
+ clear: none;
+}
+
+.tabMenuContent .message .messageHeading {
+ margin-top: 0 !important;
+}
+
+/* -- -- -- -- -- Specials -- -- -- -- -- */
+
+.tabNavigation { /* still necessary? */
+ float: right;
+}
+
+/* -- -- -- -- -- EOF -- -- -- -- -- */
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de-informal">\r
- <category name="wcf.acp">\r
- <item name="wcf.acp"><![CDATA[Administrationsoberfläche]]></item>\r
- <item name="wcf.acp.help"><![CDATA[Hilfe]]></item>\r
- <item name="wcf.acp.help.complete"><![CDATA[Vollständige Hilfe]]></item>\r
- <item name="wcf.acp.help.disable"><![CDATA[Hilfe deaktivieren]]></item>\r
- <item name="wcf.acp.help.interactive"><![CDATA[Interaktive Hilfe]]></item>\r
- <item name="wcf.acp.packageQuickAccess"><![CDATA[Paket wechseln]]></item>\r
- <item name="wcf.acp.search.extended"><![CDATA[Erweiterte Suche ...]]></item>\r
- <item name="wcf.acp.sitemap"><![CDATA[Sitemap]]></item>\r
- </category>\r
- <category name="wcf.acp.cache">\r
- <item name="wcf.acp.cache.button.clear"><![CDATA[Cache leeren]]></item>\r
- <item name="wcf.acp.cache.clear.success"><![CDATA[Der Cache wurde erfolgreich gelöscht.]]></item>\r
- <item name="wcf.acp.cache.clear.sure"><![CDATA[Möchtest du den Cache wirklich komplett leeren?]]></item>\r
- <item name="wcf.acp.cache.data"><![CDATA[Eigenschaften]]></item>\r
- <item name="wcf.acp.cache.data.files"><![CDATA[Dateien]]></item>\r
- <item name="wcf.acp.cache.data.size"><![CDATA[Größe]]></item>\r
- <item name="wcf.acp.cache.data.source"><![CDATA[Quelle]]></item>\r
- <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>\r
- <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>\r
- <item name="wcf.acp.cache.list.mtime"><![CDATA[Letzte Aktualisierung]]></item>\r
- <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>\r
- <item name="wcf.acp.cache.list.perm"><![CDATA[Zugriffsrechte]]></item>\r
- <item name="wcf.acp.cache.list.size"><![CDATA[Größe]]></item>\r
- </category>\r
- <category name="wcf.acp.cronjob">\r
- <item name="wcf.acp.cronjob.active"><![CDATA[Aktiv]]></item>\r
- <item name="wcf.acp.cronjob.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>\r
- <item name="wcf.acp.cronjob.add.data"><![CDATA[Allgemeine Daten]]></item>\r
- <item name="wcf.acp.cronjob.add.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde hinzugefügt.]]></item>\r
- <item name="wcf.acp.cronjob.add.timing"><![CDATA[Zeitsteuerung]]></item>\r
- <item name="wcf.acp.cronjob.className"><![CDATA[Pfad zur Klasse]]></item>\r
- <item name="wcf.acp.cronjob.className.description"><![CDATA[Gib den Pfad zu der PHP-Datei an, die die entsprechende auszuführende Klasse enthält. Die Pfadangabe muss relativ zum Installationsverzeichnis der ausgewählten Endanwendung sein.]]></item>\r
- <item name="wcf.acp.cronjob.cronjobID"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.cronjob.delete"><![CDATA[Zeitgesteuerte Aufgabe löschen]]></item>\r
- <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht gelöscht werden.]]></item>\r
- <item name="wcf.acp.cronjob.delete.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde gelöscht.]]></item>\r
- <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Bist du sicher, dass du diese zeitgesteuerte Aufgabe löschen möchtest?]]></item>\r
- <item name="wcf.acp.cronjob.description"><![CDATA[Beschreibung]]></item>\r
- <item name="wcf.acp.cronjob.description.description"><![CDATA[Hier kannst du eine kurze Beschreibung der Aufgabe eintragen.]]></item>\r
- <item name="wcf.acp.cronjob.disable"><![CDATA[Deaktivieren]]></item>\r
- <item name="wcf.acp.cronjob.edit"><![CDATA[Zeitgesteuerte Aufgabe bearbeiten]]></item>\r
- <item name="wcf.acp.cronjob.edit.data"><![CDATA[Allgemeine Daten]]></item>\r
- <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht verändert werden.]]></item>\r
- <item name="wcf.acp.cronjob.edit.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde erfolgreich geändert.]]></item>\r
- <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Zeitsteuerung]]></item>\r
- <item name="wcf.acp.cronjob.enable"><![CDATA[Aktivieren]]></item>\r
- <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[Der angegebene Pfad ist ungültig.]]></item>\r
- <item name="wcf.acp.cronjob.error.empty"><![CDATA[Bitte füll dieses Eingabefeld aus.]]></item>\r
- <item name="wcf.acp.cronjob.error.notValid"><![CDATA[Das Zeitformat ist ungültig.]]></item>\r
- <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Zeitgesteuerte Aufgabe mehrfach ausführen]]></item>\r
- <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[Durch Aktivieren dieser Option wird die Aufgabe mehrfach ausgeführt, wenn zwischen dem letzten Ausführungszeitpunkt und dem aktuellen Zeitpunkt weitere Ausführungszeitpunkte liegen.]]></item>\r
- <item name="wcf.acp.cronjob.execute"><![CDATA[Aufgabe jetzt ausführen]]></item>\r
- <item name="wcf.acp.cronjob.execute.success"><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt.]]></item>\r
- <item name="wcf.acp.cronjob.inactive"><![CDATA[Inaktiv]]></item>\r
- <item name="wcf.acp.cronjob.info"><![CDATA[Allgemeine Informationen]]></item>\r
- <item name="wcf.acp.cronjob.intro"><![CDATA[Das Anlegen von zeitgesteuerten Aufgaben erfordert eine genaue Kenntnis der Crontab-Syntax auf unixähnlichen Systemen. Weiterführende Informationen dazu erhältst du auf dieser Website: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>]]></item>\r
- <item name="wcf.acp.cronjob.lastExec"><![CDATA[Letzte Ausführung]]></item>\r
- <item name="wcf.acp.cronjob.list"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
- <item name="wcf.acp.cronjob.list.count"><![CDATA[Insgesamt {#$items} zeitgesteuerte Aufgabe{if $items != 1}n{/if}]]></item>\r
- <item name="wcf.acp.cronjob.log"><![CDATA[Protokoll der ausgeführten zeitgesteuerten Aufgaben]]></item>\r
- <item name="wcf.acp.cronjob.log.clear"><![CDATA[Alle löschen]]></item>\r
- <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Bist du sicher, dass du alle Protokoll-Einträge löschen möchtest?]]></item>\r
- <item name="wcf.acp.cronjob.log.data"><![CDATA[Insgesamt {#$items} {if $items == 1}Eintrag{else}Einträge{/if}]]></item>\r
- <item name="wcf.acp.cronjob.log.error"><![CDATA[Fehler:]]></item>\r
- <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Ausgeführt]]></item>\r
- <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[Derzeit sind keine Einträge vorhanden.]]></item>\r
- <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>\r
- <item name="wcf.acp.cronjob.nextExec"><![CDATA[Nächste Ausführung]]></item>\r
- <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[Derzeit ist keine zeitgesteuerte Aufgabe vorhanden.]]></item>\r
- <item name="wcf.acp.cronjob.packageName"><![CDATA[Installiert von]]></item>\r
- <item name="wcf.acp.cronjob.runNow"><![CDATA[Jetzt ausführen]]></item>\r
- <item name="wcf.acp.cronjob.startDom"><![CDATA[Tag des Monats]]></item>\r
- <item name="wcf.acp.cronjob.startDom.description"><![CDATA[An diesen Tagen des Monats (1 - 31) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>\r
- <item name="wcf.acp.cronjob.startDow"><![CDATA[Tag der Woche]]></item>\r
- <item name="wcf.acp.cronjob.startDow.description"><![CDATA[An diesen Tagen der Woche (0 - 6 mit Sonntag = 0 oder mon - sun) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>\r
- <item name="wcf.acp.cronjob.startHour"><![CDATA[Stunde]]></item>\r
- <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Zu diesen Stunden (0 - 23) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>\r
- <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>\r
- <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Zu diesen Minuten (0 - 59) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>\r
- <item name="wcf.acp.cronjob.startMonth"><![CDATA[Monat]]></item>\r
- <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[In diesen Monaten (1 - 12 oder jan - dec) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>\r
- <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>\r
- <item name="wcf.acp.cronjob.subtitle"><![CDATA[»Cronjobs«]]></item>\r
- </category>\r
- <category name="wcf.acp.group">\r
- <item name="wcf.acp.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>\r
- <item name="wcf.acp.group.add.permissions"><![CDATA[Zugriffsrechte]]></item>\r
- <item name="wcf.acp.group.add.success"><![CDATA[Die Benutzergruppe wurde erfolgreich angelegt.]]></item>\r
- <item name="wcf.acp.group.administrators"><![CDATA[Administratoren]]></item>\r
- <item name="wcf.acp.group.data"><![CDATA[Allgemeine Daten]]></item>\r
- <item name="wcf.acp.group.delete"><![CDATA[Benutzergruppe löschen]]></item>\r
- <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}Die Benutzergruppe wurde{else}{#$deletedGroups} Benutzergruppen wurden{/if} erfolgreich gelöscht.]]></item>\r
- <item name="wcf.acp.group.delete.sure"><![CDATA[Willst du diese Benutzergruppe wirklich löschen?]]></item>\r
- <item name="wcf.acp.group.edit"><![CDATA[Benutzergruppe bearbeiten]]></item>\r
- <item name="wcf.acp.group.edit.success"><![CDATA[Deine Änderungen an der Benutzergruppe wurde erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[Du bist selbst Mitglied dieser Benutzergruppe. Änderungen an den Zugriffsrechten dieser Benutzergruppe können womöglich dazu führen, dass du aus der Administrationsoberfläche ausgeschlossen wirst. Bitte sei entsprechend vorsichtig!]]></item>\r
- <item name="wcf.acp.group.everyone"><![CDATA[Jeder]]></item>\r
- <item name="wcf.acp.group.groupID"><![CDATA[Gruppen-ID]]></item>\r
- <item name="wcf.acp.group.groupName"><![CDATA[Name der Benutzergruppe]]></item>\r
- <item name="wcf.acp.group.groupName.description"><![CDATA[Gib einen Namen der Gruppe an.]]></item>\r
- <item name="wcf.acp.group.guests"><![CDATA[Gäste]]></item>\r
- <item name="wcf.acp.group.list"><![CDATA[Benutzergruppen]]></item>\r
- <item name="wcf.acp.group.list.data"><![CDATA[Insgesamt {#$items} Benutzergruppen]]></item>\r
- <item name="wcf.acp.group.members"><![CDATA[Anzahl Mitglieder]]></item>\r
- <item name="wcf.acp.group.moderators"><![CDATA[Moderatoren]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Kann Administrationsoberfläche betreten]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Mitglieder dieser Benutzergruppe können die Administrationsoberfläche betreten und dort abhängig von den weiteren Zugriffsrechten verschiedene Aktionen durchführen. Diese Option muss aktiviert sein, wenn diesen Benutzern andere administrative Funktionen erlaubt werden sollen.]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Kann versteckte Profilinformationen sehen]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Mitglieder dieser Benutzergruppe können die versteckten Informationen in Benutzerprofilen sehen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Kann allgemeine Einstellungen vornehmen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Mitglieder dieser Benutzergruppe können die allgemeinen System-Einstellungen sehen und bearbeiten. Z.B. Forum ein-/ausschalten.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Kann Protokolle abrufen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können die System-Protokolle abrufen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Kann neue zeitgesteuerte Aufgaben anlegen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue zeitgesteuerte Aufgaben anlegen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben löschen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben löschen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Kann Protokoll der zeitgesteuerten Aufgaben löschen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Protokoll der zeitgesteuerten Aufgaben löschen. Bei der Ausführung einer zeitgesteuerten Aufgabe wird festgehalten, ob dieser erfolgreich ausgeführt wurde.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben ändern]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben deaktivieren]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben deaktivieren. Diese werden dann nicht mehr ausgeführt, können später jedoch auch wieder aktiviert werden.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Kann Update-Server bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Update-Server bearbeiten und neue hinzufügen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Kann Pakete installieren]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können zusätzliche Pakete installieren.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Kann Pakete deinstallieren]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete entfernen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Kann Pakete aktualisieren]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete aktualisieren.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Zugängliche Benutzergruppen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Mitglieder dieser Benutzergruppe haben auf diese Gruppen Zugriff. Zusätzlich muss angegeben werden, ob z.B. die Benutzergruppe bearbeitet werden darf.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Kann neue Benutzergruppen erstellen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzergruppen erstellen.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Kann neue Benutzer erstellen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzer erstellen. Ist bei "Zugängliche Benutzergruppen" eine Option aktiviert, kann diese Gruppe beim Erstellen des Benutzers zugewiesen werden.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Kann Benutzergruppen löschen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen löschen.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Kann Benutzer löschen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer löschen.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Kann Benutzergruppen bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Kann E-Mail-Adressen bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Kann Kennwörter bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Kennwort von anderen Benutzern bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Kann Benutzer bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Kann E-Mails an Benutzer senden]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern sehen und ihnen E-Mails senden.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Kann Benutzer suchen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer und deren Profile durchsuchen.]]></item>\r
- <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrative Rechte]]></item>\r
- <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Inhalte]]></item>\r
- <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Darstellung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.general"><![CDATA[Allgemeine administrative Rechte]]></item>\r
- <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Wartung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System-Funktionen]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Paketverwaltung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user"><![CDATA[Benutzer-Funktionen]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Gruppenverwaltung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[Benutzerverwaltung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderative Rechte]]></item>\r
- <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.user"><![CDATA[Allgemeine Rechte]]></item>\r
- <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>\r
- <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Kann deaktivierte Stile benutzen]]></item>\r
- <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Mitglieder dieser Benutzergruppe können deaktivierte Stile auswählen.]]></item>\r
- <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Stil-Verwaltung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.showMembers"><![CDATA[Zeige die Mitglieder dieser Benutzergruppe]]></item>\r
- <item name="wcf.acp.group.superModerators"><![CDATA[Super Moderatoren]]></item>\r
- <item name="wcf.acp.group.users"><![CDATA[Registrierte Benutzer]]></item>\r
- </category>\r
- <category name="wcf.acp.login">\r
- <item name="wcf.acp.login"><![CDATA[Anmeldung]]></item>\r
- <item name="wcf.acp.login.data"><![CDATA[Zugangsdaten]]></item>\r
- </category>\r
- <category name="wcf.acp.masterPassword">\r
- <item name="wcf.acp.masterPassword"><![CDATA[Hauptkennwort]]></item>\r
- <item name="wcf.acp.masterPassword.confirm"><![CDATA[Hauptkennwort wiederholen]]></item>\r
- <item name="wcf.acp.masterPassword.enter"><![CDATA[Hauptkennwort erforderlich]]></item>\r
- <item name="wcf.acp.masterPassword.enter.description"><![CDATA[Die aufgerufene Seite oder Aktion erfordert aus Sicherheitsgründen die Eingabe des Hauptkennwortes. Pro Sitzung ist die Eingabe des Hauptkennwortes nur einmal erforderlich. Falls du das Hauptkennwort vergessen haben solltest, kannst du es zurücksetzen, indem du die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschst.]]></item>\r
- <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[Das Hauptkennwort ist nicht korrekt. Falls du das Hauptkennwort vergessen haben solltest, kannst du es zurücksetzen, indem du die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschst.]]></item>\r
- <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>\r
- <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[Das Kennwort wurde als unsicher erkannt. Das Kennwort sollte mindestens acht Zeichen lang sein, große und kleine lateinische Buchstaben, Zahlen und Sonderzeichen enthalten. Es darf nicht mit den Kennwörtern von anderen Administratoren übereinstimmen.]]></item>\r
- <item name="wcf.acp.masterPassword.example"><![CDATA[Vorschlag]]></item>\r
- <item name="wcf.acp.masterPassword.example.set"><![CDATA[Vorschlag übernehmen]]></item>\r
- <item name="wcf.acp.masterPassword.init"><![CDATA[Hauptkennwort festlegen]]></item>\r
- <item name="wcf.acp.masterPassword.init.description"><![CDATA[Das Hauptkennwort ist ein zusätzlicher Schutz für sicherheitskritische Funktionen. Du solltest hier ein möglichst sicheres Kennwort verwenden, dass sich von deinem normalen Administrator-Kennwort unterscheidet, Dritten nicht bekannt ist und auch nicht auf anderen Internetseiten verwendet wird.]]></item>\r
- </category>\r
- <category name="wcf.acp.menu">\r
- <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatisches Update]]></item>\r
- <item name="wcf.acp.menu.link.content"><![CDATA[Inhalte]]></item>\r
- <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>\r
- <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[Protokoll anzeigen]]></item>\r
- <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[Zeitgesteuerte Aufgaben auflisten]]></item>\r
- <item name="wcf.acp.menu.link.display"><![CDATA[Darstellung]]></item>\r
- <item name="wcf.acp.menu.link.group"><![CDATA[Benutzergruppen]]></item>\r
- <item name="wcf.acp.menu.link.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>\r
- <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-Mail an Gruppenmitglieder]]></item>\r
- <item name="wcf.acp.menu.link.group.view"><![CDATA[Benutzergruppen auflisten]]></item>\r
- <item name="wcf.acp.menu.link.log"><![CDATA[Protokoll]]></item>\r
- <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>\r
- <item name="wcf.acp.menu.link.log.session"><![CDATA[Sitzungen]]></item>\r
- <item name="wcf.acp.menu.link.maintenance"><![CDATA[Wartung]]></item>\r
- <item name="wcf.acp.menu.link.option"><![CDATA[Optionen]]></item>\r
- <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Sichern & Wiederherstellen]]></item>\r
- <item name="wcf.acp.menu.link.package"><![CDATA[Paketverwaltung]]></item>\r
- <item name="wcf.acp.menu.link.package.database"><![CDATA[Pakete suchen]]></item>\r
- <item name="wcf.acp.menu.link.package.install"><![CDATA[Paket installieren]]></item>\r
- <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Server hinzufügen]]></item>\r
- <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server auflisten]]></item>\r
- <item name="wcf.acp.menu.link.package.view"><![CDATA[Pakete auflisten]]></item>\r
- <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>\r
- <item name="wcf.acp.menu.link.user"><![CDATA[Benutzer]]></item>\r
- <item name="wcf.acp.menu.link.user.add"><![CDATA[Benutzer hinzufügen]]></item>\r
- <item name="wcf.acp.menu.link.user.list"><![CDATA[Benutzer auflisten]]></item>\r
- <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-Mail an alle Benutzer]]></item>\r
- <item name="wcf.acp.menu.link.user.management"><![CDATA[Benutzer]]></item>\r
- <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>\r
- <item name="wcf.acp.menu.link.user.search"><![CDATA[Benutzer suchen]]></item>\r
- </category>\r
- <category name="wcf.acp.option">\r
- <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Hostname ausschließen]]></item>\r
- <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Gib pro Zeile einen Hostname an, die du von der Seite ausschließen möchtest.]]></item>\r
- <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[IP-Adresse ausschließen]]></item>\r
- <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Gib pro Zeile eine IP-Adresse an, die du von der Seite ausschließen möchtest.]]></item>\r
- <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Browser-Kennung ausschließen]]></item>\r
- <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Gib pro Zeile eine Browser-Kennung (User-Agent) an, die du von der Seite ausschließen möchtest.]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache-Server]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Gib hier die Adresse des Memcache-Servers ein! Mehrere Server können zeilenweise angegeben werden.]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Persistente Verbindungen aktivieren]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[Sollen beim Verbinden mit dem Memcache-Server persistente Verbindungen genutzt werden?]]></item>\r
- <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache-Methode]]></item>\r
- <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>\r
- <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Bitte wähle die gewünschte Cache-Methode aus! Beachte, dass einige Methoden spezielle Anforderungen an das Server-System stellen und nicht auf jedem Server zur Verfügung stehen.]]></item>\r
- <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[Dateisystem (Standard)]]></item>\r
- <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (Experimentell)]]></item>\r
- <item name="wcf.acp.option.category.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>\r
- <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.cache.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>\r
- <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache speichert häufig benötige Daten im Arbeitsspeicher zwischen. Dies kann die Last auf die Datenbank und das Dateisystem drastisch reduzieren. Lies mehr über dieses Thema auf der folgenden Seite:\r
-<ul>\r
- <li><a href="http://memcached.org/">memcached.org</a></li>\r
-</ul>]]></item>\r
- <item name="wcf.acp.option.category.general.date"><![CDATA[Datum & Zeit]]></item>\r
- <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>\r
- <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>\r
- <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>\r
- <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy-Server]]></item>\r
- <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[Hier kannst du optional Proxy-Server für Verbindungen zu externen Servern konfigurieren.]]></item>\r
- <item name="wcf.acp.option.category.general.mail"><![CDATA[E-Mails]]></item>\r
- <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.mail.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Versand]]></item>\r
- <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.offline"><![CDATA[Wartungsmodus]]></item>\r
- <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module"><![CDATA[Module an / aus]]></item>\r
- <item name="wcf.acp.option.category.module.content"><![CDATA[Inhalte]]></item>\r
- <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.display"><![CDATA[Darstellung]]></item>\r
- <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>\r
- <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.user"><![CDATA[Benutzer]]></item>\r
- <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security"><![CDATA[Sicherheit]]></item>\r
- <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>\r
- <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internetseiten werden häufig durch andere Programme angegriffen. So gibt es beispielsweise die Möglichkeit, automatisiert hunderte von Benutzerkonten zu erstellen. Um sich davor zu schützen, kannst du an verschiedenen Stellen ein sogenanntes <a href="http://de.wikipedia.org/wiki/Captcha" class="externalURL">Captcha-Bild</a> anzeigen lassen. Unregistrierte Benutzer müssen erst den Code eingeben, der auf diesem Bild steht. Roboter können diesen Code nicht lesen. Beachte, dass Captcha-Bilder von blinden und sehbehinderten Benutzern nicht identifiziert werden können.]]></item>\r
- <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>\r
- <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.censorship"><![CDATA[Zensur]]></item>\r
- <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sitzungen]]></item>\r
- <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.user"><![CDATA[Mitglieder]]></item>\r
- <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookiedomain]]></item>\r
- <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Hier kannst Du optional eine Domain angeben, unter der der Cookie laufen soll. Standardmäßig solltest Du dieses Feld frei lassen, da ein Ausfüllen nur in wenigen Fällen notwendig ist.]]></item>\r
- <item name="wcf.acp.option.cookie_path"><![CDATA[Cookiepfad]]></item>\r
- <item name="wcf.acp.option.cookie_path.description"><![CDATA[Der Cookiepfad wird absolut zum Document Root angegeben - also z.B. "/forum" für http://www.woltlab.de/forum.]]></item>\r
- <item name="wcf.acp.option.cookie_prefix"><![CDATA[Präfix für Cookienamen]]></item>\r
- <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Gib einen Präfix an, der bei Cookienamen verwendet wird.]]></item>\r
- <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Uhr automatisch auf Sommer-/Winterzeit umstellen]]></item>\r
- <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Soll die Uhr automatisch auf Sommer-/Winterzeit umgestellt werden?]]></item>\r
- <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Cache-Methode für Sitzungsdaten verwenden]]></item>\r
- <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Soll für die Speicherung der Sitzungsdaten die ausgewählte Cache-Methode verwendet werden?]]></item>\r
- <item name="wcf.acp.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>\r
- <item name="wcf.acp.option.export"><![CDATA[Optionen sichern]]></item>\r
- <item name="wcf.acp.option.export.download"><![CDATA[Sicherung der Optionen herunterladen]]></item>\r
- <item name="wcf.acp.option.export.download.description"><![CDATA[Lade eine Sicherung der Optionen auf deinen lokalen Rechner herunter.]]></item>\r
- <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Gzip-Komprimierung aktivieren]]></item>\r
- <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Durch Aktivierung dieser Option werden die Inhalte komprimiert vom Server an den Client gesendet. Dies reduziert den Traffic.]]></item>\r
- <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Seitencaching im Client-Browser verhindern]]></item>\r
- <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Durch Aktivierung dieser Option kannst du das Caching der Seite im Browser verhindern.]]></item>\r
- <item name="wcf.acp.option.http_gzip_level"><![CDATA[Gzip-Komprimierungslevel]]></item>\r
- <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[Werte von 1-9 sind zulässig. Als Optimum zwischen Komprimierung und Serverlast empfiehlt sich Level 1.]]></item>\r
- <item name="wcf.acp.option.import"><![CDATA[Optionen wiederherstellen]]></item>\r
- <item name="wcf.acp.option.import.error.importFailed"><![CDATA[Die Optionen konnten nicht erfolgreich importiert werden.]]></item>\r
- <item name="wcf.acp.option.import.success"><![CDATA[Die Optionen wurden erfolgreich importiert.]]></item>\r
- <item name="wcf.acp.option.import.upload"><![CDATA[Sicherung der Optionen vom lokalen Computer hochladen]]></item>\r
- <item name="wcf.acp.option.import.upload.description"><![CDATA[Gib eine Sicherung der Optionen von Ihrem lokalen Rechner an.]]></item>\r
- <item name="wcf.acp.option.importAndExport"><![CDATA[Optionen sichern & wiederherstellen]]></item>\r
- <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator-Adresse]]></item>\r
- <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Gib die E-Mail-Adresse des Administrators an.]]></item>\r
- <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Logfile-Pfad]]></item>\r
- <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Gib den Pfad zum Logfile an.]]></item>\r
- <item name="wcf.acp.option.mail_from_address"><![CDATA[Absender-Adresse]]></item>\r
- <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Gib die Absender-Adresse bei automatisch generierten E-Mails an.]]></item>\r
- <item name="wcf.acp.option.mail_from_name"><![CDATA[Absender-Name]]></item>\r
- <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Gib den Namen des Absenders bei automatisch generierten E-Mails an.]]></item>\r
- <item name="wcf.acp.option.mail_send_method"><![CDATA[Versandmethode]]></item>\r
- <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>\r
- <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Wähle eine Versandmethode aus.]]></item>\r
- <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>\r
- <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>\r
- <item name="wcf.acp.option.mail_signature"><![CDATA[Signatur]]></item>\r
- <item name="wcf.acp.option.mail_signature.description"><![CDATA[Trage hier eine Signatur ein, die bei System-E-Mails angezeigt werden soll.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP-Server]]></item>\r
- <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Trage hier den SMTP-Server ein.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP-Kennwort]]></item>\r
- <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Gib das SMTP-Kennwort an.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP-Port]]></item>\r
- <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Gib den SMTP-Port an.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP-Benutzer]]></item>\r
- <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Gib den SMTP-Benutzer an.]]></item>\r
- <item name="wcf.acp.option.mail_use_f_param"><![CDATA[»-f« Parameter verwenden]]></item>\r
- <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Manche Server benötigen den »-f« Parameter beim Versenden von E-Mails. Falls du Probleme mit dem Versand von E-Mails hast, aktiviere diese Einstellung.]]></item>\r
- <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Formatierte E-Mail-Adressen verwenden]]></item>\r
- <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Absender- und Empfänger-Adressen werden in folgendes Format gebracht: "Name <email@domain.tld>". Diese Funktion wird nicht von allen Mailservern unterstützt und sollte daher bei Problemen abgeschaltet werden.]]></item>\r
- <item name="wcf.acp.option.module_master_password"><![CDATA[Hauptkennwort aktivieren]]></item>\r
- <item name="wcf.acp.option.module_master_password.description"><![CDATA[Aktiviert die zusätzliche Eingabe eines Kennworts beim Aufruf von sicherheitskritischen Bereichen.]]></item>\r
- <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>\r
- <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server für HTTP-Verbindungen]]></item>\r
- <item name="wcf.acp.option.session_timeout"><![CDATA[Gültigkeitslänge einer Sitzung]]></item>\r
- <item name="wcf.acp.option.session_timeout.description"><![CDATA[Gib an, wie lange die Sitzung gültig ist [Sekunden]. ]]></item>\r
- <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[IP-Adresse der Sitzung überprüfen]]></item>\r
- <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[Anzahl der Blöcke der IP-Adresse die beim Auslesen der Sitzung überprüft werden sollen. Eine hohe Einstellung kann Benutzer ausschließen, die mit wechselnden IP-Adressen im Internet unterwegs sind.]]></item>\r
- <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Browser-Kennung der Sitzung überprüfen]]></item>\r
- <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Soll die Browser-Kennung beim Auslesen der Sitzung überprüft werden?]]></item>\r
- <item name="wcf.acp.option.success"><![CDATA[Deine Einstellungsänderungen wurden erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.option.timezone"><![CDATA[Zeitzone]]></item>\r
- <item name="wcf.acp.option.timezone.description"><![CDATA[Wähle die Standard Zeitzone deiner Seite.]]></item>\r
- <item name="wcf.acp.option.user_online_timeout"><![CDATA[Timeout für Benutzer-Online]]></item>\r
- <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Gib an, wie lange der Benutzer trotz Inaktivität als online markiert werden soll [Sekunden].]]></item>\r
- <item name="wcf.acp.option.category.general.page"><![CDATA[Seite]]></item>\r
- <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.meta_description"><![CDATA[Meta Description]]></item>\r
- <item name="wcf.acp.option.meta_description.description"><![CDATA[Gib eine Meta Description an.]]></item>\r
- <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta Keywords]]></item>\r
- <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Trage die Wörter ein, die im Meta-Tag Keywords stehen sollen.]]></item>\r
- <item name="wcf.acp.option.page_description"><![CDATA[Seitenbeschreibung]]></item>\r
- <item name="wcf.acp.option.page_description.description"><![CDATA[Füge hier eine kurze Beschreibung deiner Seite ein.]]></item>\r
- <item name="wcf.acp.option.page_title"><![CDATA[Titel der Seite]]></item>\r
- <item name="wcf.acp.option.page_title.description"><![CDATA[Gib hier den Globalen Titel der Seite an. Dieser Titel wird im Seitenkopf dargestellt, wenn du die Anzeige dieses Textes im Stileditor aktiviert hast.]]></item>\r
- <item name="wcf.acp.option.page_url"><![CDATA[Adresse (URL) der Seite]]></item>\r
- <item name="wcf.acp.option.page_url.description"><![CDATA[Gib an, unter welcher Adresse (URL) die Seite aufzurufen ist (ohne abschließenden Slash).]]></item>\r
- <item name="wcf.acp.option.page_urls"><![CDATA[Weitere URLs]]></item>\r
- <item name="wcf.acp.option.page_urls.description"><![CDATA[Gib hier weitere URLs an, unter denen deine Seite erreichbar ist.]]></item>\r
- </category>\r
- <category name="wcf.acp.package">\r
- <item name="wcf.acp.package.cancel"><![CDATA[Abbruch der Paketinstallation]]></item>\r
- <item name="wcf.acp.package.description"><![CDATA[Beschreibung]]></item>\r
- <item name="wcf.acp.package.install"><![CDATA[Paketinstallation]]></item>\r
- <item name="wcf.acp.package.install.cancel"><![CDATA[Installation abbrechen]]></item>\r
- <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Willst du die Installation wirklich abbrechen?]]></item>\r
- <item name="wcf.acp.package.install.error"><![CDATA[Die Abhängigkeiten dieses Paketes konnten nicht aufgelöst werden.]]></item>\r
- <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[Die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket »{$packageName}« in Version {$packageVersion} kann aufgrund von Inkompatibilitäten zu {if $excludedPackages|count == 1}folgendem Paket{else}folgenden Paketen{/if} nicht durchgeführt werden:]]></item>\r
- <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in Version {$excludedPackage.packageVersion}]]></item>\r
- <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket lässt{else}Folgende Pakete lassen{/if} die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket »{$packageName}« in Version {$packageVersion} aufgrund von Inkompatibilitäten nicht zu:]]></item>\r
- <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in Version {$excludingPackage.packageVersion}]]></item>\r
- <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket ist{else}Folgende Pakete sind{/if} mit dem Paket »{$packageName}« in Version {$packageVersion} nicht kompatibel. Wenn du die Installation fortführst, {if $excludingPackages|count == 1}wird das Paket{else}werden die Pakete{/if} vermutlich nicht mehr korrekt funktionieren.]]></item>\r
- <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}ist bereits installiert{else}{if $package.file|isset}liegt dem Paket bei{else}fehlt{/if}{/if})</span>]]></item>\r
- <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Willst du die Paketinstallation wirklich abbrechen?]]></item>\r
- <item name="wcf.acp.package.install.updatableInstances"><![CDATA[Folgende Pakete können mit diesem Paket aktualisiert werden]]></item>\r
- <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Wähle eines der folgenden Pakete aus, um seine Version zu aktualisieren. Falls du das Paket neu installieren möchtest, klick unten auf »Weiter«.]]></item>\r
- <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[Es ist bereits eine Kopie dieses Paketes installiert. Wenn du fortfährst, wird eine weitere Kopie dieses Paketes installiert. Falls du eine vorhandene Kopie dieses Paketes aktualisieren möchtest, wähle die Kopie aus der folgenden Liste aus.]]></item>\r
- <item name="wcf.acp.package.install.version"><![CDATA[Version des Paketes:]]></item>\r
- <item name="wcf.acp.package.installDate"><![CDATA[Installationsdatum]]></item>\r
- <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[Beim Versuch die Dateien des Paketes zu entpacken, ist folgender Fehler aufgetreten:]]></item>\r
- <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[Folgende Dateien konnten nicht erfolgreich entpackt werden. Bitte überprüfe, ob der entsprechende Zielort beschreibbar ist.]]></item>\r
- <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Tabellen Konflikt]]></item>\r
- <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Keine Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>\r
- <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Alle Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>\r
- <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Notwendige Änderungen]]></item>\r
- <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Betroffene Tabelle]]></item>\r
- <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Vorhandene Tabellen deiner Datenbank stehen im Konflikt mit Tabellen, die für dieses Paket installiert werden müssen. Wähle aus, ob diese Tabellen überschrieben werden sollen.]]></item>\r
- <item name="wcf.acp.package.list"><![CDATA[Installierte Pakete]]></item>\r
- <item name="wcf.acp.package.list.author"><![CDATA[Hersteller]]></item>\r
- <item name="wcf.acp.package.list.count"><![CDATA[Insgesamt sind {#$items} Pakete installiert.]]></item>\r
- <item name="wcf.acp.package.list.date"><![CDATA[Herstellungsdatum]]></item>\r
- <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>\r
- <item name="wcf.acp.package.list.other"><![CDATA[Sonstiges Paket]]></item>\r
- <item name="wcf.acp.package.list.plugin"><![CDATA[Zusatzmodul]]></item>\r
- <item name="wcf.acp.package.list.standalone"><![CDATA[Endanwendung]]></item>\r
- <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>\r
- <item name="wcf.acp.package.optionals"><![CDATA[Optionale Zusatzpakete installieren]]></item>\r
- <item name="wcf.acp.package.optionals.description"><![CDATA[Das aktuelle Paket bringt folgende optionale Zusatzpakete mit. Wähle aus, welche Zusatzpakete du installieren möchtest.]]></item>\r
- <item name="wcf.acp.package.optionals.installed"><![CDATA[ (Dieses Paket ist bereits installiert.)]]></item>\r
- <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (Die Voraussetzungen für dieses Paket werden nicht erfüllt.)]]></item>\r
- <item name="wcf.acp.package.packageDir"><![CDATA[Installationsverzeichnis]]></item>\r
- <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Es ist bereits eine andere Anwendung in dem angegebenen Verzeichnis installiert.]]></item>\r
- <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>\r
- <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[Das angegebene Verzeichnis ist nicht beschreibbar.]]></item>\r
- <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[Das angegebene Verzeichnis wird bereits von WoltLab Community Framework beansprucht. Wähle ein anderes Verzeichnis.]]></item>\r
- <item name="wcf.acp.package.packageDir.input"><![CDATA[Gib hier das Installationsverzeichnis an.]]></item>\r
- <item name="wcf.acp.package.packageDir.url"><![CDATA[Nach der Installation in das angegebene Installationsverzeichnis ist die Anwendung über folgende Adresse (URL) erreichbar:]]></item>\r
- <item name="wcf.acp.package.requirements"><![CDATA[Abhängigkeiten auswählen]]></item>\r
- <item name="wcf.acp.package.requirements.description"><![CDATA[Das aktuelle Paket benötigt Pakete, von denen mehrere Instanzen installiert sind. Bitte wähle aus, zu welcher Instanz jeweils eine Abhängigkeit hergestellt werden soll.]]></item>\r
- <item name="wcf.acp.package.rollback"><![CDATA[Paketinstallation zurücksetzen]]></item>\r
- <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright © {$packageAuthor}]]></item>\r
- <item name="wcf.acp.package.startInstall"><![CDATA[Neues Paket installieren]]></item>\r
- <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[Das angegebene Paket lässt keine Neuinstallation zu.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[Das angegebene Archiv ist kein gültiges Paket.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[Paket »{$package->getName()}« kann mit dem angegebenen Archiv nicht aktualisiert werden.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[Es konnte keine Datei unter dem angegebenen Pfad gefunden wurden.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[Dieses Paket ist bereits installiert. Das Paket kann nicht mehrfach installiert werden.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[Das Hochladen der ausgewählten Datei ist fehlgeschlagen.]]></item>\r
- <item name="wcf.acp.package.startInstall.source"><![CDATA[Quelle auswählen]]></item>\r
- <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Direkten Pfad zum Paket angeben]]></item>\r
- <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Gib den direkten Pfad zur Paketdatei an. Dabei kann es sich um die Internet Adresse der Paketdatei oder alternativ den Pfad zur Paketdatei im Dateisystem handeln.]]></item>\r
- <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Paket vom lokalen Computer hochladen]]></item>\r
- <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Gib eine Paketdatei von deinem lokalen Rechner an.]]></item>\r
- <item name="wcf.acp.package.startUpdate"><![CDATA[Paket »{$package->getName()}« aktualisieren]]></item>\r
- <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>\r
- <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>\r
- <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation abgeschlossen]]></item>\r
- <item name="wcf.acp.package.step.install.optionals"><![CDATA[Optionale Pakete werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.package"><![CDATA[Paket wird registriert ...]]></item>\r
- <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>\r
- <item name="wcf.acp.package.step.install.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
- <item name="wcf.acp.package.step.title"><![CDATA[Paket <b>{$packageName|encodeJS}</b>: ]]></item>\r
- <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Dateien werden gelöscht ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Deinstallation abgeschlossen]]></item>\r
- <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Optionale Pakete werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
- <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>\r
- <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>\r
- <item name="wcf.acp.package.step.update.finish"><![CDATA[Paketaktualisierung abgeschlossen]]></item>\r
- <item name="wcf.acp.package.step.update.optionals"><![CDATA[Optionale Pakete werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.package"><![CDATA[Paket wird aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>\r
- <item name="wcf.acp.package.step.update.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
- <item name="wcf.acp.package.templatePatch.install.failed"><![CDATA[Das Anwenden eines Patches, der zu diesem Paket gehört, ist fehlgeschlagen, da dieser Patch nicht kompatibel zu seiner Zieldatei ist. Das Paket kann deshalb nicht installiert werden. Klick auf »Installation abbrechen«.]]></item>\r
- <item name="wcf.acp.package.templatePatch.repatch.failed"><![CDATA[Das erneute Patchen folgender Templates scheiterte:<br />{foreach from=$failures item=$failure}{$failure.templateName} (ursprünglich gepatcht von: {$failure.packageName})<br />{/foreach}Wahrscheinlich wird deshalb das Paket, das den jeweiligen Patch ursprünglich angewendet hatte, nicht mehr funktionieren. Du solltest dieses Update dennoch fortsetzen. Klick dazu auf »Weiter«.]]></item>\r
- <item name="wcf.acp.package.templatePatch.uninstall.failed"><![CDATA[Das Entfernen eines Patches, der zu diesem Paket gehört, ist fehlgeschlagen, da seine Zieldatei anderweitig verändert worden ist. Das Paket kann deshalb nicht entfernt werden. Klick auf »Abbruch der Paketdeinstallation«.]]></item>\r
- <item name="wcf.acp.package.uninstall"><![CDATA[Paketdeinstallation]]></item>\r
- <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Abbruch der Paketdeinstallation]]></item>\r
- <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[Die Deinstallation des Paketes ist nicht möglich, da mindestens ein abhängiges Paket nicht deinstalliert werden kann.]]></item>\r
- <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Diese{if $dependentPackages|count == 1}s Paket wird{else} Pakete werden{/if}, nach deiner Bestätigung, ohne weitere Sicherheitsabfrage deinstalliert.]]></item>\r
- <item name="wcf.acp.package.update"><![CDATA[Paketaktualisierung]]></item>\r
- <item name="wcf.acp.package.updateDate"><![CDATA[Aktualisierungsdatum]]></item>\r
- <item name="wcf.acp.package.view.author"><![CDATA[Hersteller:]]></item>\r
- <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Zur Administrationsoberfläche wechseln]]></item>\r
- <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Paket deinstallieren]]></item>\r
- <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Alle Pakete deinstallieren]]></item>\r
- <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Willst du dieses Paket wirklich deinstallieren?]]></item>\r
- <item name="wcf.acp.package.view.button.update"><![CDATA[Paket aktualisieren]]></item>\r
- <item name="wcf.acp.package.view.date"><![CDATA[Herstellungsdatum:]]></item>\r
- <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Abhängige Pakete]]></item>\r
- <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[Dieses Paket wird von {#$dependentPackages|count} {if $dependentPackages|count == 1}anderen Paket{else}anderen Paketen{/if} benötigt.]]></item>\r
- <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}Dieses Paket wird von 1 anderen Paket benötigt{else}{#$dependentPackages|count} Pakete sind direkt oder indirekt von diesem Paket abhängig{/if}.]]></item>\r
- <item name="wcf.acp.package.view.dir"><![CDATA[Installationsverzeichnis:]]></item>\r
- <item name="wcf.acp.package.view.identifier"><![CDATA[Bezeichner:]]></item>\r
- <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installierte Instanz:]]></item>\r
- <item name="wcf.acp.package.view.parent"><![CDATA[Übergeordnetes Paket:]]></item>\r
- <item name="wcf.acp.package.view.properties"><![CDATA[Eigenschaften]]></item>\r
- <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Benötigte Pakete]]></item>\r
- <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[Dieses Paket benötigt {#$requiredPackages|count} {if $requiredPackages|count == 1}anderes Paket{else}andere Pakete{/if}.]]></item>\r
- <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>\r
- <item name="wcf.acp.package.view.version"><![CDATA[Installierte Version:]]></item>\r
- </category>\r
- <category name="wcf.acp.packageUpdate">\r
- <item name="wcf.acp.packageUpdate"><![CDATA[Pakete aktualisieren]]></item>\r
- <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentifizierung mit Update-Server]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Verbindungs-Daten]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Benutzername und Kennwort wurden nicht akzeptiert.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Kennwort]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Gib ein Kennwort an, das zur Authentifizierung benötigt wird.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Benutzername]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Gib einen Benutzernamen an, der zur Authentifizierung benötigt wird.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[Benutzeranmeldung]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server-Meldung]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server-Name]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Benutzerdaten dauerhaft speichern]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[Speichert die eingegebenen Benutzerdaten dauerhaft, sodass du die Daten zu einem späteren Zeitpunkt nicht erneut eingeben musst.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Adresse]]></item>\r
- <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installierte Version]]></item>\r
- <item name="wcf.acp.packageUpdate.error"><![CDATA[Es ist folgender Fehler aufgetreten: ]]></item>\r
- <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[Das Herunterladen des Paketes {$package} ist fehlgeschlagen.]]></item>\r
- <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[Beim Versuch die Paketliste herunterzuladen, ist ein Fehler aufgetreten.]]></item>\r
- <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[Es {if $excludedPackages|count == 1}ist folgender Konflikt{else}sind folgende Konflikte{/if} aufgetreten:]]></item>\r
- <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[Das installierte Paket »{$excludedPackage.existingPackageName}« ist mit dem Paket »{$excludedPackage.packageName}« in Version {$excludedPackage.packageVersion} nicht kompatibel.]]></item>\r
- <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[Das Paket »{$excludedPackage.packageName}« in Version {$excludedPackage.packageVersion} ist mit dem installierten Paket »{$excludedPackage.existingPackageName}« nicht kompatibel.]]></item>\r
- <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} wird installiert]]></item>\r
- <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[Derzeit sind keine Updates verfügbar.]]></item>\r
- <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[Du hast kein Update ausgewählt.]]></item>\r
- <item name="wcf.acp.packageUpdate.options"><![CDATA[Optionen]]></item>\r
- <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[Das Paket ist bereits installiert und kann kein weiteres Mal installiert werden.]]></item>\r
- <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Paket installieren]]></item>\r
- <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Weitere Paket-Instanz installieren (Paket ist bereits {#$package.instances} mal installiert)]]></item>\r
- <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Installiertes Paket {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} Version {$updatableInstance.packageVersion} aktualisieren]]></item>\r
- <item name="wcf.acp.packageUpdate.search"><![CDATA[Pakete suchen]]></item>\r
- <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Autor]]></item>\r
- <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Suche nach ...]]></item>\r
- <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Bereits installierte einzigartige Pakete ausblenden]]></item>\r
- <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Paketname]]></item>\r
- <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Paketname und -beschreibung durchsuchen]]></item>\r
- <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update-Server]]></item>\r
- <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Alle Update-Server durchsuchen]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Art des Paketes]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Sonstige Pakete]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Zusatzmodul für bereits installierte Pakete]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Endanwendung]]></item>\r
- <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Alle Pakete auswählen]]></item>\r
- <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} wird aktualisiert auf {$package.toVersion}]]></item>\r
- <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[Neue Version]]></item>\r
- <item name="wcf.acp.packageUpdate.updates"><![CDATA[Folgende Paket-Aktualisierungen/-Installationen werden durchgeführt:]]></item>\r
- </category>\r
- <category name="wcf.acp.sessionLog">\r
- <item name="wcf.acp.sessionLog.access.view"><![CDATA[Aktionen der protokollierten Sitzung von »{$sessionLog->username}«]]></item>\r
- <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[Insgesamt {#$items} protokollierte Aktion{if $items != 1}en{/if}]]></item>\r
- <item name="wcf.acp.sessionLog.accesses"><![CDATA[Aktionen]]></item>\r
- <item name="wcf.acp.sessionLog.className"><![CDATA[Klasse]]></item>\r
- <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP-Adresse]]></item>\r
- <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Letzte Aktion]]></item>\r
- <item name="wcf.acp.sessionLog.packageName"><![CDATA[Paket]]></item>\r
- <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Methode]]></item>\r
- <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>\r
- <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.sessionLog.time"><![CDATA[Datum]]></item>\r
- <item name="wcf.acp.sessionLog.userAgent"><![CDATA[Browser-Kennung]]></item>\r
- <item name="wcf.acp.sessionLog.view"><![CDATA[Protokollierte Sitzungen]]></item>\r
- <item name="wcf.acp.sessionLog.view.count"><![CDATA[Insgesamt {#$items} protokollierte Sitzung{if $items != 1}en{/if}]]></item>\r
- </category>\r
- <category name="wcf.acp.updateServer">\r
- <item name="wcf.acp.updateServer.add"><![CDATA[Server hinzufügen]]></item>\r
- <item name="wcf.acp.updateServer.add.success"><![CDATA[Der Server wurde erfolgreich angelegt.]]></item>\r
- <item name="wcf.acp.updateServer.data"><![CDATA[Server-Daten]]></item>\r
- <item name="wcf.acp.updateServer.delete"><![CDATA[Server löschen]]></item>\r
- <item name="wcf.acp.updateServer.delete.success"><![CDATA[Der Server wurde erfolgreich gelöscht.]]></item>\r
- <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Willst du den Server wirklich löschen?]]></item>\r
- <item name="wcf.acp.updateServer.disable"><![CDATA[Deaktivieren]]></item>\r
- <item name="wcf.acp.updateServer.edit"><![CDATA[Server bearbeiten]]></item>\r
- <item name="wcf.acp.updateServer.edit.success"><![CDATA[Ihre Änderungen wurden erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.updateServer.enable"><![CDATA[Aktivieren]]></item>\r
- <item name="wcf.acp.updateServer.errorText"><![CDATA[Fehlermeldungen]]></item>\r
- <item name="wcf.acp.updateServer.htPassword"><![CDATA[Kennwort]]></item>\r
- <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Gib ein Kennwort an, das zur Authentifizierung benötigt wird (optional).]]></item>\r
- <item name="wcf.acp.updateServer.htUsername"><![CDATA[Benutzername]]></item>\r
- <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Gib einen Benutzernamen an, der zur Authentifizierung benötigt wird (optional).]]></item>\r
- <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[Beim letzten Verbindungsversuch trat folgende Fehlermeldungen auf:]]></item>\r
- <item name="wcf.acp.updateServer.list.available"><![CDATA[Insgesamt {#$items} Server eingetragen]]></item>\r
- <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server-ID]]></item>\r
- <item name="wcf.acp.updateServer.packages"><![CDATA[Pakete]]></item>\r
- <item name="wcf.acp.updateServer.server"><![CDATA[Adresse]]></item>\r
- <item name="wcf.acp.updateServer.server.description"><![CDATA[Gib die Adresse (URL) zu einem Paketserver an.]]></item>\r
- <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[Die eingetragene Adresse ist ungültig.]]></item>\r
- <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>\r
- <item name="wcf.acp.updateServer.timestamp"><![CDATA[Letzter Zugriff]]></item>\r
- <item name="wcf.acp.updateServer.view"><![CDATA[Verfügbare Update-Server]]></item>\r
- <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[Es sind keine Update-Server eingetragen.]]></item>\r
- </category>\r
- <category name="wcf.acp.user">\r
- <item name="wcf.acp.user.add"><![CDATA[Benutzer hinzufügen]]></item>\r
- <item name="wcf.acp.user.add.data"><![CDATA[Benutzerdaten]]></item>\r
- <item name="wcf.acp.user.add.success"><![CDATA[Der neue Benutzer wurde erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.user.assignToGroup"><![CDATA[Benutzergruppe zuweisen]]></item>\r
- <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Folgende Benutzer den unten ausgewählten Benutzergruppen zuweisen]]></item>\r
- <item name="wcf.acp.user.assignToGroup.success"><![CDATA[Die Zuweisung wurde erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.user.button.assignGroup"><![CDATA[Benutzergruppe zuweisen]]></item>\r
- <item name="wcf.acp.user.button.exportMail"><![CDATA[E-Mail-Adressen exportieren]]></item>\r
- <item name="wcf.acp.user.button.sendMail"><![CDATA[E-Mail senden]]></item>\r
- <item name="wcf.acp.user.delete"><![CDATA[Benutzer löschen]]></item>\r
- <item name="wcf.acp.user.delete.error"><![CDATA[Es konnte kein Benutzer gelöscht werden.]]></item>\r
- <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}Der Benutzer wurde{else}{#$deletedUsers} Benutzer wurden{/if} erfolgreich gelöscht.]]></item>\r
- <item name="wcf.acp.user.delete.sure"><![CDATA[Willst du diesen Benutzer wirklich löschen?]]></item>\r
- <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Willst du die markierten Benutzer wirklich löschen?]]></item>\r
- <item name="wcf.acp.user.edit"><![CDATA[Benutzer bearbeiten]]></item>\r
- <item name="wcf.acp.user.edit.success"><![CDATA[Die Änderungen an diesem Benutzer wurden erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[Du bearbeitest dein eigenes Benutzerkonto. Änderungen an den Mitgliedschaften in Benutzergruppen können womöglich dazu führen, dass du aus der Administrationsoberfläche ausgeschlossen wirst. Sei bitte entsprechend vorsichtig!]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress"><![CDATA[E-Mail-Adressen exportieren]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Exportformat]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Exporteinstellungen]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[E-Mail-Adressen von folgenden Benutzern exportieren]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Trennzeichen]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Texttrenner]]></item>\r
- <item name="wcf.acp.user.groups"><![CDATA[Benutzergruppe(n)]]></item>\r
- <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Finde Benutzer, die in den ausgewählten Benutzergruppen nicht Mitglied sind.]]></item>\r
- <item name="wcf.acp.user.list"><![CDATA[Benutzer]]></item>\r
- <item name="wcf.acp.user.list.all"><![CDATA[Alle Benutzer]]></item>\r
- <item name="wcf.acp.user.list.count"><![CDATA[Insgesamt {#$items} Benutzer]]></item>\r
- <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "Einen Benutzer markiert" : this.count+" Benutzer markiert"]]></item>\r
- <item name="wcf.acp.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>\r
- <item name="wcf.acp.user.massProcessing.action"><![CDATA[Aktion]]></item>\r
- <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Bedingungen]]></item>\r
- <item name="wcf.acp.user.massProcessing.success"><![CDATA[Die gewählte Aktion wurde erfolgreich auf {#$affectedUsers} Benutzer ausgeführt.]]></item>\r
- <item name="wcf.acp.user.massProcessing.warning"><![CDATA[Die Massenverarbeitung von Benutzern führt die unten ausgewählte Aktion <b>ohne zusätzliche Sicherheitsabfrage</b> auf alle Benutzer aus, die unter die eingestellten Bedingungen fallen. Die Bearbeitungen können unter Umständen sehr rechenintensiv werden und sollten deshalb möglichst nur dann ausgeführt werden, wenn sich die Seite im Wartungsmodus befindet! Die Veränderungen können nicht rückgängig gemacht werden. Bitte benutze diese Funktion mit der nötigen Vorsicht!]]></item>\r
- <item name="wcf.acp.user.search"><![CDATA[Benutzer suchen]]></item>\r
- <item name="wcf.acp.user.search.conditions"><![CDATA[Kriterien der Suche]]></item>\r
- <item name="wcf.acp.user.search.conditions.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profil]]></item>\r
- <item name="wcf.acp.user.search.display"><![CDATA[Darstellung]]></item>\r
- <item name="wcf.acp.user.search.display.columns"><![CDATA[Angezeigte Informationen]]></item>\r
- <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Sonstiges]]></item>\r
- <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profil]]></item>\r
- <item name="wcf.acp.user.search.display.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Benutzer pro Seite]]></item>\r
- <item name="wcf.acp.user.search.display.sort"><![CDATA[Sortierung]]></item>\r
- <item name="wcf.acp.user.search.error.noMatches"><![CDATA[Zu den angegebenen Kriterien wurde kein Benutzer gefunden.]]></item>\r
- <item name="wcf.acp.user.search.matches"><![CDATA[{if $items == 1}Ein Ergebnis{else}{#$items} Ergebnisse{/if}]]></item>\r
- <item name="wcf.acp.user.search.withinResults"><![CDATA[In den Ergebnissen suchen]]></item>\r
- <item name="wcf.acp.user.sendMail"><![CDATA[E-Mail an Benutzer senden]]></item>\r
- <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail an alle Benutzer]]></item>\r
- <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[E-Mail als HTML verschicken]]></item>\r
- <item name="wcf.acp.user.sendMail.from"><![CDATA[Absender]]></item>\r
- <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Hier kannst du die E-Mail-Adresse des Absenders definieren.{if MAIL_USE_FORMATTED_ADDRESS} Es ist auch folgendes Format möglich:{/if}</p>\r
-{if MAIL_USE_FORMATTED_ADDRESS}<p style="text-align: center; line-height: 2em;"><code>Absender Name <email@absender.tld></code></p>{/if}\r
-<p>Wenn du unter System -> Optionen -> E-Mail alles ausgefüllt hast, wird dieses Feld automatisch ausgefüllt. Solltest du E-Mails per SMTP senden, so achte darauf, dass die E-Mail-Adresse des Absenders auch vom Server akzeptiert werden muss.</p>]]></item>\r
- <item name="wcf.acp.user.sendMail.group"><![CDATA[E-Mail an Gruppenmitglieder]]></item>\r
- <item name="wcf.acp.user.sendMail.groups"><![CDATA[E-Mail an die Mitglieder folgender Benutzergruppen senden]]></item>\r
- <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-Mail]]></item>\r
- <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[E-Mail an folgende Benutzer senden]]></item>\r
- <item name="wcf.acp.user.sendMail.subject"><![CDATA[Betreff]]></item>\r
- <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Gib hier die Betreffzeile der E-Mail an.]]></item>\r
- <item name="wcf.acp.user.sendMail.text"><![CDATA[Nachricht]]></item>\r
- <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Trage hier die Nachricht ein, die du den Benutzern senden möchtest.]]></item>\r
- <item name="wcf.acp.user.userNote"><![CDATA[Angemeldet als {$this->user->username}.]]></item>\r
- </category>\r
- <category name="wcf.acp.worker">\r
- <item name="wcf.acp.worker.currentStep"><![CDATA[Aktueller Schritt]]></item>\r
- <item name="wcf.acp.worker.description"><![CDATA[Lass dieses Browser-Fenster offen, bis der Prozess abgeschlossen ist und melde dich auf keinen Fall in einem anderen Browser-Fenster separat in der Administrationsoberfläche an, da dies den Prozess behindern könnte.]]></item>\r
- <item name="wcf.acp.worker.progress.finish"><![CDATA[Vorgang erfolgreich abgeschlossen]]></item>\r
- <item name="wcf.acp.worker.progress.working"><![CDATA[Vorgang läuft ...]]></item>\r
- <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>\r
- <item name="wcf.acp.worker.title"><![CDATA[Prozess läuft ...]]></item>\r
- </category>\r
- <category name="wcf.global">\r
- <item name="wcf.global.button.back"><![CDATA[« Zurück]]></item>\r
- <item name="wcf.global.button.close"><![CDATA[Schließen]]></item>\r
- <item name="wcf.global.button.collapse"><![CDATA[Zuklappen]]></item>\r
- <item name="wcf.global.button.collapsible"><![CDATA[Auf- und Zuklappen]]></item>\r
- <item name="wcf.global.button.delete"><![CDATA[Löschen]]></item>\r
- <item name="wcf.global.button.delete.confirm"><![CDATA[Möchtest du das Element wirklich löschen?]]></item>\r
- <item name="wcf.global.button.deleteCompletely"><![CDATA[Endgültig löschen]]></item>\r
- <item name="wcf.global.button.edit"><![CDATA[Bearbeiten]]></item>\r
- <item name="wcf.global.button.editor.jump"><![CDATA[Zum Editor wechseln]]></item>\r
- <item name="wcf.global.button.expand"><![CDATA[Aufklappen]]></item>\r
- <item name="wcf.global.button.mark"><![CDATA[Markieren]]></item>\r
- <item name="wcf.global.button.next"><![CDATA[Weiter »]]></item>\r
- <item name="wcf.global.button.preview"><![CDATA[Vorschau]]></item>\r
- <item name="wcf.global.button.reset"><![CDATA[Zurücksetzen]]></item>\r
- <item name="wcf.global.button.submit"><![CDATA[Absenden]]></item>\r
- <item name="wcf.global.button.unmark"><![CDATA[Demarkieren]]></item>\r
- <item name="wcf.global.date.day"><![CDATA[Tag]]></item>\r
- <item name="wcf.global.date.days"><![CDATA[Tage]]></item>\r
- <item name="wcf.global.date.hour"><![CDATA[Stunde]]></item>\r
- <item name="wcf.global.date.hours"><![CDATA[Stunden]]></item>\r
- <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>\r
- <item name="wcf.global.date.minutes"><![CDATA[Minuten]]></item>\r
- <item name="wcf.global.date.month"><![CDATA[Monat]]></item>\r
- <item name="wcf.global.date.months"><![CDATA[Monate]]></item>\r
- <item name="wcf.global.date.second"><![CDATA[Sekunde]]></item>\r
- <item name="wcf.global.date.seconds"><![CDATA[Sekunden]]></item>\r
- <item name="wcf.global.date.week"><![CDATA[Woche]]></item>\r
- <item name="wcf.global.date.weeks"><![CDATA[Wochen]]></item>\r
- <item name="wcf.global.date.year"><![CDATA[Jahr]]></item>\r
- <item name="wcf.global.date.year.notRequired"><![CDATA[Die Angabe des Jahres ist optional.]]></item>\r
- <item name="wcf.global.date.years"><![CDATA[Jahre]]></item>\r
- <item name="wcf.global.dateFormat"><![CDATA[%d.%m.%Y]]></item>\r
- <item name="wcf.global.dateFormatLocalized"><![CDATA[%e. %B %Y]]></item>\r
- <item name="wcf.global.dateFormatToday"><![CDATA[<b>Heute</b>, %H:%M]]></item>\r
- <item name="wcf.global.dateFormatYesterday"><![CDATA[Gestern, %H:%M]]></item>\r
- <item name="wcf.global.dateInputOrder"><![CDATA[day-month-year]]></item>\r
- <item name="wcf.global.dateMethod"><![CDATA[strftime]]></item>\r
- <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>\r
- <item name="wcf.global.defaultValue"><![CDATA[Standard]]></item>\r
- <item name="wcf.global.error.backward"><![CDATA[Zurück zur vorherigen Seite]]></item>\r
- <item name="wcf.global.error.empty"><![CDATA[Füll dieses Eingabefeld aus.]]></item>\r
- <item name="wcf.global.error.file.notFound"><![CDATA[Die Datei konnte nicht gefunden werden.]]></item>\r
- <item name="wcf.global.error.illegalLink"><![CDATA[Du hast einen ungültigen oder nicht mehr gültigen Link aufgerufen.]]></item>\r
- <item name="wcf.global.error.permissionDenied"><![CDATA[Der Zutritt zu dieser Seite ist dir leider verwehrt. Du besitzt nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.]]></item>\r
- <item name="wcf.global.error.permissionDenied.title"><![CDATA[Zutritt verwehrt]]></item>\r
- <item name="wcf.global.error.title"><![CDATA[Fehlermeldung]]></item>\r
- <item name="wcf.global.form.error"><![CDATA[Deine Angaben sind ungültig. Überprüfe die markierten Eingabefelder.]]></item>\r
- <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>\r
- <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>\r
- <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>\r
- <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>\r
- <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>\r
- <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede »Du«)]]></item>\r
- <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>\r
- <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>\r
- <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>\r
- <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>\r
- <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>\r
- <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>\r
- <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>\r
- <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>\r
- <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>\r
- <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>\r
- <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>\r
- <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>\r
- <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>\r
- <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>\r
- <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>\r
- <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>\r
- <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>\r
- <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>\r
- <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>\r
- <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>\r
- <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>\r
- <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>\r
- <item name="wcf.global.language.th"><![CDATA[Thailändisch]]></item>\r
- <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>\r
- <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
- <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>\r
- <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>\r
- <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>\r
- <item name="wcf.global.multiSelect"><![CDATA[Mehrfache Markierungen sind durch zusätzliches Drücken der Taste »Strg/Ctrl« (Windows) oder »Befehl/Command« (Mac OS) möglich.]]></item>\r
- <item name="wcf.global.page.input"><![CDATA[Zu folgender Seite springen]]></item>\r
- <item name="wcf.global.page.next"><![CDATA[nächste Seite]]></item>\r
- <item name="wcf.global.page.previous"><![CDATA[vorherige Seite]]></item>\r
- <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>\r
- <item name="wcf.global.pageTitle"><![CDATA[WoltLab® Community Framework™]]></item>\r
- <item name="wcf.global.redirect.title"><![CDATA[Weiterleitung]]></item>\r
- <item name="wcf.global.redirect.url"><![CDATA[Falls die automatische Weiterleitung nicht funktioniert, klick hier!]]></item>\r
- <item name="wcf.global.scrollDown"><![CDATA[Zum Seitenende]]></item>\r
- <item name="wcf.global.scrollUp"><![CDATA[Zum Seitenanfang]]></item>\r
- <item name="wcf.global.search.matchesExactly"><![CDATA[Exakter Treffer]]></item>\r
- <item name="wcf.global.shortTimeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>\r
- <item name="wcf.global.shortTimeFormatLocalized"><![CDATA[%e. %B %Y, %H:%M]]></item>\r
- <item name="wcf.global.skipToContent"><![CDATA[Zum Seiteninhalt springen]]></item>\r
- <item name="wcf.global.sortOrder.ascending"><![CDATA[in aufsteigender Reihenfolge]]></item>\r
- <item name="wcf.global.sortOrder.descending"><![CDATA[in absteigender Reihenfolge]]></item>\r
- <item name="wcf.global.thousandsSeparator"><![CDATA[ ]]></item>\r
- <item name="wcf.global.timeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>\r
- <item name="wcf.global.timeFormatLocalized"><![CDATA[%A, %e. %B %Y, %H:%M]]></item>\r
- </category>\r
- <category name="wcf.imageViewer">\r
- <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Bild " + (this.currentIndex + 1) + " von " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>\r
- <item name="wcf.imageViewer.close"><![CDATA[Schließen]]></item>\r
- <item name="wcf.imageViewer.enlarge"><![CDATA[Nur dieses Bild anzeigen (beendet die Bildbetrachtung)]]></item>\r
- <item name="wcf.imageViewer.next"><![CDATA[Nächstes Bild]]></item>\r
- <item name="wcf.imageViewer.pause"><![CDATA[Diashow stoppen]]></item>\r
- <item name="wcf.imageViewer.play"><![CDATA[Diashow starten (Bildwechsel alle 5 Sekunden)]]></item>\r
- <item name="wcf.imageViewer.previous"><![CDATA[Vorheriges Bild]]></item>\r
- </category>\r
- <category name="wcf.option">\r
- <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Kanarische Inseln, Lissabon, London, Monrovia, Ouagadougou, Reykjavík]]></item>\r
- <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brüssel, Kopenhagen, Madrid, Paris, Prag, Rom, Sarajevo, Stockholm, Tunis, Warschau, Wien]]></item>\r
- <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athen, Beirut, Bukarest, Helsinki, Istanbul, Jerusalem, Kairo, Kapstadt, Khartum, Kiew, Minsk, Sofia]]></item>\r
- <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Abeba, Antananarivo, Bagdad, Daressalam, Kampala, Kuwait, Mogadischu, Moskau, Nairobi, Riad]]></item>\r
- <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Teheran]]></item>\r
- <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Eriwan, Maskat, Réunion, Tiflis]]></item>\r
- <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>\r
- <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Asgabat, Bischkek, Duschanbe, Islamabad, Jekaterinburg, Karatschi, Malediven, Taschkent]]></item>\r
- <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, Neu-Delhi]]></item>\r
- <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>\r
- <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Nowosibirsk]]></item>\r
- <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Kokosinseln, Rangun]]></item>\r
- <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnojarsk, Vientiane]]></item>\r
- <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hongkong, Irkutsk, Kuala Lumpur, Manila, Peking, Perth, Singapur, Taipeh, Ulan Bator]]></item>\r
- <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Australien)]]></item>\r
- <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Jakutsk, Osaka, Pjöngjang, Sapporo, Seoul, Tokyo]]></item>\r
- <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>\r
- <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Wladiwostok]]></item>\r
- <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord-Howe-Insel (Australien)]]></item>\r
- <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, Neukaledonien, Salomonen]]></item>\r
- <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolkinsel]]></item>\r
- <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, Bairiki, Fidschi, Kamtschatka, Marshall-Inseln, Wellington]]></item>\r
- <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham-Inseln (Neuseeland)]]></item>\r
- <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenixinseln]]></item>\r
- <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Linieninseln, Weihnachtsinsel]]></item>\r
- <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azoren, Kapverdische Inseln]]></item>\r
- <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>\r
- <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Brasília, Buenos Aires, Cayenne, Georgetown, Grönland, Montevideo]]></item>\r
- <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Neufundland]]></item>\r
- <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Asunción, Atlantik (Kanada), La Paz, Port-of-Spain, Santiago]]></item>\r
- <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>\r
- <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Atlanta, Bogotá, Detroit, Lima, Miami, New York, San Francisco de Quito, Toronto]]></item>\r
- <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Chicago, Dallas, Kansas City, Mexiko-Stadt, Winnipeg, Zentralamerika]]></item>\r
- <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Arizona, Calgary, Chihuahua, Denver, Mazatlan, Salt Lake City]]></item>\r
- <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Los Angeles, Seattle, Tijuana, Vancouver]]></item>\r
- <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>\r
- <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) Französisch-Polynesien]]></item>\r
- <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cookinseln, Hawaii]]></item>\r
- <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midwayinseln, Samoa]]></item>\r
- <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Eniwetok, Kwajalein]]></item>\r
- </category>\r
- <category name="wcf.page">\r
- <item name="wcf.page.pageNo"><![CDATA[Seite {#$pageNo}]]></item>\r
- </category>\r
- <category name="wcf.user">\r
- <item name="wcf.user.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>\r
- <item name="wcf.user.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>\r
- <item name="wcf.user.email"><![CDATA[E-Mail-Adresse]]></item>\r
- <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch.]]></item>\r
- <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>\r
- <item name="wcf.user.error.email.notUnique"><![CDATA[Diese E-Mail-Adresse ist bereits durch einen anderen Benutzer vergeben.]]></item>\r
- <item name="wcf.user.error.email.notValid"><![CDATA[Du hast eine ungültige E-Mail-Adresse eingegeben.]]></item>\r
- <item name="wcf.user.error.password.false"><![CDATA[Dieses Kennwort ist falsch.]]></item>\r
- <item name="wcf.user.error.username.notFound"><![CDATA[Der Benutzername »{$username}« konnte nicht gefunden werden.]]></item>\r
- <item name="wcf.user.error.username.notUnique"><![CDATA[Dieser Benutzername ist bereits vergeben.]]></item>\r
- <item name="wcf.user.error.username.notValid"><![CDATA[Du hast einen ungültigen Benutzernamen eingegeben.]]></item>\r
- <item name="wcf.user.language"><![CDATA[Sprache]]></item>\r
- <item name="wcf.user.language.description"><![CDATA[Wähle aus, in welcher Sprache die Benutzeroberfläche erscheinen soll!]]></item>\r
- <item name="wcf.user.logout"><![CDATA[Abmelden]]></item>\r
- <item name="wcf.user.password"><![CDATA[Kennwort]]></item>\r
- <item name="wcf.user.registrationDate"><![CDATA[Registrierungsdatum]]></item>\r
- <item name="wcf.user.userID"><![CDATA[Benutzer-ID]]></item>\r
- <item name="wcf.user.username"><![CDATA[Benutzername]]></item>\r
- <item name="wcf.user.visibleLanguages"><![CDATA[Zeige Inhalte in folgenden Sprachen an]]></item>\r
- <item name="wcf.user.visibleLanguages.description"><![CDATA[Gib an, in welchen Sprachen erstellte Inhalte angezeigt werden sollen.]]></item>\r
- </category>\r
- <category name="wcf.user.option">\r
- <item name="wcf.user.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>\r
- </category>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de-informal">
+ <category name="wcf.acp">
+ <item name="wcf.acp"><![CDATA[Administrationsoberfläche]]></item>
+ <item name="wcf.acp.help"><![CDATA[Hilfe]]></item>
+ <item name="wcf.acp.help.complete"><![CDATA[Vollständige Hilfe]]></item>
+ <item name="wcf.acp.help.disable"><![CDATA[Hilfe deaktivieren]]></item>
+ <item name="wcf.acp.help.interactive"><![CDATA[Interaktive Hilfe]]></item>
+ <item name="wcf.acp.packageQuickAccess"><![CDATA[Paket wechseln]]></item>
+ <item name="wcf.acp.search.extended"><![CDATA[Erweiterte Suche ...]]></item>
+ <item name="wcf.acp.sitemap"><![CDATA[Sitemap]]></item>
+ </category>
+ <category name="wcf.acp.cache">
+ <item name="wcf.acp.cache.button.clear"><![CDATA[Cache leeren]]></item>
+ <item name="wcf.acp.cache.clear.success"><![CDATA[Der Cache wurde erfolgreich gelöscht.]]></item>
+ <item name="wcf.acp.cache.clear.sure"><![CDATA[Möchtest du den Cache wirklich komplett leeren?]]></item>
+ <item name="wcf.acp.cache.data"><![CDATA[Eigenschaften]]></item>
+ <item name="wcf.acp.cache.data.files"><![CDATA[Dateien]]></item>
+ <item name="wcf.acp.cache.data.size"><![CDATA[Größe]]></item>
+ <item name="wcf.acp.cache.data.source"><![CDATA[Quelle]]></item>
+ <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>
+ <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>
+ <item name="wcf.acp.cache.list.mtime"><![CDATA[Letzte Aktualisierung]]></item>
+ <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>
+ <item name="wcf.acp.cache.list.perm"><![CDATA[Zugriffsrechte]]></item>
+ <item name="wcf.acp.cache.list.size"><![CDATA[Größe]]></item>
+ </category>
+ <category name="wcf.acp.cronjob">
+ <item name="wcf.acp.cronjob.active"><![CDATA[Aktiv]]></item>
+ <item name="wcf.acp.cronjob.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>
+ <item name="wcf.acp.cronjob.add.data"><![CDATA[Allgemeine Daten]]></item>
+ <item name="wcf.acp.cronjob.add.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde hinzugefügt.]]></item>
+ <item name="wcf.acp.cronjob.add.timing"><![CDATA[Zeitsteuerung]]></item>
+ <item name="wcf.acp.cronjob.className"><![CDATA[Pfad zur Klasse]]></item>
+ <item name="wcf.acp.cronjob.className.description"><![CDATA[Gib den Pfad zu der PHP-Datei an, die die entsprechende auszuführende Klasse enthält. Die Pfadangabe muss relativ zum Installationsverzeichnis der ausgewählten Endanwendung sein.]]></item>
+ <item name="wcf.acp.cronjob.cronjobID"><![CDATA[ID]]></item>
+ <item name="wcf.acp.cronjob.delete"><![CDATA[Zeitgesteuerte Aufgabe löschen]]></item>
+ <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht gelöscht werden.]]></item>
+ <item name="wcf.acp.cronjob.delete.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde gelöscht.]]></item>
+ <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Bist du sicher, dass du diese zeitgesteuerte Aufgabe löschen möchtest?]]></item>
+ <item name="wcf.acp.cronjob.description"><![CDATA[Beschreibung]]></item>
+ <item name="wcf.acp.cronjob.description.description"><![CDATA[Hier kannst du eine kurze Beschreibung der Aufgabe eintragen.]]></item>
+ <item name="wcf.acp.cronjob.disable"><![CDATA[Deaktivieren]]></item>
+ <item name="wcf.acp.cronjob.edit"><![CDATA[Zeitgesteuerte Aufgabe bearbeiten]]></item>
+ <item name="wcf.acp.cronjob.edit.data"><![CDATA[Allgemeine Daten]]></item>
+ <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht verändert werden.]]></item>
+ <item name="wcf.acp.cronjob.edit.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde erfolgreich geändert.]]></item>
+ <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Zeitsteuerung]]></item>
+ <item name="wcf.acp.cronjob.enable"><![CDATA[Aktivieren]]></item>
+ <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[Der angegebene Pfad ist ungültig.]]></item>
+ <item name="wcf.acp.cronjob.error.empty"><![CDATA[Bitte füll dieses Eingabefeld aus.]]></item>
+ <item name="wcf.acp.cronjob.error.notValid"><![CDATA[Das Zeitformat ist ungültig.]]></item>
+ <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Zeitgesteuerte Aufgabe mehrfach ausführen]]></item>
+ <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[Durch Aktivieren dieser Option wird die Aufgabe mehrfach ausgeführt, wenn zwischen dem letzten Ausführungszeitpunkt und dem aktuellen Zeitpunkt weitere Ausführungszeitpunkte liegen.]]></item>
+ <item name="wcf.acp.cronjob.execute"><![CDATA[Aufgabe jetzt ausführen]]></item>
+ <item name="wcf.acp.cronjob.execute.success"><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt.]]></item>
+ <item name="wcf.acp.cronjob.inactive"><![CDATA[Inaktiv]]></item>
+ <item name="wcf.acp.cronjob.info"><![CDATA[Allgemeine Informationen]]></item>
+ <item name="wcf.acp.cronjob.intro"><![CDATA[Das Anlegen von zeitgesteuerten Aufgaben erfordert eine genaue Kenntnis der Crontab-Syntax auf unixähnlichen Systemen. Weiterführende Informationen dazu erhältst du auf dieser Website: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>]]></item>
+ <item name="wcf.acp.cronjob.lastExec"><![CDATA[Letzte Ausführung]]></item>
+ <item name="wcf.acp.cronjob.list"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+ <item name="wcf.acp.cronjob.list.count"><![CDATA[Insgesamt {#$items} zeitgesteuerte Aufgabe{if $items != 1}n{/if}]]></item>
+ <item name="wcf.acp.cronjob.log"><![CDATA[Protokoll der ausgeführten zeitgesteuerten Aufgaben]]></item>
+ <item name="wcf.acp.cronjob.log.clear"><![CDATA[Alle löschen]]></item>
+ <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Bist du sicher, dass du alle Protokoll-Einträge löschen möchtest?]]></item>
+ <item name="wcf.acp.cronjob.log.data"><![CDATA[Insgesamt {#$items} {if $items == 1}Eintrag{else}Einträge{/if}]]></item>
+ <item name="wcf.acp.cronjob.log.error"><![CDATA[Fehler:]]></item>
+ <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Ausgeführt]]></item>
+ <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[Derzeit sind keine Einträge vorhanden.]]></item>
+ <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>
+ <item name="wcf.acp.cronjob.nextExec"><![CDATA[Nächste Ausführung]]></item>
+ <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[Derzeit ist keine zeitgesteuerte Aufgabe vorhanden.]]></item>
+ <item name="wcf.acp.cronjob.packageName"><![CDATA[Installiert von]]></item>
+ <item name="wcf.acp.cronjob.runNow"><![CDATA[Jetzt ausführen]]></item>
+ <item name="wcf.acp.cronjob.startDom"><![CDATA[Tag des Monats]]></item>
+ <item name="wcf.acp.cronjob.startDom.description"><![CDATA[An diesen Tagen des Monats (1 - 31) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>
+ <item name="wcf.acp.cronjob.startDow"><![CDATA[Tag der Woche]]></item>
+ <item name="wcf.acp.cronjob.startDow.description"><![CDATA[An diesen Tagen der Woche (0 - 6 mit Sonntag = 0 oder mon - sun) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>
+ <item name="wcf.acp.cronjob.startHour"><![CDATA[Stunde]]></item>
+ <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Zu diesen Stunden (0 - 23) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>
+ <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>
+ <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Zu diesen Minuten (0 - 59) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>
+ <item name="wcf.acp.cronjob.startMonth"><![CDATA[Monat]]></item>
+ <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[In diesen Monaten (1 - 12 oder jan - dec) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>
+ <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>
+ <item name="wcf.acp.cronjob.subtitle"><![CDATA[»Cronjobs«]]></item>
+ </category>
+ <category name="wcf.acp.group">
+ <item name="wcf.acp.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>
+ <item name="wcf.acp.group.add.permissions"><![CDATA[Zugriffsrechte]]></item>
+ <item name="wcf.acp.group.add.success"><![CDATA[Die Benutzergruppe wurde erfolgreich angelegt.]]></item>
+ <item name="wcf.acp.group.administrators"><![CDATA[Administratoren]]></item>
+ <item name="wcf.acp.group.data"><![CDATA[Allgemeine Daten]]></item>
+ <item name="wcf.acp.group.delete"><![CDATA[Benutzergruppe löschen]]></item>
+ <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}Die Benutzergruppe wurde{else}{#$deletedGroups} Benutzergruppen wurden{/if} erfolgreich gelöscht.]]></item>
+ <item name="wcf.acp.group.delete.sure"><![CDATA[Willst du diese Benutzergruppe wirklich löschen?]]></item>
+ <item name="wcf.acp.group.edit"><![CDATA[Benutzergruppe bearbeiten]]></item>
+ <item name="wcf.acp.group.edit.success"><![CDATA[Deine Änderungen an der Benutzergruppe wurde erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[Du bist selbst Mitglied dieser Benutzergruppe. Änderungen an den Zugriffsrechten dieser Benutzergruppe können womöglich dazu führen, dass du aus der Administrationsoberfläche ausgeschlossen wirst. Bitte sei entsprechend vorsichtig!]]></item>
+ <item name="wcf.acp.group.everyone"><![CDATA[Jeder]]></item>
+ <item name="wcf.acp.group.groupID"><![CDATA[Gruppen-ID]]></item>
+ <item name="wcf.acp.group.groupName"><![CDATA[Name der Benutzergruppe]]></item>
+ <item name="wcf.acp.group.groupName.description"><![CDATA[Gib einen Namen der Gruppe an.]]></item>
+ <item name="wcf.acp.group.guests"><![CDATA[Gäste]]></item>
+ <item name="wcf.acp.group.list"><![CDATA[Benutzergruppen]]></item>
+ <item name="wcf.acp.group.list.data"><![CDATA[Insgesamt {#$items} Benutzergruppen]]></item>
+ <item name="wcf.acp.group.members"><![CDATA[Anzahl Mitglieder]]></item>
+ <item name="wcf.acp.group.moderators"><![CDATA[Moderatoren]]></item>
+ <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Kann Administrationsoberfläche betreten]]></item>
+ <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Mitglieder dieser Benutzergruppe können die Administrationsoberfläche betreten und dort abhängig von den weiteren Zugriffsrechten verschiedene Aktionen durchführen. Diese Option muss aktiviert sein, wenn diesen Benutzern andere administrative Funktionen erlaubt werden sollen.]]></item>
+ <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Kann versteckte Profilinformationen sehen]]></item>
+ <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Mitglieder dieser Benutzergruppe können die versteckten Informationen in Benutzerprofilen sehen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Kann allgemeine Einstellungen vornehmen]]></item>
+ <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Mitglieder dieser Benutzergruppe können die allgemeinen System-Einstellungen sehen und bearbeiten. Z.B. Forum ein-/ausschalten.]]></item>
+ <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Kann Protokolle abrufen]]></item>
+ <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können die System-Protokolle abrufen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Kann neue zeitgesteuerte Aufgaben anlegen]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue zeitgesteuerte Aufgaben anlegen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben löschen]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben löschen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Kann Protokoll der zeitgesteuerten Aufgaben löschen]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Protokoll der zeitgesteuerten Aufgaben löschen. Bei der Ausführung einer zeitgesteuerten Aufgabe wird festgehalten, ob dieser erfolgreich ausgeführt wurde.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben ändern]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben deaktivieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben deaktivieren. Diese werden dann nicht mehr ausgeführt, können später jedoch auch wieder aktiviert werden.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Kann Update-Server bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Update-Server bearbeiten und neue hinzufügen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Kann Pakete installieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können zusätzliche Pakete installieren.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Kann Pakete deinstallieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete entfernen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Kann Pakete aktualisieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete aktualisieren.]]></item>
+ <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Zugängliche Benutzergruppen]]></item>
+ <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Mitglieder dieser Benutzergruppe haben auf diese Gruppen Zugriff. Zusätzlich muss angegeben werden, ob z.B. die Benutzergruppe bearbeitet werden darf.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Kann neue Benutzergruppen erstellen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzergruppen erstellen.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Kann neue Benutzer erstellen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzer erstellen. Ist bei "Zugängliche Benutzergruppen" eine Option aktiviert, kann diese Gruppe beim Erstellen des Benutzers zugewiesen werden.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Kann Benutzergruppen löschen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen löschen.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Kann Benutzer löschen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer löschen.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Kann Benutzergruppen bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Kann E-Mail-Adressen bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Kann Kennwörter bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Kennwort von anderen Benutzern bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Kann Benutzer bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Kann E-Mails an Benutzer senden]]></item>
+ <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern sehen und ihnen E-Mails senden.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Kann Benutzer suchen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer und deren Profile durchsuchen.]]></item>
+ <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrative Rechte]]></item>
+ <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Inhalte]]></item>
+ <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Darstellung]]></item>
+ <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.general"><![CDATA[Allgemeine administrative Rechte]]></item>
+ <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Wartung]]></item>
+ <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System-Funktionen]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Paketverwaltung]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.user"><![CDATA[Benutzer-Funktionen]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Gruppenverwaltung]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[Benutzerverwaltung]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderative Rechte]]></item>
+ <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.user"><![CDATA[Allgemeine Rechte]]></item>
+ <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>
+ <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Kann deaktivierte Stile benutzen]]></item>
+ <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Mitglieder dieser Benutzergruppe können deaktivierte Stile auswählen.]]></item>
+ <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Stil-Verwaltung]]></item>
+ <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.showMembers"><![CDATA[Zeige die Mitglieder dieser Benutzergruppe]]></item>
+ <item name="wcf.acp.group.superModerators"><![CDATA[Super Moderatoren]]></item>
+ <item name="wcf.acp.group.users"><![CDATA[Registrierte Benutzer]]></item>
+ </category>
+ <category name="wcf.acp.login">
+ <item name="wcf.acp.login"><![CDATA[Anmeldung]]></item>
+ <item name="wcf.acp.login.data"><![CDATA[Zugangsdaten]]></item>
+ </category>
+ <category name="wcf.acp.masterPassword">
+ <item name="wcf.acp.masterPassword"><![CDATA[Hauptkennwort]]></item>
+ <item name="wcf.acp.masterPassword.confirm"><![CDATA[Hauptkennwort wiederholen]]></item>
+ <item name="wcf.acp.masterPassword.enter"><![CDATA[Hauptkennwort erforderlich]]></item>
+ <item name="wcf.acp.masterPassword.enter.description"><![CDATA[Die aufgerufene Seite oder Aktion erfordert aus Sicherheitsgründen die Eingabe des Hauptkennwortes. Pro Sitzung ist die Eingabe des Hauptkennwortes nur einmal erforderlich. Falls du das Hauptkennwort vergessen haben solltest, kannst du es zurücksetzen, indem du die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschst.]]></item>
+ <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[Das Hauptkennwort ist nicht korrekt. Falls du das Hauptkennwort vergessen haben solltest, kannst du es zurücksetzen, indem du die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschst.]]></item>
+ <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>
+ <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[Das Kennwort wurde als unsicher erkannt. Das Kennwort sollte mindestens acht Zeichen lang sein, große und kleine lateinische Buchstaben, Zahlen und Sonderzeichen enthalten. Es darf nicht mit den Kennwörtern von anderen Administratoren übereinstimmen.]]></item>
+ <item name="wcf.acp.masterPassword.example"><![CDATA[Vorschlag]]></item>
+ <item name="wcf.acp.masterPassword.example.set"><![CDATA[Vorschlag übernehmen]]></item>
+ <item name="wcf.acp.masterPassword.init"><![CDATA[Hauptkennwort festlegen]]></item>
+ <item name="wcf.acp.masterPassword.init.description"><![CDATA[Das Hauptkennwort ist ein zusätzlicher Schutz für sicherheitskritische Funktionen. Du solltest hier ein möglichst sicheres Kennwort verwenden, dass sich von deinem normalen Administrator-Kennwort unterscheidet, Dritten nicht bekannt ist und auch nicht auf anderen Internetseiten verwendet wird.]]></item>
+ </category>
+ <category name="wcf.acp.menu">
+ <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatisches Update]]></item>
+ <item name="wcf.acp.menu.link.content"><![CDATA[Inhalte]]></item>
+ <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>
+ <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[Protokoll anzeigen]]></item>
+ <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[Zeitgesteuerte Aufgaben auflisten]]></item>
+ <item name="wcf.acp.menu.link.display"><![CDATA[Darstellung]]></item>
+ <item name="wcf.acp.menu.link.group"><![CDATA[Benutzergruppen]]></item>
+ <item name="wcf.acp.menu.link.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>
+ <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-Mail an Gruppenmitglieder]]></item>
+ <item name="wcf.acp.menu.link.group.view"><![CDATA[Benutzergruppen auflisten]]></item>
+ <item name="wcf.acp.menu.link.log"><![CDATA[Protokoll]]></item>
+ <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>
+ <item name="wcf.acp.menu.link.log.session"><![CDATA[Sitzungen]]></item>
+ <item name="wcf.acp.menu.link.maintenance"><![CDATA[Wartung]]></item>
+ <item name="wcf.acp.menu.link.option"><![CDATA[Optionen]]></item>
+ <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Sichern & Wiederherstellen]]></item>
+ <item name="wcf.acp.menu.link.package"><![CDATA[Paketverwaltung]]></item>
+ <item name="wcf.acp.menu.link.package.database"><![CDATA[Pakete suchen]]></item>
+ <item name="wcf.acp.menu.link.package.install"><![CDATA[Paket installieren]]></item>
+ <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Server hinzufügen]]></item>
+ <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server auflisten]]></item>
+ <item name="wcf.acp.menu.link.package.view"><![CDATA[Pakete auflisten]]></item>
+ <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>
+ <item name="wcf.acp.menu.link.user"><![CDATA[Benutzer]]></item>
+ <item name="wcf.acp.menu.link.user.add"><![CDATA[Benutzer hinzufügen]]></item>
+ <item name="wcf.acp.menu.link.user.list"><![CDATA[Benutzer auflisten]]></item>
+ <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-Mail an alle Benutzer]]></item>
+ <item name="wcf.acp.menu.link.user.management"><![CDATA[Benutzer]]></item>
+ <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>
+ <item name="wcf.acp.menu.link.user.search"><![CDATA[Benutzer suchen]]></item>
+ </category>
+ <category name="wcf.acp.option">
+ <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Hostname ausschließen]]></item>
+ <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Gib pro Zeile einen Hostname an, die du von der Seite ausschließen möchtest.]]></item>
+ <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[IP-Adresse ausschließen]]></item>
+ <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Gib pro Zeile eine IP-Adresse an, die du von der Seite ausschließen möchtest.]]></item>
+ <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Browser-Kennung ausschließen]]></item>
+ <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Gib pro Zeile eine Browser-Kennung (User-Agent) an, die du von der Seite ausschließen möchtest.]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache-Server]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Gib hier die Adresse des Memcache-Servers ein! Mehrere Server können zeilenweise angegeben werden.]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Persistente Verbindungen aktivieren]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[Sollen beim Verbinden mit dem Memcache-Server persistente Verbindungen genutzt werden?]]></item>
+ <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache-Methode]]></item>
+ <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>
+ <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Bitte wähle die gewünschte Cache-Methode aus! Beachte, dass einige Methoden spezielle Anforderungen an das Server-System stellen und nicht auf jedem Server zur Verfügung stehen.]]></item>
+ <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[Dateisystem (Standard)]]></item>
+ <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (Experimentell)]]></item>
+ <item name="wcf.acp.option.category.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>
+ <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.cache.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>
+ <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache speichert häufig benötige Daten im Arbeitsspeicher zwischen. Dies kann die Last auf die Datenbank und das Dateisystem drastisch reduzieren. Lies mehr über dieses Thema auf der folgenden Seite:
+<ul>
+ <li><a href="http://memcached.org/">memcached.org</a></li>
+</ul>]]></item>
+ <item name="wcf.acp.option.category.general.date"><![CDATA[Datum & Zeit]]></item>
+ <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>
+ <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>
+ <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>
+ <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy-Server]]></item>
+ <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[Hier kannst du optional Proxy-Server für Verbindungen zu externen Servern konfigurieren.]]></item>
+ <item name="wcf.acp.option.category.general.mail"><![CDATA[E-Mails]]></item>
+ <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.mail.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Versand]]></item>
+ <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.offline"><![CDATA[Wartungsmodus]]></item>
+ <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module"><![CDATA[Module an / aus]]></item>
+ <item name="wcf.acp.option.category.module.content"><![CDATA[Inhalte]]></item>
+ <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.display"><![CDATA[Darstellung]]></item>
+ <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>
+ <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.user"><![CDATA[Benutzer]]></item>
+ <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security"><![CDATA[Sicherheit]]></item>
+ <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>
+ <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internetseiten werden häufig durch andere Programme angegriffen. So gibt es beispielsweise die Möglichkeit, automatisiert hunderte von Benutzerkonten zu erstellen. Um sich davor zu schützen, kannst du an verschiedenen Stellen ein sogenanntes <a href="http://de.wikipedia.org/wiki/Captcha" class="externalURL">Captcha-Bild</a> anzeigen lassen. Unregistrierte Benutzer müssen erst den Code eingeben, der auf diesem Bild steht. Roboter können diesen Code nicht lesen. Beachte, dass Captcha-Bilder von blinden und sehbehinderten Benutzern nicht identifiziert werden können.]]></item>
+ <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>
+ <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.censorship"><![CDATA[Zensur]]></item>
+ <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sitzungen]]></item>
+ <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.user"><![CDATA[Mitglieder]]></item>
+ <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookiedomain]]></item>
+ <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Hier kannst Du optional eine Domain angeben, unter der der Cookie laufen soll. Standardmäßig solltest Du dieses Feld frei lassen, da ein Ausfüllen nur in wenigen Fällen notwendig ist.]]></item>
+ <item name="wcf.acp.option.cookie_path"><![CDATA[Cookiepfad]]></item>
+ <item name="wcf.acp.option.cookie_path.description"><![CDATA[Der Cookiepfad wird absolut zum Document Root angegeben - also z.B. "/forum" für http://www.woltlab.de/forum.]]></item>
+ <item name="wcf.acp.option.cookie_prefix"><![CDATA[Präfix für Cookienamen]]></item>
+ <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Gib einen Präfix an, der bei Cookienamen verwendet wird.]]></item>
+ <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Uhr automatisch auf Sommer-/Winterzeit umstellen]]></item>
+ <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Soll die Uhr automatisch auf Sommer-/Winterzeit umgestellt werden?]]></item>
+ <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Cache-Methode für Sitzungsdaten verwenden]]></item>
+ <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Soll für die Speicherung der Sitzungsdaten die ausgewählte Cache-Methode verwendet werden?]]></item>
+ <item name="wcf.acp.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>
+ <item name="wcf.acp.option.export"><![CDATA[Optionen sichern]]></item>
+ <item name="wcf.acp.option.export.download"><![CDATA[Sicherung der Optionen herunterladen]]></item>
+ <item name="wcf.acp.option.export.download.description"><![CDATA[Lade eine Sicherung der Optionen auf deinen lokalen Rechner herunter.]]></item>
+ <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Gzip-Komprimierung aktivieren]]></item>
+ <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Durch Aktivierung dieser Option werden die Inhalte komprimiert vom Server an den Client gesendet. Dies reduziert den Traffic.]]></item>
+ <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Seitencaching im Client-Browser verhindern]]></item>
+ <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Durch Aktivierung dieser Option kannst du das Caching der Seite im Browser verhindern.]]></item>
+ <item name="wcf.acp.option.http_gzip_level"><![CDATA[Gzip-Komprimierungslevel]]></item>
+ <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[Werte von 1-9 sind zulässig. Als Optimum zwischen Komprimierung und Serverlast empfiehlt sich Level 1.]]></item>
+ <item name="wcf.acp.option.import"><![CDATA[Optionen wiederherstellen]]></item>
+ <item name="wcf.acp.option.import.error.importFailed"><![CDATA[Die Optionen konnten nicht erfolgreich importiert werden.]]></item>
+ <item name="wcf.acp.option.import.success"><![CDATA[Die Optionen wurden erfolgreich importiert.]]></item>
+ <item name="wcf.acp.option.import.upload"><![CDATA[Sicherung der Optionen vom lokalen Computer hochladen]]></item>
+ <item name="wcf.acp.option.import.upload.description"><![CDATA[Gib eine Sicherung der Optionen von Ihrem lokalen Rechner an.]]></item>
+ <item name="wcf.acp.option.importAndExport"><![CDATA[Optionen sichern & wiederherstellen]]></item>
+ <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator-Adresse]]></item>
+ <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Gib die E-Mail-Adresse des Administrators an.]]></item>
+ <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Logfile-Pfad]]></item>
+ <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Gib den Pfad zum Logfile an.]]></item>
+ <item name="wcf.acp.option.mail_from_address"><![CDATA[Absender-Adresse]]></item>
+ <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Gib die Absender-Adresse bei automatisch generierten E-Mails an.]]></item>
+ <item name="wcf.acp.option.mail_from_name"><![CDATA[Absender-Name]]></item>
+ <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Gib den Namen des Absenders bei automatisch generierten E-Mails an.]]></item>
+ <item name="wcf.acp.option.mail_send_method"><![CDATA[Versandmethode]]></item>
+ <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>
+ <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Wähle eine Versandmethode aus.]]></item>
+ <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>
+ <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>
+ <item name="wcf.acp.option.mail_signature"><![CDATA[Signatur]]></item>
+ <item name="wcf.acp.option.mail_signature.description"><![CDATA[Trage hier eine Signatur ein, die bei System-E-Mails angezeigt werden soll.]]></item>
+ <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP-Server]]></item>
+ <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Trage hier den SMTP-Server ein.]]></item>
+ <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP-Kennwort]]></item>
+ <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Gib das SMTP-Kennwort an.]]></item>
+ <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP-Port]]></item>
+ <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Gib den SMTP-Port an.]]></item>
+ <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP-Benutzer]]></item>
+ <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Gib den SMTP-Benutzer an.]]></item>
+ <item name="wcf.acp.option.mail_use_f_param"><![CDATA[»-f« Parameter verwenden]]></item>
+ <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Manche Server benötigen den »-f« Parameter beim Versenden von E-Mails. Falls du Probleme mit dem Versand von E-Mails hast, aktiviere diese Einstellung.]]></item>
+ <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Formatierte E-Mail-Adressen verwenden]]></item>
+ <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Absender- und Empfänger-Adressen werden in folgendes Format gebracht: "Name <email@domain.tld>". Diese Funktion wird nicht von allen Mailservern unterstützt und sollte daher bei Problemen abgeschaltet werden.]]></item>
+ <item name="wcf.acp.option.module_master_password"><![CDATA[Hauptkennwort aktivieren]]></item>
+ <item name="wcf.acp.option.module_master_password.description"><![CDATA[Aktiviert die zusätzliche Eingabe eines Kennworts beim Aufruf von sicherheitskritischen Bereichen.]]></item>
+ <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>
+ <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server für HTTP-Verbindungen]]></item>
+ <item name="wcf.acp.option.session_timeout"><![CDATA[Gültigkeitslänge einer Sitzung]]></item>
+ <item name="wcf.acp.option.session_timeout.description"><![CDATA[Gib an, wie lange die Sitzung gültig ist [Sekunden]. ]]></item>
+ <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[IP-Adresse der Sitzung überprüfen]]></item>
+ <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[Anzahl der Blöcke der IP-Adresse die beim Auslesen der Sitzung überprüft werden sollen. Eine hohe Einstellung kann Benutzer ausschließen, die mit wechselnden IP-Adressen im Internet unterwegs sind.]]></item>
+ <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Browser-Kennung der Sitzung überprüfen]]></item>
+ <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Soll die Browser-Kennung beim Auslesen der Sitzung überprüft werden?]]></item>
+ <item name="wcf.acp.option.success"><![CDATA[Deine Einstellungsänderungen wurden erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.option.timezone"><![CDATA[Zeitzone]]></item>
+ <item name="wcf.acp.option.timezone.description"><![CDATA[Wähle die Standard Zeitzone deiner Seite.]]></item>
+ <item name="wcf.acp.option.user_online_timeout"><![CDATA[Timeout für Benutzer-Online]]></item>
+ <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Gib an, wie lange der Benutzer trotz Inaktivität als online markiert werden soll [Sekunden].]]></item>
+ <item name="wcf.acp.option.category.general.page"><![CDATA[Seite]]></item>
+ <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.meta_description"><![CDATA[Meta Description]]></item>
+ <item name="wcf.acp.option.meta_description.description"><![CDATA[Gib eine Meta Description an.]]></item>
+ <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta Keywords]]></item>
+ <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Trage die Wörter ein, die im Meta-Tag Keywords stehen sollen.]]></item>
+ <item name="wcf.acp.option.page_description"><![CDATA[Seitenbeschreibung]]></item>
+ <item name="wcf.acp.option.page_description.description"><![CDATA[Füge hier eine kurze Beschreibung deiner Seite ein.]]></item>
+ <item name="wcf.acp.option.page_title"><![CDATA[Titel der Seite]]></item>
+ <item name="wcf.acp.option.page_title.description"><![CDATA[Gib hier den Globalen Titel der Seite an. Dieser Titel wird im Seitenkopf dargestellt, wenn du die Anzeige dieses Textes im Stileditor aktiviert hast.]]></item>
+ <item name="wcf.acp.option.page_url"><![CDATA[Adresse (URL) der Seite]]></item>
+ <item name="wcf.acp.option.page_url.description"><![CDATA[Gib an, unter welcher Adresse (URL) die Seite aufzurufen ist (ohne abschließenden Slash).]]></item>
+ <item name="wcf.acp.option.page_urls"><![CDATA[Weitere URLs]]></item>
+ <item name="wcf.acp.option.page_urls.description"><![CDATA[Gib hier weitere URLs an, unter denen deine Seite erreichbar ist.]]></item>
+ </category>
+ <category name="wcf.acp.package">
+ <item name="wcf.acp.package.cancel"><![CDATA[Abbruch der Paketinstallation]]></item>
+ <item name="wcf.acp.package.description"><![CDATA[Beschreibung]]></item>
+ <item name="wcf.acp.package.install"><![CDATA[Paketinstallation]]></item>
+ <item name="wcf.acp.package.install.cancel"><![CDATA[Installation abbrechen]]></item>
+ <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Willst du die Installation wirklich abbrechen?]]></item>
+ <item name="wcf.acp.package.install.error"><![CDATA[Die Abhängigkeiten dieses Paketes konnten nicht aufgelöst werden.]]></item>
+ <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[Die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket »{$packageName}« in Version {$packageVersion} kann aufgrund von Inkompatibilitäten zu {if $excludedPackages|count == 1}folgendem Paket{else}folgenden Paketen{/if} nicht durchgeführt werden:]]></item>
+ <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in Version {$excludedPackage.packageVersion}]]></item>
+ <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket lässt{else}Folgende Pakete lassen{/if} die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket »{$packageName}« in Version {$packageVersion} aufgrund von Inkompatibilitäten nicht zu:]]></item>
+ <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in Version {$excludingPackage.packageVersion}]]></item>
+ <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket ist{else}Folgende Pakete sind{/if} mit dem Paket »{$packageName}« in Version {$packageVersion} nicht kompatibel. Wenn du die Installation fortführst, {if $excludingPackages|count == 1}wird das Paket{else}werden die Pakete{/if} vermutlich nicht mehr korrekt funktionieren.]]></item>
+ <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}ist bereits installiert{else}{if $package.file|isset}liegt dem Paket bei{else}fehlt{/if}{/if})</span>]]></item>
+ <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Willst du die Paketinstallation wirklich abbrechen?]]></item>
+ <item name="wcf.acp.package.install.updatableInstances"><![CDATA[Folgende Pakete können mit diesem Paket aktualisiert werden]]></item>
+ <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Wähle eines der folgenden Pakete aus, um seine Version zu aktualisieren. Falls du das Paket neu installieren möchtest, klick unten auf »Weiter«.]]></item>
+ <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[Es ist bereits eine Kopie dieses Paketes installiert. Wenn du fortfährst, wird eine weitere Kopie dieses Paketes installiert. Falls du eine vorhandene Kopie dieses Paketes aktualisieren möchtest, wähle die Kopie aus der folgenden Liste aus.]]></item>
+ <item name="wcf.acp.package.install.version"><![CDATA[Version des Paketes:]]></item>
+ <item name="wcf.acp.package.installDate"><![CDATA[Installationsdatum]]></item>
+ <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[Beim Versuch die Dateien des Paketes zu entpacken, ist folgender Fehler aufgetreten:]]></item>
+ <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[Folgende Dateien konnten nicht erfolgreich entpackt werden. Bitte überprüfe, ob der entsprechende Zielort beschreibbar ist.]]></item>
+ <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Tabellen Konflikt]]></item>
+ <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Keine Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>
+ <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Alle Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>
+ <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Notwendige Änderungen]]></item>
+ <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Betroffene Tabelle]]></item>
+ <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Vorhandene Tabellen deiner Datenbank stehen im Konflikt mit Tabellen, die für dieses Paket installiert werden müssen. Wähle aus, ob diese Tabellen überschrieben werden sollen.]]></item>
+ <item name="wcf.acp.package.list"><![CDATA[Installierte Pakete]]></item>
+ <item name="wcf.acp.package.list.author"><![CDATA[Hersteller]]></item>
+ <item name="wcf.acp.package.list.count"><![CDATA[Insgesamt sind {#$items} Pakete installiert.]]></item>
+ <item name="wcf.acp.package.list.date"><![CDATA[Herstellungsdatum]]></item>
+ <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>
+ <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>
+ <item name="wcf.acp.package.list.other"><![CDATA[Sonstiges Paket]]></item>
+ <item name="wcf.acp.package.list.plugin"><![CDATA[Zusatzmodul]]></item>
+ <item name="wcf.acp.package.list.standalone"><![CDATA[Endanwendung]]></item>
+ <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>
+ <item name="wcf.acp.package.optionals"><![CDATA[Optionale Zusatzpakete installieren]]></item>
+ <item name="wcf.acp.package.optionals.description"><![CDATA[Das aktuelle Paket bringt folgende optionale Zusatzpakete mit. Wähle aus, welche Zusatzpakete du installieren möchtest.]]></item>
+ <item name="wcf.acp.package.optionals.installed"><![CDATA[ (Dieses Paket ist bereits installiert.)]]></item>
+ <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (Die Voraussetzungen für dieses Paket werden nicht erfüllt.)]]></item>
+ <item name="wcf.acp.package.packageDir"><![CDATA[Installationsverzeichnis]]></item>
+ <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>
+ <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Es ist bereits eine andere Anwendung in dem angegebenen Verzeichnis installiert.]]></item>
+ <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>
+ <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[Das angegebene Verzeichnis ist nicht beschreibbar.]]></item>
+ <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[Das angegebene Verzeichnis wird bereits von WoltLab Community Framework beansprucht. Wähle ein anderes Verzeichnis.]]></item>
+ <item name="wcf.acp.package.packageDir.input"><![CDATA[Gib hier das Installationsverzeichnis an.]]></item>
+ <item name="wcf.acp.package.packageDir.url"><![CDATA[Nach der Installation in das angegebene Installationsverzeichnis ist die Anwendung über folgende Adresse (URL) erreichbar:]]></item>
+ <item name="wcf.acp.package.requirements"><![CDATA[Abhängigkeiten auswählen]]></item>
+ <item name="wcf.acp.package.requirements.description"><![CDATA[Das aktuelle Paket benötigt Pakete, von denen mehrere Instanzen installiert sind. Bitte wähle aus, zu welcher Instanz jeweils eine Abhängigkeit hergestellt werden soll.]]></item>
+ <item name="wcf.acp.package.rollback"><![CDATA[Paketinstallation zurücksetzen]]></item>
+ <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright © {$packageAuthor}]]></item>
+ <item name="wcf.acp.package.startInstall"><![CDATA[Neues Paket installieren]]></item>
+ <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[Das angegebene Paket lässt keine Neuinstallation zu.]]></item>
+ <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[Das angegebene Archiv ist kein gültiges Paket.]]></item>
+ <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[Paket »{$package->getName()}« kann mit dem angegebenen Archiv nicht aktualisiert werden.]]></item>
+ <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[Es konnte keine Datei unter dem angegebenen Pfad gefunden wurden.]]></item>
+ <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[Dieses Paket ist bereits installiert. Das Paket kann nicht mehrfach installiert werden.]]></item>
+ <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[Das Hochladen der ausgewählten Datei ist fehlgeschlagen.]]></item>
+ <item name="wcf.acp.package.startInstall.source"><![CDATA[Quelle auswählen]]></item>
+ <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Direkten Pfad zum Paket angeben]]></item>
+ <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Gib den direkten Pfad zur Paketdatei an. Dabei kann es sich um die Internet Adresse der Paketdatei oder alternativ den Pfad zur Paketdatei im Dateisystem handeln.]]></item>
+ <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Paket vom lokalen Computer hochladen]]></item>
+ <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Gib eine Paketdatei von deinem lokalen Rechner an.]]></item>
+ <item name="wcf.acp.package.startUpdate"><![CDATA[Paket »{$package->getName()}« aktualisieren]]></item>
+ <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>
+ <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>
+ <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation abgeschlossen]]></item>
+ <item name="wcf.acp.package.step.install.optionals"><![CDATA[Optionale Pakete werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.package"><![CDATA[Paket wird registriert ...]]></item>
+ <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>
+ <item name="wcf.acp.package.step.install.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+ <item name="wcf.acp.package.step.title"><![CDATA[Paket <b>{$packageName|encodeJS}</b>: ]]></item>
+ <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Dateien werden gelöscht ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Deinstallation abgeschlossen]]></item>
+ <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Optionale Pakete werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+ <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches der Administrationsoberfläche werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>
+ <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.TemplatePatchPackageInstallationPlugin"><![CDATA[Template-Patches werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>
+ <item name="wcf.acp.package.step.update.finish"><![CDATA[Paketaktualisierung abgeschlossen]]></item>
+ <item name="wcf.acp.package.step.update.optionals"><![CDATA[Optionale Pakete werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.package"><![CDATA[Paket wird aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>
+ <item name="wcf.acp.package.step.update.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+ <item name="wcf.acp.package.templatePatch.install.failed"><![CDATA[Das Anwenden eines Patches, der zu diesem Paket gehört, ist fehlgeschlagen, da dieser Patch nicht kompatibel zu seiner Zieldatei ist. Das Paket kann deshalb nicht installiert werden. Klick auf »Installation abbrechen«.]]></item>
+ <item name="wcf.acp.package.templatePatch.repatch.failed"><![CDATA[Das erneute Patchen folgender Templates scheiterte:<br />{foreach from=$failures item=$failure}{$failure.templateName} (ursprünglich gepatcht von: {$failure.packageName})<br />{/foreach}Wahrscheinlich wird deshalb das Paket, das den jeweiligen Patch ursprünglich angewendet hatte, nicht mehr funktionieren. Du solltest dieses Update dennoch fortsetzen. Klick dazu auf »Weiter«.]]></item>
+ <item name="wcf.acp.package.templatePatch.uninstall.failed"><![CDATA[Das Entfernen eines Patches, der zu diesem Paket gehört, ist fehlgeschlagen, da seine Zieldatei anderweitig verändert worden ist. Das Paket kann deshalb nicht entfernt werden. Klick auf »Abbruch der Paketdeinstallation«.]]></item>
+ <item name="wcf.acp.package.uninstall"><![CDATA[Paketdeinstallation]]></item>
+ <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Abbruch der Paketdeinstallation]]></item>
+ <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[Die Deinstallation des Paketes ist nicht möglich, da mindestens ein abhängiges Paket nicht deinstalliert werden kann.]]></item>
+ <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Diese{if $dependentPackages|count == 1}s Paket wird{else} Pakete werden{/if}, nach deiner Bestätigung, ohne weitere Sicherheitsabfrage deinstalliert.]]></item>
+ <item name="wcf.acp.package.update"><![CDATA[Paketaktualisierung]]></item>
+ <item name="wcf.acp.package.updateDate"><![CDATA[Aktualisierungsdatum]]></item>
+ <item name="wcf.acp.package.view.author"><![CDATA[Hersteller:]]></item>
+ <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Zur Administrationsoberfläche wechseln]]></item>
+ <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Paket deinstallieren]]></item>
+ <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Alle Pakete deinstallieren]]></item>
+ <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Willst du dieses Paket wirklich deinstallieren?]]></item>
+ <item name="wcf.acp.package.view.button.update"><![CDATA[Paket aktualisieren]]></item>
+ <item name="wcf.acp.package.view.date"><![CDATA[Herstellungsdatum:]]></item>
+ <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Abhängige Pakete]]></item>
+ <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[Dieses Paket wird von {#$dependentPackages|count} {if $dependentPackages|count == 1}anderen Paket{else}anderen Paketen{/if} benötigt.]]></item>
+ <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}Dieses Paket wird von 1 anderen Paket benötigt{else}{#$dependentPackages|count} Pakete sind direkt oder indirekt von diesem Paket abhängig{/if}.]]></item>
+ <item name="wcf.acp.package.view.dir"><![CDATA[Installationsverzeichnis:]]></item>
+ <item name="wcf.acp.package.view.identifier"><![CDATA[Bezeichner:]]></item>
+ <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installierte Instanz:]]></item>
+ <item name="wcf.acp.package.view.parent"><![CDATA[Übergeordnetes Paket:]]></item>
+ <item name="wcf.acp.package.view.properties"><![CDATA[Eigenschaften]]></item>
+ <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Benötigte Pakete]]></item>
+ <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[Dieses Paket benötigt {#$requiredPackages|count} {if $requiredPackages|count == 1}anderes Paket{else}andere Pakete{/if}.]]></item>
+ <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>
+ <item name="wcf.acp.package.view.version"><![CDATA[Installierte Version:]]></item>
+ </category>
+ <category name="wcf.acp.packageUpdate">
+ <item name="wcf.acp.packageUpdate"><![CDATA[Pakete aktualisieren]]></item>
+ <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentifizierung mit Update-Server]]></item>
+ <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Verbindungs-Daten]]></item>
+ <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Benutzername und Kennwort wurden nicht akzeptiert.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Kennwort]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Gib ein Kennwort an, das zur Authentifizierung benötigt wird.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Benutzername]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Gib einen Benutzernamen an, der zur Authentifizierung benötigt wird.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[Benutzeranmeldung]]></item>
+ <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server-Meldung]]></item>
+ <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server-Name]]></item>
+ <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Benutzerdaten dauerhaft speichern]]></item>
+ <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[Speichert die eingegebenen Benutzerdaten dauerhaft, sodass du die Daten zu einem späteren Zeitpunkt nicht erneut eingeben musst.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Adresse]]></item>
+ <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installierte Version]]></item>
+ <item name="wcf.acp.packageUpdate.error"><![CDATA[Es ist folgender Fehler aufgetreten: ]]></item>
+ <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[Das Herunterladen des Paketes {$package} ist fehlgeschlagen.]]></item>
+ <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[Beim Versuch die Paketliste herunterzuladen, ist ein Fehler aufgetreten.]]></item>
+ <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[Es {if $excludedPackages|count == 1}ist folgender Konflikt{else}sind folgende Konflikte{/if} aufgetreten:]]></item>
+ <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[Das installierte Paket »{$excludedPackage.existingPackageName}« ist mit dem Paket »{$excludedPackage.packageName}« in Version {$excludedPackage.packageVersion} nicht kompatibel.]]></item>
+ <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[Das Paket »{$excludedPackage.packageName}« in Version {$excludedPackage.packageVersion} ist mit dem installierten Paket »{$excludedPackage.existingPackageName}« nicht kompatibel.]]></item>
+ <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} wird installiert]]></item>
+ <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[Derzeit sind keine Updates verfügbar.]]></item>
+ <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[Du hast kein Update ausgewählt.]]></item>
+ <item name="wcf.acp.packageUpdate.options"><![CDATA[Optionen]]></item>
+ <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[Das Paket ist bereits installiert und kann kein weiteres Mal installiert werden.]]></item>
+ <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Paket installieren]]></item>
+ <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Weitere Paket-Instanz installieren (Paket ist bereits {#$package.instances} mal installiert)]]></item>
+ <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Installiertes Paket {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} Version {$updatableInstance.packageVersion} aktualisieren]]></item>
+ <item name="wcf.acp.packageUpdate.search"><![CDATA[Pakete suchen]]></item>
+ <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Autor]]></item>
+ <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Suche nach ...]]></item>
+ <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Bereits installierte einzigartige Pakete ausblenden]]></item>
+ <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Paketname]]></item>
+ <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Paketname und -beschreibung durchsuchen]]></item>
+ <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update-Server]]></item>
+ <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Alle Update-Server durchsuchen]]></item>
+ <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Art des Paketes]]></item>
+ <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Sonstige Pakete]]></item>
+ <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Zusatzmodul für bereits installierte Pakete]]></item>
+ <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Endanwendung]]></item>
+ <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Alle Pakete auswählen]]></item>
+ <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} wird aktualisiert auf {$package.toVersion}]]></item>
+ <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[Neue Version]]></item>
+ <item name="wcf.acp.packageUpdate.updates"><![CDATA[Folgende Paket-Aktualisierungen/-Installationen werden durchgeführt:]]></item>
+ </category>
+ <category name="wcf.acp.sessionLog">
+ <item name="wcf.acp.sessionLog.access.view"><![CDATA[Aktionen der protokollierten Sitzung von »{$sessionLog->username}«]]></item>
+ <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[Insgesamt {#$items} protokollierte Aktion{if $items != 1}en{/if}]]></item>
+ <item name="wcf.acp.sessionLog.accesses"><![CDATA[Aktionen]]></item>
+ <item name="wcf.acp.sessionLog.className"><![CDATA[Klasse]]></item>
+ <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP-Adresse]]></item>
+ <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Letzte Aktion]]></item>
+ <item name="wcf.acp.sessionLog.packageName"><![CDATA[Paket]]></item>
+ <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Methode]]></item>
+ <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>
+ <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>
+ <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>
+ <item name="wcf.acp.sessionLog.time"><![CDATA[Datum]]></item>
+ <item name="wcf.acp.sessionLog.userAgent"><![CDATA[Browser-Kennung]]></item>
+ <item name="wcf.acp.sessionLog.view"><![CDATA[Protokollierte Sitzungen]]></item>
+ <item name="wcf.acp.sessionLog.view.count"><![CDATA[Insgesamt {#$items} protokollierte Sitzung{if $items != 1}en{/if}]]></item>
+ </category>
+ <category name="wcf.acp.updateServer">
+ <item name="wcf.acp.updateServer.add"><![CDATA[Server hinzufügen]]></item>
+ <item name="wcf.acp.updateServer.add.success"><![CDATA[Der Server wurde erfolgreich angelegt.]]></item>
+ <item name="wcf.acp.updateServer.data"><![CDATA[Server-Daten]]></item>
+ <item name="wcf.acp.updateServer.delete"><![CDATA[Server löschen]]></item>
+ <item name="wcf.acp.updateServer.delete.success"><![CDATA[Der Server wurde erfolgreich gelöscht.]]></item>
+ <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Willst du den Server wirklich löschen?]]></item>
+ <item name="wcf.acp.updateServer.disable"><![CDATA[Deaktivieren]]></item>
+ <item name="wcf.acp.updateServer.edit"><![CDATA[Server bearbeiten]]></item>
+ <item name="wcf.acp.updateServer.edit.success"><![CDATA[Ihre Änderungen wurden erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.updateServer.enable"><![CDATA[Aktivieren]]></item>
+ <item name="wcf.acp.updateServer.errorText"><![CDATA[Fehlermeldungen]]></item>
+ <item name="wcf.acp.updateServer.htPassword"><![CDATA[Kennwort]]></item>
+ <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Gib ein Kennwort an, das zur Authentifizierung benötigt wird (optional).]]></item>
+ <item name="wcf.acp.updateServer.htUsername"><![CDATA[Benutzername]]></item>
+ <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Gib einen Benutzernamen an, der zur Authentifizierung benötigt wird (optional).]]></item>
+ <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[Beim letzten Verbindungsversuch trat folgende Fehlermeldungen auf:]]></item>
+ <item name="wcf.acp.updateServer.list.available"><![CDATA[Insgesamt {#$items} Server eingetragen]]></item>
+ <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server-ID]]></item>
+ <item name="wcf.acp.updateServer.packages"><![CDATA[Pakete]]></item>
+ <item name="wcf.acp.updateServer.server"><![CDATA[Adresse]]></item>
+ <item name="wcf.acp.updateServer.server.description"><![CDATA[Gib die Adresse (URL) zu einem Paketserver an.]]></item>
+ <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[Die eingetragene Adresse ist ungültig.]]></item>
+ <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>
+ <item name="wcf.acp.updateServer.timestamp"><![CDATA[Letzter Zugriff]]></item>
+ <item name="wcf.acp.updateServer.view"><![CDATA[Verfügbare Update-Server]]></item>
+ <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[Es sind keine Update-Server eingetragen.]]></item>
+ </category>
+ <category name="wcf.acp.user">
+ <item name="wcf.acp.user.add"><![CDATA[Benutzer hinzufügen]]></item>
+ <item name="wcf.acp.user.add.data"><![CDATA[Benutzerdaten]]></item>
+ <item name="wcf.acp.user.add.success"><![CDATA[Der neue Benutzer wurde erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.user.assignToGroup"><![CDATA[Benutzergruppe zuweisen]]></item>
+ <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Folgende Benutzer den unten ausgewählten Benutzergruppen zuweisen]]></item>
+ <item name="wcf.acp.user.assignToGroup.success"><![CDATA[Die Zuweisung wurde erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.user.button.assignGroup"><![CDATA[Benutzergruppe zuweisen]]></item>
+ <item name="wcf.acp.user.button.exportMail"><![CDATA[E-Mail-Adressen exportieren]]></item>
+ <item name="wcf.acp.user.button.sendMail"><![CDATA[E-Mail senden]]></item>
+ <item name="wcf.acp.user.delete"><![CDATA[Benutzer löschen]]></item>
+ <item name="wcf.acp.user.delete.error"><![CDATA[Es konnte kein Benutzer gelöscht werden.]]></item>
+ <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}Der Benutzer wurde{else}{#$deletedUsers} Benutzer wurden{/if} erfolgreich gelöscht.]]></item>
+ <item name="wcf.acp.user.delete.sure"><![CDATA[Willst du diesen Benutzer wirklich löschen?]]></item>
+ <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Willst du die markierten Benutzer wirklich löschen?]]></item>
+ <item name="wcf.acp.user.edit"><![CDATA[Benutzer bearbeiten]]></item>
+ <item name="wcf.acp.user.edit.success"><![CDATA[Die Änderungen an diesem Benutzer wurden erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[Du bearbeitest dein eigenes Benutzerkonto. Änderungen an den Mitgliedschaften in Benutzergruppen können womöglich dazu führen, dass du aus der Administrationsoberfläche ausgeschlossen wirst. Sei bitte entsprechend vorsichtig!]]></item>
+ <item name="wcf.acp.user.exportEmailAddress"><![CDATA[E-Mail-Adressen exportieren]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Exportformat]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Exporteinstellungen]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[E-Mail-Adressen von folgenden Benutzern exportieren]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Trennzeichen]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Texttrenner]]></item>
+ <item name="wcf.acp.user.groups"><![CDATA[Benutzergruppe(n)]]></item>
+ <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Finde Benutzer, die in den ausgewählten Benutzergruppen nicht Mitglied sind.]]></item>
+ <item name="wcf.acp.user.list"><![CDATA[Benutzer]]></item>
+ <item name="wcf.acp.user.list.all"><![CDATA[Alle Benutzer]]></item>
+ <item name="wcf.acp.user.list.count"><![CDATA[Insgesamt {#$items} Benutzer]]></item>
+ <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "Einen Benutzer markiert" : this.count+" Benutzer markiert"]]></item>
+ <item name="wcf.acp.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>
+ <item name="wcf.acp.user.massProcessing.action"><![CDATA[Aktion]]></item>
+ <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Bedingungen]]></item>
+ <item name="wcf.acp.user.massProcessing.success"><![CDATA[Die gewählte Aktion wurde erfolgreich auf {#$affectedUsers} Benutzer ausgeführt.]]></item>
+ <item name="wcf.acp.user.massProcessing.warning"><![CDATA[Die Massenverarbeitung von Benutzern führt die unten ausgewählte Aktion <b>ohne zusätzliche Sicherheitsabfrage</b> auf alle Benutzer aus, die unter die eingestellten Bedingungen fallen. Die Bearbeitungen können unter Umständen sehr rechenintensiv werden und sollten deshalb möglichst nur dann ausgeführt werden, wenn sich die Seite im Wartungsmodus befindet! Die Veränderungen können nicht rückgängig gemacht werden. Bitte benutze diese Funktion mit der nötigen Vorsicht!]]></item>
+ <item name="wcf.acp.user.search"><![CDATA[Benutzer suchen]]></item>
+ <item name="wcf.acp.user.search.conditions"><![CDATA[Kriterien der Suche]]></item>
+ <item name="wcf.acp.user.search.conditions.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profil]]></item>
+ <item name="wcf.acp.user.search.display"><![CDATA[Darstellung]]></item>
+ <item name="wcf.acp.user.search.display.columns"><![CDATA[Angezeigte Informationen]]></item>
+ <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Sonstiges]]></item>
+ <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profil]]></item>
+ <item name="wcf.acp.user.search.display.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Benutzer pro Seite]]></item>
+ <item name="wcf.acp.user.search.display.sort"><![CDATA[Sortierung]]></item>
+ <item name="wcf.acp.user.search.error.noMatches"><![CDATA[Zu den angegebenen Kriterien wurde kein Benutzer gefunden.]]></item>
+ <item name="wcf.acp.user.search.matches"><![CDATA[{if $items == 1}Ein Ergebnis{else}{#$items} Ergebnisse{/if}]]></item>
+ <item name="wcf.acp.user.search.withinResults"><![CDATA[In den Ergebnissen suchen]]></item>
+ <item name="wcf.acp.user.sendMail"><![CDATA[E-Mail an Benutzer senden]]></item>
+ <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail an alle Benutzer]]></item>
+ <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[E-Mail als HTML verschicken]]></item>
+ <item name="wcf.acp.user.sendMail.from"><![CDATA[Absender]]></item>
+ <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Hier kannst du die E-Mail-Adresse des Absenders definieren.{if MAIL_USE_FORMATTED_ADDRESS} Es ist auch folgendes Format möglich:{/if}</p>
+{if MAIL_USE_FORMATTED_ADDRESS}<p style="text-align: center; line-height: 2em;"><code>Absender Name <email@absender.tld></code></p>{/if}
+<p>Wenn du unter System -> Optionen -> E-Mail alles ausgefüllt hast, wird dieses Feld automatisch ausgefüllt. Solltest du E-Mails per SMTP senden, so achte darauf, dass die E-Mail-Adresse des Absenders auch vom Server akzeptiert werden muss.</p>]]></item>
+ <item name="wcf.acp.user.sendMail.group"><![CDATA[E-Mail an Gruppenmitglieder]]></item>
+ <item name="wcf.acp.user.sendMail.groups"><![CDATA[E-Mail an die Mitglieder folgender Benutzergruppen senden]]></item>
+ <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-Mail]]></item>
+ <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[E-Mail an folgende Benutzer senden]]></item>
+ <item name="wcf.acp.user.sendMail.subject"><![CDATA[Betreff]]></item>
+ <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Gib hier die Betreffzeile der E-Mail an.]]></item>
+ <item name="wcf.acp.user.sendMail.text"><![CDATA[Nachricht]]></item>
+ <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Trage hier die Nachricht ein, die du den Benutzern senden möchtest.]]></item>
+ <item name="wcf.acp.user.userNote"><![CDATA[Angemeldet als {$this->user->username}.]]></item>
+ </category>
+ <category name="wcf.acp.worker">
+ <item name="wcf.acp.worker.currentStep"><![CDATA[Aktueller Schritt]]></item>
+ <item name="wcf.acp.worker.description"><![CDATA[Lass dieses Browser-Fenster offen, bis der Prozess abgeschlossen ist und melde dich auf keinen Fall in einem anderen Browser-Fenster separat in der Administrationsoberfläche an, da dies den Prozess behindern könnte.]]></item>
+ <item name="wcf.acp.worker.progress.finish"><![CDATA[Vorgang erfolgreich abgeschlossen]]></item>
+ <item name="wcf.acp.worker.progress.working"><![CDATA[Vorgang läuft ...]]></item>
+ <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>
+ <item name="wcf.acp.worker.title"><![CDATA[Prozess läuft ...]]></item>
+ </category>
+ <category name="wcf.global">
+ <item name="wcf.global.button.back"><![CDATA[« Zurück]]></item>
+ <item name="wcf.global.button.close"><![CDATA[Schließen]]></item>
+ <item name="wcf.global.button.collapse"><![CDATA[Zuklappen]]></item>
+ <item name="wcf.global.button.collapsible"><![CDATA[Auf- und Zuklappen]]></item>
+ <item name="wcf.global.button.delete"><![CDATA[Löschen]]></item>
+ <item name="wcf.global.button.delete.confirm"><![CDATA[Möchtest du das Element wirklich löschen?]]></item>
+ <item name="wcf.global.button.deleteCompletely"><![CDATA[Endgültig löschen]]></item>
+ <item name="wcf.global.button.edit"><![CDATA[Bearbeiten]]></item>
+ <item name="wcf.global.button.editor.jump"><![CDATA[Zum Editor wechseln]]></item>
+ <item name="wcf.global.button.expand"><![CDATA[Aufklappen]]></item>
+ <item name="wcf.global.button.mark"><![CDATA[Markieren]]></item>
+ <item name="wcf.global.button.next"><![CDATA[Weiter »]]></item>
+ <item name="wcf.global.button.preview"><![CDATA[Vorschau]]></item>
+ <item name="wcf.global.button.reset"><![CDATA[Zurücksetzen]]></item>
+ <item name="wcf.global.button.submit"><![CDATA[Absenden]]></item>
+ <item name="wcf.global.button.unmark"><![CDATA[Demarkieren]]></item>
+ <item name="wcf.global.date.day"><![CDATA[Tag]]></item>
+ <item name="wcf.global.date.days"><![CDATA[Tage]]></item>
+ <item name="wcf.global.date.hour"><![CDATA[Stunde]]></item>
+ <item name="wcf.global.date.hours"><![CDATA[Stunden]]></item>
+ <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>
+ <item name="wcf.global.date.minutes"><![CDATA[Minuten]]></item>
+ <item name="wcf.global.date.month"><![CDATA[Monat]]></item>
+ <item name="wcf.global.date.months"><![CDATA[Monate]]></item>
+ <item name="wcf.global.date.second"><![CDATA[Sekunde]]></item>
+ <item name="wcf.global.date.seconds"><![CDATA[Sekunden]]></item>
+ <item name="wcf.global.date.week"><![CDATA[Woche]]></item>
+ <item name="wcf.global.date.weeks"><![CDATA[Wochen]]></item>
+ <item name="wcf.global.date.year"><![CDATA[Jahr]]></item>
+ <item name="wcf.global.date.year.notRequired"><![CDATA[Die Angabe des Jahres ist optional.]]></item>
+ <item name="wcf.global.date.years"><![CDATA[Jahre]]></item>
+ <item name="wcf.global.dateFormat"><![CDATA[%d.%m.%Y]]></item>
+ <item name="wcf.global.dateFormatLocalized"><![CDATA[%e. %B %Y]]></item>
+ <item name="wcf.global.dateFormatToday"><![CDATA[<b>Heute</b>, %H:%M]]></item>
+ <item name="wcf.global.dateFormatYesterday"><![CDATA[Gestern, %H:%M]]></item>
+ <item name="wcf.global.dateInputOrder"><![CDATA[day-month-year]]></item>
+ <item name="wcf.global.dateMethod"><![CDATA[strftime]]></item>
+ <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>
+ <item name="wcf.global.defaultValue"><![CDATA[Standard]]></item>
+ <item name="wcf.global.error.backward"><![CDATA[Zurück zur vorherigen Seite]]></item>
+ <item name="wcf.global.error.empty"><![CDATA[Füll dieses Eingabefeld aus.]]></item>
+ <item name="wcf.global.error.file.notFound"><![CDATA[Die Datei konnte nicht gefunden werden.]]></item>
+ <item name="wcf.global.error.illegalLink"><![CDATA[Du hast einen ungültigen oder nicht mehr gültigen Link aufgerufen.]]></item>
+ <item name="wcf.global.error.permissionDenied"><![CDATA[Der Zutritt zu dieser Seite ist dir leider verwehrt. Du besitzt nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.]]></item>
+ <item name="wcf.global.error.permissionDenied.title"><![CDATA[Zutritt verwehrt]]></item>
+ <item name="wcf.global.error.title"><![CDATA[Fehlermeldung]]></item>
+ <item name="wcf.global.form.error"><![CDATA[Deine Angaben sind ungültig. Überprüfe die markierten Eingabefelder.]]></item>
+ <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>
+ <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>
+ <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>
+ <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>
+ <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>
+ <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede »Du«)]]></item>
+ <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>
+ <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>
+ <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>
+ <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>
+ <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>
+ <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>
+ <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>
+ <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>
+ <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>
+ <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>
+ <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>
+ <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>
+ <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>
+ <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>
+ <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>
+ <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>
+ <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>
+ <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>
+ <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>
+ <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>
+ <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>
+ <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>
+ <item name="wcf.global.language.th"><![CDATA[Thailändisch]]></item>
+ <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>
+ <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>
+ <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>
+ <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>
+ <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>
+ <item name="wcf.global.multiSelect"><![CDATA[Mehrfache Markierungen sind durch zusätzliches Drücken der Taste »Strg/Ctrl« (Windows) oder »Befehl/Command« (Mac OS) möglich.]]></item>
+ <item name="wcf.global.page.input"><![CDATA[Zu folgender Seite springen]]></item>
+ <item name="wcf.global.page.next"><![CDATA[nächste Seite]]></item>
+ <item name="wcf.global.page.previous"><![CDATA[vorherige Seite]]></item>
+ <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>
+ <item name="wcf.global.pageTitle"><![CDATA[WoltLab® Community Framework™]]></item>
+ <item name="wcf.global.redirect.title"><![CDATA[Weiterleitung]]></item>
+ <item name="wcf.global.redirect.url"><![CDATA[Falls die automatische Weiterleitung nicht funktioniert, klick hier!]]></item>
+ <item name="wcf.global.scrollDown"><![CDATA[Zum Seitenende]]></item>
+ <item name="wcf.global.scrollUp"><![CDATA[Zum Seitenanfang]]></item>
+ <item name="wcf.global.search.matchesExactly"><![CDATA[Exakter Treffer]]></item>
+ <item name="wcf.global.shortTimeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>
+ <item name="wcf.global.shortTimeFormatLocalized"><![CDATA[%e. %B %Y, %H:%M]]></item>
+ <item name="wcf.global.skipToContent"><![CDATA[Zum Seiteninhalt springen]]></item>
+ <item name="wcf.global.sortOrder.ascending"><![CDATA[in aufsteigender Reihenfolge]]></item>
+ <item name="wcf.global.sortOrder.descending"><![CDATA[in absteigender Reihenfolge]]></item>
+ <item name="wcf.global.thousandsSeparator"><![CDATA[ ]]></item>
+ <item name="wcf.global.timeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>
+ <item name="wcf.global.timeFormatLocalized"><![CDATA[%A, %e. %B %Y, %H:%M]]></item>
+ </category>
+ <category name="wcf.imageViewer">
+ <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Bild " + (this.currentIndex + 1) + " von " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>
+ <item name="wcf.imageViewer.close"><![CDATA[Schließen]]></item>
+ <item name="wcf.imageViewer.enlarge"><![CDATA[Nur dieses Bild anzeigen (beendet die Bildbetrachtung)]]></item>
+ <item name="wcf.imageViewer.next"><![CDATA[Nächstes Bild]]></item>
+ <item name="wcf.imageViewer.pause"><![CDATA[Diashow stoppen]]></item>
+ <item name="wcf.imageViewer.play"><![CDATA[Diashow starten (Bildwechsel alle 5 Sekunden)]]></item>
+ <item name="wcf.imageViewer.previous"><![CDATA[Vorheriges Bild]]></item>
+ </category>
+ <category name="wcf.option">
+ <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Kanarische Inseln, Lissabon, London, Monrovia, Ouagadougou, Reykjavík]]></item>
+ <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brüssel, Kopenhagen, Madrid, Paris, Prag, Rom, Sarajevo, Stockholm, Tunis, Warschau, Wien]]></item>
+ <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athen, Beirut, Bukarest, Helsinki, Istanbul, Jerusalem, Kairo, Kapstadt, Khartum, Kiew, Minsk, Sofia]]></item>
+ <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Abeba, Antananarivo, Bagdad, Daressalam, Kampala, Kuwait, Mogadischu, Moskau, Nairobi, Riad]]></item>
+ <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Teheran]]></item>
+ <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Eriwan, Maskat, Réunion, Tiflis]]></item>
+ <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>
+ <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Asgabat, Bischkek, Duschanbe, Islamabad, Jekaterinburg, Karatschi, Malediven, Taschkent]]></item>
+ <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, Neu-Delhi]]></item>
+ <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>
+ <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Nowosibirsk]]></item>
+ <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Kokosinseln, Rangun]]></item>
+ <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnojarsk, Vientiane]]></item>
+ <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hongkong, Irkutsk, Kuala Lumpur, Manila, Peking, Perth, Singapur, Taipeh, Ulan Bator]]></item>
+ <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Australien)]]></item>
+ <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Jakutsk, Osaka, Pjöngjang, Sapporo, Seoul, Tokyo]]></item>
+ <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>
+ <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Wladiwostok]]></item>
+ <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord-Howe-Insel (Australien)]]></item>
+ <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, Neukaledonien, Salomonen]]></item>
+ <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolkinsel]]></item>
+ <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, Bairiki, Fidschi, Kamtschatka, Marshall-Inseln, Wellington]]></item>
+ <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham-Inseln (Neuseeland)]]></item>
+ <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenixinseln]]></item>
+ <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Linieninseln, Weihnachtsinsel]]></item>
+ <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azoren, Kapverdische Inseln]]></item>
+ <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>
+ <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Brasília, Buenos Aires, Cayenne, Georgetown, Grönland, Montevideo]]></item>
+ <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Neufundland]]></item>
+ <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Asunción, Atlantik (Kanada), La Paz, Port-of-Spain, Santiago]]></item>
+ <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>
+ <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Atlanta, Bogotá, Detroit, Lima, Miami, New York, San Francisco de Quito, Toronto]]></item>
+ <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Chicago, Dallas, Kansas City, Mexiko-Stadt, Winnipeg, Zentralamerika]]></item>
+ <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Arizona, Calgary, Chihuahua, Denver, Mazatlan, Salt Lake City]]></item>
+ <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Los Angeles, Seattle, Tijuana, Vancouver]]></item>
+ <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>
+ <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) Französisch-Polynesien]]></item>
+ <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cookinseln, Hawaii]]></item>
+ <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midwayinseln, Samoa]]></item>
+ <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Eniwetok, Kwajalein]]></item>
+ </category>
+ <category name="wcf.page">
+ <item name="wcf.page.pageNo"><![CDATA[Seite {#$pageNo}]]></item>
+ </category>
+ <category name="wcf.user">
+ <item name="wcf.user.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>
+ <item name="wcf.user.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>
+ <item name="wcf.user.email"><![CDATA[E-Mail-Adresse]]></item>
+ <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch.]]></item>
+ <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>
+ <item name="wcf.user.error.email.notUnique"><![CDATA[Diese E-Mail-Adresse ist bereits durch einen anderen Benutzer vergeben.]]></item>
+ <item name="wcf.user.error.email.notValid"><![CDATA[Du hast eine ungültige E-Mail-Adresse eingegeben.]]></item>
+ <item name="wcf.user.error.password.false"><![CDATA[Dieses Kennwort ist falsch.]]></item>
+ <item name="wcf.user.error.username.notFound"><![CDATA[Der Benutzername »{$username}« konnte nicht gefunden werden.]]></item>
+ <item name="wcf.user.error.username.notUnique"><![CDATA[Dieser Benutzername ist bereits vergeben.]]></item>
+ <item name="wcf.user.error.username.notValid"><![CDATA[Du hast einen ungültigen Benutzernamen eingegeben.]]></item>
+ <item name="wcf.user.language"><![CDATA[Sprache]]></item>
+ <item name="wcf.user.language.description"><![CDATA[Wähle aus, in welcher Sprache die Benutzeroberfläche erscheinen soll!]]></item>
+ <item name="wcf.user.logout"><![CDATA[Abmelden]]></item>
+ <item name="wcf.user.password"><![CDATA[Kennwort]]></item>
+ <item name="wcf.user.registrationDate"><![CDATA[Registrierungsdatum]]></item>
+ <item name="wcf.user.userID"><![CDATA[Benutzer-ID]]></item>
+ <item name="wcf.user.username"><![CDATA[Benutzername]]></item>
+ <item name="wcf.user.visibleLanguages"><![CDATA[Zeige Inhalte in folgenden Sprachen an]]></item>
+ <item name="wcf.user.visibleLanguages.description"><![CDATA[Gib an, in welchen Sprachen erstellte Inhalte angezeigt werden sollen.]]></item>
+ </category>
+ <category name="wcf.user.option">
+ <item name="wcf.user.option.error.validationFailed"><![CDATA[Du hast einen ungültigen Inhalt eingegeben.]]></item>
+ </category>
</language>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de">\r
- <category name="wcf.acp">\r
- <item name="wcf.acp"><![CDATA[Administrationsoberfläche]]></item>\r
- <item name="wcf.acp.help"><![CDATA[Hilfe]]></item>\r
- <item name="wcf.acp.help.complete"><![CDATA[Vollständige Hilfe]]></item>\r
- <item name="wcf.acp.help.disable"><![CDATA[Hilfe deaktivieren]]></item>\r
- <item name="wcf.acp.help.interactive"><![CDATA[Interaktive Hilfe]]></item>\r
- <item name="wcf.acp.packageQuickAccess"><![CDATA[Paket wechseln]]></item>\r
- <item name="wcf.acp.search.extended"><![CDATA[Erweiterte Suche ...]]></item>\r
- <item name="wcf.acp.sitemap"><![CDATA[Sitemap]]></item>\r
- </category>\r
- <category name="wcf.acp.cache">\r
- <item name="wcf.acp.cache.button.clear"><![CDATA[Cache leeren]]></item>\r
- <item name="wcf.acp.cache.clear.success"><![CDATA[Der Cache wurde erfolgreich gelöscht.]]></item>\r
- <item name="wcf.acp.cache.clear.sure"><![CDATA[Wollen Sie den Cache wirklich komplett leeren?]]></item>\r
- <item name="wcf.acp.cache.data"><![CDATA[Eigenschaften]]></item>\r
- <item name="wcf.acp.cache.data.files"><![CDATA[Dateien]]></item>\r
- <item name="wcf.acp.cache.data.size"><![CDATA[Größe]]></item>\r
- <item name="wcf.acp.cache.data.source"><![CDATA[Quelle]]></item>\r
- <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>\r
- <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>\r
- <item name="wcf.acp.cache.list.mtime"><![CDATA[Letzte Aktualisierung]]></item>\r
- <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>\r
- <item name="wcf.acp.cache.list.perm"><![CDATA[Zugriffsrechte]]></item>\r
- <item name="wcf.acp.cache.list.size"><![CDATA[Größe]]></item>\r
- </category>\r
- <category name="wcf.acp.cronjob">\r
- <item name="wcf.acp.cronjob.active"><![CDATA[Aktiv]]></item>\r
- <item name="wcf.acp.cronjob.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>\r
- <item name="wcf.acp.cronjob.add.data"><![CDATA[Allgemeine Daten]]></item>\r
- <item name="wcf.acp.cronjob.add.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde hinzugefügt.]]></item>\r
- <item name="wcf.acp.cronjob.add.timing"><![CDATA[Zeitsteuerung]]></item>\r
- <item name="wcf.acp.cronjob.className"><![CDATA[Pfad zur Klasse]]></item>\r
- <item name="wcf.acp.cronjob.className.description"><![CDATA[Geben Sie den Pfad zu der PHP-Datei an, die die entsprechende auszuführende Klasse enthält. Die Pfadangabe muss relativ zum Installationsverzeichnis der ausgewählten Endanwendung sein.]]></item>\r
- <item name="wcf.acp.cronjob.cronjobID"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.cronjob.delete"><![CDATA[Zeitgesteuerte Aufgabe löschen]]></item>\r
- <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht gelöscht werden.]]></item>\r
- <item name="wcf.acp.cronjob.delete.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde gelöscht.]]></item>\r
- <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Sind Sie sicher, dass Sie diese zeitgesteuerte Aufgabe löschen möchten?]]></item>\r
- <item name="wcf.acp.cronjob.description"><![CDATA[Beschreibung]]></item>\r
- <item name="wcf.acp.cronjob.description.description"><![CDATA[Hier können Sie eine kurze Beschreibung der Aufgabe eintragen.]]></item>\r
- <item name="wcf.acp.cronjob.disable"><![CDATA[Deaktivieren]]></item>\r
- <item name="wcf.acp.cronjob.edit"><![CDATA[Zeitgesteuerte Aufgabe bearbeiten]]></item>\r
- <item name="wcf.acp.cronjob.edit.data"><![CDATA[Allgemeine Daten]]></item>\r
- <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht verändert werden.]]></item>\r
- <item name="wcf.acp.cronjob.edit.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde erfolgreich geändert.]]></item>\r
- <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Zeitsteuerung]]></item>\r
- <item name="wcf.acp.cronjob.enable"><![CDATA[Aktivieren]]></item>\r
- <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[Der angegebene Pfad ist ungültig.]]></item>\r
- <item name="wcf.acp.cronjob.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>\r
- <item name="wcf.acp.cronjob.error.notValid"><![CDATA[Das Zeitformat ist ungültig.]]></item>\r
- <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Zeitgesteuerte Aufgabe mehrfach ausführen]]></item>\r
- <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[Durch Aktivieren dieser Option wird die Aufgabe mehrfach ausgeführt, wenn zwischen dem letzten Ausführungszeitpunkt und dem aktuellen Zeitpunkt weitere Ausführungszeitpunkte liegen.]]></item>\r
- <item name="wcf.acp.cronjob.execute"><![CDATA[Aufgabe jetzt ausführen]]></item>\r
- <item name="wcf.acp.cronjob.execute.success"><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt.]]></item>\r
- <item name="wcf.acp.cronjob.inactive"><![CDATA[Inaktiv]]></item>\r
- <item name="wcf.acp.cronjob.info"><![CDATA[Allgemeine Informationen]]></item>\r
- <item name="wcf.acp.cronjob.intro"><![CDATA[Das Anlegen von zeitgesteuerten Aufgaben erfordert eine genaue Kenntnis der Crontab-Syntax auf unixähnlichen Systemen. Weiterführende Informationen dazu erhalten Sie auf dieser Website: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>]]></item>\r
- <item name="wcf.acp.cronjob.lastExec"><![CDATA[Letzte Ausführung]]></item>\r
- <item name="wcf.acp.cronjob.list"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
- <item name="wcf.acp.cronjob.list.count"><![CDATA[Insgesamt {#$items} zeitgesteuerte Aufgabe{if $items != 1}n{/if}]]></item>\r
- <item name="wcf.acp.cronjob.log"><![CDATA[Protokoll der ausgeführten zeitgesteuerten Aufgaben]]></item>\r
- <item name="wcf.acp.cronjob.log.clear"><![CDATA[Alle löschen]]></item>\r
- <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Sind Sie sicher, dass Sie alle Protokoll-Einträge löschen möchten?]]></item>\r
- <item name="wcf.acp.cronjob.log.data"><![CDATA[Insgesamt {#$items} {if $items == 1}Eintrag{else}Einträge{/if}]]></item>\r
- <item name="wcf.acp.cronjob.log.error"><![CDATA[Fehler:]]></item>\r
- <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Ausgeführt]]></item>\r
- <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[Derzeit sind keine Einträge vorhanden.]]></item>\r
- <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>\r
- <item name="wcf.acp.cronjob.nextExec"><![CDATA[Nächste Ausführung]]></item>\r
- <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[Derzeit ist keine zeitgesteuerte Aufgabe vorhanden.]]></item>\r
- <item name="wcf.acp.cronjob.packageName"><![CDATA[Installiert von]]></item>\r
- <item name="wcf.acp.cronjob.runNow"><![CDATA[Jetzt ausführen]]></item>\r
- <item name="wcf.acp.cronjob.startDom"><![CDATA[Tag des Monats]]></item>\r
- <item name="wcf.acp.cronjob.startDom.description"><![CDATA[An diesen Tagen des Monats (1 - 31) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>\r
- <item name="wcf.acp.cronjob.startDow"><![CDATA[Tag der Woche]]></item>\r
- <item name="wcf.acp.cronjob.startDow.description"><![CDATA[An diesen Tagen der Woche (0 - 6 mit Sonntag = 0 oder mon - sun) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>\r
- <item name="wcf.acp.cronjob.startHour"><![CDATA[Stunde]]></item>\r
- <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Zu diesen Stunden (0 - 23) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>\r
- <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>\r
- <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Zu diesen Minuten (0 - 59) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>\r
- <item name="wcf.acp.cronjob.startMonth"><![CDATA[Monat]]></item>\r
- <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[In diesen Monaten (1 - 12 oder jan - dec) soll die Aufgabe ausgeführt werden.]]></item>\r
- <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>\r
- <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>\r
- <item name="wcf.acp.cronjob.subtitle"><![CDATA[»Cronjobs«]]></item>\r
- </category>\r
- <category name="wcf.acp.group">\r
- <item name="wcf.acp.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>\r
- <item name="wcf.acp.group.add.permissions"><![CDATA[Zugriffsrechte]]></item>\r
- <item name="wcf.acp.group.add.success"><![CDATA[Die Benutzergruppe wurde erfolgreich angelegt.]]></item>\r
- <item name="wcf.acp.group.administrators"><![CDATA[Administratoren]]></item>\r
- <item name="wcf.acp.group.data"><![CDATA[Allgemeine Daten]]></item>\r
- <item name="wcf.acp.group.delete"><![CDATA[Benutzergruppe löschen]]></item>\r
- <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}Die Benutzergruppe wurde{else}{#$deletedGroups} Benutzergruppen wurden{/if} erfolgreich gelöscht.]]></item>\r
- <item name="wcf.acp.group.delete.sure"><![CDATA[Wollen Sie diese Benutzergruppe wirklich löschen?]]></item>\r
- <item name="wcf.acp.group.edit"><![CDATA[Benutzergruppe bearbeiten]]></item>\r
- <item name="wcf.acp.group.edit.success"><![CDATA[Ihre Änderungen an der Benutzergruppe wurde erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[Sie sind selbst Mitglied dieser Benutzergruppe. Änderungen an den Zugriffsrechten dieser Benutzergruppe können womöglich dazu führen, dass Sie aus der Administrationsoberfläche ausgeschlossen werden. Bitte seien Sie entsprechend vorsichtig!]]></item>\r
- <item name="wcf.acp.group.everyone"><![CDATA[Jeder]]></item>\r
- <item name="wcf.acp.group.groupID"><![CDATA[Gruppen-ID]]></item>\r
- <item name="wcf.acp.group.groupName"><![CDATA[Name der Benutzergruppe]]></item>\r
- <item name="wcf.acp.group.groupName.description"><![CDATA[Geben Sie einen Namen für die Gruppe an.]]></item>\r
- <item name="wcf.acp.group.guests"><![CDATA[Gäste]]></item>\r
- <item name="wcf.acp.group.list"><![CDATA[Benutzergruppen]]></item>\r
- <item name="wcf.acp.group.list.data"><![CDATA[Insgesamt {#$items} Benutzergruppen]]></item>\r
- <item name="wcf.acp.group.members"><![CDATA[Anzahl Mitglieder]]></item>\r
- <item name="wcf.acp.group.moderators"><![CDATA[Moderatoren]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Kann Administrationsoberfläche betreten]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Mitglieder dieser Benutzergruppe können die Administrationsoberfläche betreten und dort abhängig von den weiteren Zugriffsrechten verschiedene Aktionen durchführen. Diese Option muss aktiviert sein, wenn diesen Benutzern andere administrative Funktionen erlaubt werden sollen.]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Kann versteckte Profilinformationen sehen]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Mitglieder dieser Benutzergruppe können die versteckten Informationen in Benutzerprofilen sehen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Kann allgemeine Einstellungen vornehmen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Mitglieder dieser Benutzergruppe können die allgemeinen System-Einstellungen sehen und bearbeiten. Z.B. Forum ein-/ausschalten.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Kann Protokolle abrufen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können die System-Protokolle abrufen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Kann neue zeitgesteuerte Aufgaben anlegen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue zeitgesteuerte Aufgaben anlegen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben löschen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben löschen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Kann Protokoll der zeitgesteuerten Aufgaben löschen]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Protokoll der zeitgesteuerten Aufgaben löschen. Bei der Ausführung einer zeitgesteuerten Aufgabe wird festgehalten, ob dieser erfolgreich ausgeführt wurde.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben ändern]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben deaktivieren]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben deaktivieren. Diese werden dann nicht mehr ausgeführt, können später jedoch auch wieder aktiviert werden.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Kann Update-Server bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Update-Server bearbeiten und neue hinzufügen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Kann Pakete installieren]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können zusätzliche Pakete installieren.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Kann Pakete deinstallieren]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete entfernen.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Kann Pakete aktualisieren]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete aktualisieren.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Zugängliche Benutzergruppen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Mitglieder dieser Benutzergruppe haben auf diese Gruppen Zugriff. Zusätzlich muss angegeben werden, ob z.B. die Benutzergruppe bearbeitet werden darf.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Kann neue Benutzergruppen erstellen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzergruppen erstellen.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Kann neue Benutzer erstellen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzer erstellen. Ist bei "Zugängliche Benutzergruppen" eine Option aktiviert, kann diese Gruppe beim Erstellen des Benutzers zugewiesen werden.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Kann Benutzergruppen löschen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen löschen.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Kann Benutzer löschen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer löschen.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Kann Benutzergruppen bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Kann E-Mail-Adressen bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Kann Kennwörter bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Kennwort von anderen Benutzern bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Kann Benutzer bearbeiten]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer bearbeiten.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Kann E-Mails an Benutzer senden]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern sehen und ihnen E-Mails senden.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Kann Benutzer suchen]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer und deren Profile durchsuchen.]]></item>\r
- <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrative Rechte]]></item>\r
- <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Inhalte]]></item>\r
- <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Darstellung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.general"><![CDATA[Allgemeine administrative Rechte]]></item>\r
- <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Wartung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System-Funktionen]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Paketverwaltung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user"><![CDATA[Benutzer-Funktionen]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Gruppenverwaltung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[Benutzerverwaltung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderative Rechte]]></item>\r
- <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.user"><![CDATA[Allgemeine Rechte]]></item>\r
- <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>\r
- <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Kann deaktivierte Stile benutzen]]></item>\r
- <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Mitglieder dieser Benutzergruppe können deaktivierte Stile auswählen.]]></item>\r
- <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Stil-Verwaltung]]></item>\r
- <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.showMembers"><![CDATA[Zeige die Mitglieder dieser Benutzergruppe]]></item>\r
- <item name="wcf.acp.group.superModerators"><![CDATA[Super Moderatoren]]></item>\r
- <item name="wcf.acp.group.users"><![CDATA[Registrierte Benutzer]]></item>\r
- </category>\r
- <category name="wcf.acp.login">\r
- <item name="wcf.acp.login"><![CDATA[Anmeldung]]></item>\r
- <item name="wcf.acp.login.data"><![CDATA[Zugangsdaten]]></item>\r
- </category>\r
- <category name="wcf.acp.masterPassword">\r
- <item name="wcf.acp.masterPassword"><![CDATA[Hauptkennwort]]></item>\r
- <item name="wcf.acp.masterPassword.confirm"><![CDATA[Hauptkennwort wiederholen]]></item>\r
- <item name="wcf.acp.masterPassword.enter"><![CDATA[Hauptkennwort erforderlich]]></item>\r
- <item name="wcf.acp.masterPassword.enter.description"><![CDATA[Die aufgerufene Seite oder Aktion erfordert aus Sicherheitsgründen die Eingabe des Hauptkennwortes. Pro Sitzung ist die Eingabe des Hauptkennwortes nur einmal erforderlich. Falls Sie das Hauptkennwort vergessen haben sollten, können Sie es zurücksetzen, indem Sie die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschen.]]></item>\r
- <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[Das Hauptkennwort ist nicht korrekt. Falls Sie das Hauptkennwort vergessen haben sollten, können Sie es zurücksetzen, indem Sie die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschen.]]></item>\r
- <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>\r
- <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[Das Kennwort wurde als unsicher erkannt. Das Kennwort sollte mindestens acht Zeichen lang sein, große und kleine lateinische Buchstaben, Zahlen und Sonderzeichen enthalten. Es darf nicht mit den Kennwörtern von anderen Administratoren übereinstimmen.]]></item>\r
- <item name="wcf.acp.masterPassword.example"><![CDATA[Vorschlag]]></item>\r
- <item name="wcf.acp.masterPassword.example.set"><![CDATA[Vorschlag übernehmen]]></item>\r
- <item name="wcf.acp.masterPassword.init"><![CDATA[Hauptkennwort festlegen]]></item>\r
- <item name="wcf.acp.masterPassword.init.description"><![CDATA[Das Hauptkennwort ist ein zusätzlicher Schutz für sicherheitskritische Funktionen. Sie sollten hier ein möglichst sicheres Kennwort verwenden, dass sich von Ihrem normalen Administrator-Kennwort unterscheidet, Dritten nicht bekannt ist und auch nicht auf anderen Internetseiten verwendet wird.]]></item>\r
- </category>\r
- <category name="wcf.acp.menu">\r
- <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatisches Update]]></item>\r
- <item name="wcf.acp.menu.link.content"><![CDATA[Inhalte]]></item>\r
- <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>\r
- <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[Zeitgesteuerte Aufgaben]]></item>\r
- <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[Zeitgesteuerte Aufgaben auflisten]]></item>\r
- <item name="wcf.acp.menu.link.display"><![CDATA[Darstellung]]></item>\r
- <item name="wcf.acp.menu.link.group"><![CDATA[Benutzergruppen]]></item>\r
- <item name="wcf.acp.menu.link.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>\r
- <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-Mail an Gruppenmitglieder]]></item>\r
- <item name="wcf.acp.menu.link.group.view"><![CDATA[Benutzergruppen auflisten]]></item>\r
- <item name="wcf.acp.menu.link.log"><![CDATA[Protokoll]]></item>\r
- <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>\r
- <item name="wcf.acp.menu.link.log.session"><![CDATA[Sitzungen]]></item>\r
- <item name="wcf.acp.menu.link.maintenance"><![CDATA[Wartung]]></item>\r
- <item name="wcf.acp.menu.link.option"><![CDATA[Optionen]]></item>\r
- <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Sichern & Wiederherstellen]]></item>\r
- <item name="wcf.acp.menu.link.package"><![CDATA[Paketverwaltung]]></item>\r
- <item name="wcf.acp.menu.link.package.database"><![CDATA[Pakete suchen]]></item>\r
- <item name="wcf.acp.menu.link.package.install"><![CDATA[Paket installieren]]></item>\r
- <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Server hinzufügen]]></item>\r
- <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server auflisten]]></item>\r
- <item name="wcf.acp.menu.link.package.view"><![CDATA[Pakete auflisten]]></item>\r
- <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>\r
- <item name="wcf.acp.menu.link.user"><![CDATA[Benutzer]]></item>\r
- <item name="wcf.acp.menu.link.user.add"><![CDATA[Benutzer hinzufügen]]></item>\r
- <item name="wcf.acp.menu.link.user.list"><![CDATA[Benutzer auflisten]]></item>\r
- <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-Mail an alle Benutzer]]></item>\r
- <item name="wcf.acp.menu.link.user.management"><![CDATA[Benutzer]]></item>\r
- <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>\r
- <item name="wcf.acp.menu.link.user.search"><![CDATA[Benutzer suchen]]></item>\r
- </category>\r
- <category name="wcf.acp.option">\r
- <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Hostname ausschließen]]></item>\r
- <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Geben Sie pro Zeile einen Hostname an, die Sie von der Seite ausschließen möchten.]]></item>\r
- <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[IP-Adresse ausschließen]]></item>\r
- <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Geben Sie pro Zeile eine IP-Adresse an, die Sie von der Seite ausschließen möchten.]]></item>\r
- <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Browser-Kennung ausschließen]]></item>\r
- <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Geben Sie pro Zeile eine Browser-Kennung (User-Agent) an, die Sie von der Seite ausschließen möchten.]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache-Server]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Geben Sie hier die Adresse des Memcache-Servers ein! Mehrere Server können zeilenweise angegeben werden.]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Persistente Verbindungen aktivieren]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[Sollen beim Verbinden mit dem Memcache-Server persistente Verbindungen genutzt werden?]]></item>\r
- <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache-Methode]]></item>\r
- <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>\r
- <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Bitte wählen Sie die gewünschte Cache-Methode aus! Beachten Sie, dass einige Methoden spezielle Anforderungen an das Server-System stellen und nicht auf jedem Server zur Verfügung stehen.]]></item>\r
- <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[Dateisystem (Standard)]]></item>\r
- <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (Experimentell)]]></item>\r
- <item name="wcf.acp.option.category.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>\r
- <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.cache.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>\r
- <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache speichert häufig benötige Daten im Arbeitsspeicher zwischen. Dies kann die Last auf die Datenbank und das Dateisystem drastisch reduzieren. Lesen Sie mehr über dieses Thema auf der folgenden Seite:\r
-<ul>\r
- <li><a href="http://memcached.org/">memcached.org</a></li>\r
-</ul>]]></item>\r
- <item name="wcf.acp.option.category.general.date"><![CDATA[Datum & Zeit]]></item>\r
- <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>\r
- <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>\r
- <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>\r
- <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy-Server]]></item>\r
- <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[Hier können Sie optional Proxy-Server für Verbindungen zu externen Servern konfigurieren.]]></item>\r
- <item name="wcf.acp.option.category.general.mail"><![CDATA[E-Mails]]></item>\r
- <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.mail.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Versand]]></item>\r
- <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.offline"><![CDATA[Wartungsmodus]]></item>\r
- <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module"><![CDATA[Module an / aus]]></item>\r
- <item name="wcf.acp.option.category.module.content"><![CDATA[Inhalte]]></item>\r
- <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.display"><![CDATA[Darstellung]]></item>\r
- <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>\r
- <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.user"><![CDATA[Benutzer]]></item>\r
- <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security"><![CDATA[Sicherheit]]></item>\r
- <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>\r
- <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internetseiten werden häufig durch andere Programme angegriffen. So gibt es beispielsweise die Möglichkeit, automatisiert hunderte von Benutzerkonten zu erstellen. Um sich davor zu schützen, können Sie an verschiedenen Stellen ein sogenanntes <a href="http://de.wikipedia.org/wiki/Captcha" class="externalURL">Captcha-Bild</a> anzeigen lassen. Unregistrierte Benutzer müssen erst den Code eingeben, der auf diesem Bild steht. Roboter können diesen Code nicht lesen. Beachten Sie, dass Captcha-Bilder von blinden und sehbehinderten Benutzern nicht identifiziert werden können.]]></item>\r
- <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>\r
- <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.censorship"><![CDATA[Zensur]]></item>\r
- <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sitzungen]]></item>\r
- <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.user"><![CDATA[Mitglieder]]></item>\r
- <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookiedomain]]></item>\r
- <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Hier können Sie optional eine Domain angeben, unter der der Cookie laufen soll. Standardmäßig sollten Sie dieses Feld frei lassen, da ein Ausfüllen nur in wenigen Fällen notwendig ist.]]></item>\r
- <item name="wcf.acp.option.cookie_path"><![CDATA[Cookiepfad]]></item>\r
- <item name="wcf.acp.option.cookie_path.description"><![CDATA[Der Cookiepfad wird absolut zum Document Root angegeben - also z.B. "/forum" für http://www.woltlab.de/forum.]]></item>\r
- <item name="wcf.acp.option.cookie_prefix"><![CDATA[Präfix für Cookienamen]]></item>\r
- <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Geben Sie einen Präfix an, der bei Cookienamen verwendet wird.]]></item>\r
- <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Uhr automatisch auf Sommer-/Winterzeit umstellen]]></item>\r
- <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Soll die Uhr automatisch auf Sommer-/Winterzeit umgestellt werden?]]></item>\r
- <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Cache-Methode für Sitzungsdaten verwenden]]></item>\r
- <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Soll für die Speicherung der Sitzungsdaten die ausgewählte Cache-Methode verwendet werden?]]></item>\r
- <item name="wcf.acp.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>\r
- <item name="wcf.acp.option.export"><![CDATA[Optionen sichern]]></item>\r
- <item name="wcf.acp.option.export.download"><![CDATA[Sicherung der Optionen herunterladen]]></item>\r
- <item name="wcf.acp.option.export.download.description"><![CDATA[Laden Sie eine Sicherung der Optionen auf Ihren lokalen Rechner herunter.]]></item>\r
- <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Gzip-Komprimierung aktivieren]]></item>\r
- <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Durch Aktivierung dieser Option werden die Inhalte komprimiert vom Server an den Client gesendet. Dies reduziert den Traffic.]]></item>\r
- <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Seitencaching im Client-Browser verhindern]]></item>\r
- <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Durch Aktivierung dieser Option können Sie das Caching der Seite im Browser verhindern.]]></item>\r
- <item name="wcf.acp.option.http_gzip_level"><![CDATA[Gzip-Komprimierungslevel]]></item>\r
- <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[Werte von 1-9 sind zulässig. Als Optimum zwischen Komprimierung und Serverlast empfiehlt sich Level 1.]]></item>\r
- <item name="wcf.acp.option.import"><![CDATA[Optionen wiederherstellen]]></item>\r
- <item name="wcf.acp.option.import.error.importFailed"><![CDATA[Die Optionen konnten nicht erfolgreich importiert werden.]]></item>\r
- <item name="wcf.acp.option.import.success"><![CDATA[Die Optionen wurden erfolgreich importiert.]]></item>\r
- <item name="wcf.acp.option.import.upload"><![CDATA[Sicherung der Optionen vom lokalen Computer hochladen]]></item>\r
- <item name="wcf.acp.option.import.upload.description"><![CDATA[Geben Sie eine Sicherung der Optionen von Ihrem lokalen Rechner an.]]></item>\r
- <item name="wcf.acp.option.importAndExport"><![CDATA[Optionen sichern & wiederherstellen]]></item>\r
- <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator-Adresse]]></item>\r
- <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Geben Sie die E-Mail-Adresse des Administrators an.]]></item>\r
- <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Logfile-Pfad]]></item>\r
- <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Geben Sie den Pfad zum Logfile an.]]></item>\r
- <item name="wcf.acp.option.mail_from_address"><![CDATA[Absender-Adresse]]></item>\r
- <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Geben Sie die Absender-Adresse bei automatisch generierten E-Mails an.]]></item>\r
- <item name="wcf.acp.option.mail_from_name"><![CDATA[Absender-Name]]></item>\r
- <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Geben Sie den Namen des Absenders bei automatisch generierten E-Mails an.]]></item>\r
- <item name="wcf.acp.option.mail_send_method"><![CDATA[Versandmethode]]></item>\r
- <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>\r
- <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Wählen Sie eine Versandmethode aus.]]></item>\r
- <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>\r
- <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>\r
- <item name="wcf.acp.option.mail_signature"><![CDATA[Signatur]]></item>\r
- <item name="wcf.acp.option.mail_signature.description"><![CDATA[Tragen Sie hier eine Signatur ein, die bei System-E-Mails angezeigt werden soll.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP-Server]]></item>\r
- <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Tragen Sie hier den SMTP-Server ein.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP-Kennwort]]></item>\r
- <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Geben Sie das SMTP-Kennwort an.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP-Port]]></item>\r
- <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Geben Sie den SMTP-Port an.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP-Benutzer]]></item>\r
- <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Geben Sie den SMTP-Benutzer an.]]></item>\r
- <item name="wcf.acp.option.mail_use_f_param"><![CDATA[»-f« Parameter verwenden]]></item>\r
- <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Manche Server benötigen den »-f« Parameter beim Versenden von E-Mails. Falls Sie Probleme mit dem Versand von E-Mails haben, aktivieren Sie diese Einstellung.]]></item>\r
- <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Formatierte E-Mail-Adressen verwenden]]></item>\r
- <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Absender- und Empfänger-Adressen werden in folgendes Format gebracht: "Name <email@domain.tld>". Diese Funktion wird nicht von allen Mailservern unterstützt und sollte daher bei Problemen abgeschaltet werden.]]></item>\r
- <item name="wcf.acp.option.module_master_password"><![CDATA[Hauptkennwort aktivieren]]></item>\r
- <item name="wcf.acp.option.module_master_password.description"><![CDATA[Aktiviert die zusätzliche Eingabe eines Kennworts beim Aufruf von sicherheitskritischen Bereichen.]]></item>\r
- <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>\r
- <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server für HTTP-Verbindungen]]></item>\r
- <item name="wcf.acp.option.session_timeout"><![CDATA[Gültigkeitslänge einer Sitzung]]></item>\r
- <item name="wcf.acp.option.session_timeout.description"><![CDATA[Geben Sie an, wie lange die Sitzung gültig ist [Sekunden]. ]]></item>\r
- <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[IP-Adresse der Sitzung überprüfen]]></item>\r
- <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[Anzahl der Blöcke der IP-Adresse die beim Auslesen der Sitzung überprüft werden sollen. Eine hohe Einstellung kann Benutzer ausschließen, die mit wechselnden IP-Adressen im Internet unterwegs sind.]]></item>\r
- <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Browser-Kennung der Sitzung überprüfen]]></item>\r
- <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Soll die Browser-Kennung beim Auslesen der Sitzung überprüft werden?]]></item>\r
- <item name="wcf.acp.option.success"><![CDATA[Ihre Einstellungsänderungen wurden erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.option.timezone"><![CDATA[Zeitzone]]></item>\r
- <item name="wcf.acp.option.timezone.description"><![CDATA[Wählen Sie die Standard Zeitzone Ihrer Seite.]]></item>\r
- <item name="wcf.acp.option.user_online_timeout"><![CDATA[Timeout für Benutzer-Online]]></item>\r
- <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Geben Sie an, wie lange der Benutzer trotz Inaktivität als online markiert werden soll [Sekunden].]]></item>\r
- <item name="wcf.acp.option.category.general.page"><![CDATA[Seite]]></item>\r
- <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.meta_description"><![CDATA[Meta Description]]></item>\r
- <item name="wcf.acp.option.meta_description.description"><![CDATA[Geben Sie eine Meta Description an.]]></item>\r
- <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta Keywords]]></item>\r
- <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Tragen Sie die Wörter ein, die im Meta-Tag Keywords stehen sollen.]]></item>\r
- <item name="wcf.acp.option.page_description"><![CDATA[Seitenbeschreibung]]></item>\r
- <item name="wcf.acp.option.page_description.description"><![CDATA[Fügen Sie hier eine kurze Beschreibung Ihrer Seite ein.]]></item>\r
- <item name="wcf.acp.option.page_title"><![CDATA[Titel der Seite]]></item>\r
- <item name="wcf.acp.option.page_title.description"><![CDATA[Geben Sie hier den Globalen Titel der Seite an. Dieser Titel wird im Seitenkopf dargestellt, wenn Sie die Anzeige dieses Textes im Stileditor aktiviert haben.]]></item>\r
- <item name="wcf.acp.option.page_url"><![CDATA[Adresse (URL) der Seite]]></item>\r
- <item name="wcf.acp.option.page_url.description"><![CDATA[Geben Sie an, unter welcher Adresse (URL) die Seite aufzurufen ist (ohne abschließenden Slash).]]></item>\r
- <item name="wcf.acp.option.page_urls"><![CDATA[Weitere URLs]]></item>\r
- <item name="wcf.acp.option.page_urls.description"><![CDATA[Geben Sie hier weitere URLs an, unter denen Ihre Seite erreichbar ist.]]></item>\r
- </category>\r
- <category name="wcf.acp.package">\r
- <item name="wcf.acp.package.cancel"><![CDATA[Abbruch der Paketinstallation]]></item>\r
- <item name="wcf.acp.package.description"><![CDATA[Beschreibung]]></item>\r
- <item name="wcf.acp.package.install"><![CDATA[Paketinstallation]]></item>\r
- <item name="wcf.acp.package.install.cancel"><![CDATA[Installation abbrechen]]></item>\r
- <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Wollen Sie die Installation wirklich abbrechen?]]></item>\r
- <item name="wcf.acp.package.install.error"><![CDATA[Die Abhängigkeiten dieses Paketes konnten nicht aufgelöst werden.]]></item>\r
- <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[Die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket »{$packageName}« in Version {$packageVersion} kann aufgrund von Inkompatibilitäten zu {if $excludedPackages|count == 1}folgendem Paket{else}folgenden Paketen{/if} nicht durchgeführt werden:]]></item>\r
- <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in Version {$excludedPackage.packageVersion}]]></item>\r
- <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket lässt{else}Folgende Pakete lassen{/if} die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket »{$packageName}« in Version {$packageVersion} aufgrund von Inkompatibilitäten nicht zu:]]></item>\r
- <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in Version {$excludingPackage.packageVersion}]]></item>\r
- <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket ist{else}Folgende Pakete sind{/if} mit dem Paket »{$packageName}« in Version {$packageVersion} nicht kompatibel. Wenn Sie die Installation fortführen, {if $excludingPackages|count == 1}wird das Paket{else}werden die Pakete{/if} vermutlich nicht mehr korrekt funktionieren.]]></item>\r
- <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}ist bereits installiert{else}{if $package.file|isset}liegt dem Paket bei{else}fehlt{/if}{/if})</span>]]></item>\r
- <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Wollen Sie die Paketinstallation wirklich abbrechen?]]></item>\r
- <item name="wcf.acp.package.install.updatableInstances"><![CDATA[Folgende Pakete können mit diesem Paket aktualisiert werden]]></item>\r
- <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Wählen Sie eines der folgenden Pakete aus, um seine Version zu aktualisieren. Falls Sie das Paket neu installieren möchten, klicken Sie unten auf »Weiter«.]]></item>\r
- <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[Es ist bereits eine Kopie dieses Paketes installiert. Wenn Sie fortfahren, wird eine weitere Kopie dieses Paketes installiert. Falls Sie eine vorhandene Kopie dieses Paketes aktualisieren möchten, wählen Sie die Kopie aus der folgenden Liste aus.]]></item>\r
- <item name="wcf.acp.package.install.version"><![CDATA[Version des Paketes:]]></item>\r
- <item name="wcf.acp.package.installDate"><![CDATA[Installationsdatum]]></item>\r
- <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[Beim Versuch die Dateien des Paketes zu entpacken, ist folgender Fehler aufgetreten:]]></item>\r
- <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[Folgende Dateien konnten nicht erfolgreich entpackt werden. Bitte überprüfen Sie, ob der entsprechende Zielort beschreibbar ist.]]></item>\r
- <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Tabellen Konflikt]]></item>\r
- <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Keine Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>\r
- <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Alle Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>\r
- <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Notwendige Änderungen]]></item>\r
- <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Betroffene Tabelle]]></item>\r
- <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Vorhandene Tabellen Ihrer Datenbank stehen im Konflikt mit Tabellen, die für dieses Paket installiert werden müssen. Bitte wählen Sie aus, ob diese Tabellen überschrieben werden sollen.]]></item>\r
- <item name="wcf.acp.package.list"><![CDATA[Installierte Pakete]]></item>\r
- <item name="wcf.acp.package.list.author"><![CDATA[Hersteller]]></item>\r
- <item name="wcf.acp.package.list.count"><![CDATA[Insgesamt sind {#$items} Pakete installiert.]]></item>\r
- <item name="wcf.acp.package.list.date"><![CDATA[Herstellungsdatum]]></item>\r
- <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>\r
- <item name="wcf.acp.package.list.other"><![CDATA[Sonstiges Paket]]></item>\r
- <item name="wcf.acp.package.list.plugin"><![CDATA[Zusatzmodul]]></item>\r
- <item name="wcf.acp.package.list.standalone"><![CDATA[Endanwendung]]></item>\r
- <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>\r
- <item name="wcf.acp.package.optionals"><![CDATA[Optionale Zusatzpakete installieren]]></item>\r
- <item name="wcf.acp.package.optionals.description"><![CDATA[Das aktuelle Paket bringt folgende optionale Zusatzpakete mit. Bitte wählen Sie aus, welche Zusatzpakete Sie installieren möchten.]]></item>\r
- <item name="wcf.acp.package.optionals.installed"><![CDATA[ (Dieses Paket ist bereits installiert.)]]></item>\r
- <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (Die Voraussetzungen für dieses Paket werden nicht erfüllt.)]]></item>\r
- <item name="wcf.acp.package.packageDir"><![CDATA[Installationsverzeichnis]]></item>\r
- <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Es ist bereits eine andere Anwendung in dem angegebenen Verzeichnis installiert.]]></item>\r
- <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>\r
- <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[Das angegebene Verzeichnis ist nicht beschreibbar.]]></item>\r
- <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[Das angegebene Verzeichnis wird bereits von WoltLab Community Framework beansprucht. Bitte wählen Sie ein anderes Verzeichnis.]]></item>\r
- <item name="wcf.acp.package.packageDir.input"><![CDATA[Bitte geben Sie hier das Installationsverzeichnis an.]]></item>\r
- <item name="wcf.acp.package.packageDir.url"><![CDATA[Nach der Installation in das angegebene Installationsverzeichnis ist die Anwendung über folgende Adresse (URL) erreichbar:]]></item>\r
- <item name="wcf.acp.package.requirements"><![CDATA[Abhängigkeiten auswählen]]></item>\r
- <item name="wcf.acp.package.requirements.description"><![CDATA[Das aktuelle Paket benötigt Pakete, von denen mehrere Instanzen installiert sind. Bitte wählen Sie aus, zu welcher Instanz jeweils eine Abhängigkeit hergestellt werden soll.]]></item>\r
- <item name="wcf.acp.package.rollback"><![CDATA[Paketinstallation zurücksetzen]]></item>\r
- <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright © {$packageAuthor}]]></item>\r
- <item name="wcf.acp.package.startInstall"><![CDATA[Neues Paket installieren]]></item>\r
- <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[Das angegebene Paket lässt keine Neuinstallation zu.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[Das angegebene Archiv ist kein gültiges Paket.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[Paket »{$package->getName()}« kann mit dem angegebenen Archiv nicht aktualisiert werden.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[Es konnte keine Datei unter dem angegebenen Pfad gefunden wurden.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[Dieses Paket ist bereits installiert. Das Paket kann nicht mehrfach installiert werden.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[Das Hochladen der ausgewählten Datei ist fehlgeschlagen.]]></item>\r
- <item name="wcf.acp.package.startInstall.source"><![CDATA[Quelle auswählen]]></item>\r
- <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Direkten Pfad zum Paket angeben]]></item>\r
- <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Geben Sie den direkten Pfad zur Paketdatei an. Dabei kann es sich um die Internet Adresse der Paketdatei oder alternativ den Pfad zur Paketdatei im Dateisystem handeln.]]></item>\r
- <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Paket vom lokalen Computer hochladen]]></item>\r
- <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Geben Sie eine Paketdatei von Ihrem lokalen Rechner an.]]></item>\r
- <item name="wcf.acp.package.startUpdate"><![CDATA[Paket »{$package->getName()}« aktualisieren]]></item>\r
- <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>\r
- <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>\r
- <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation abgeschlossen]]></item>\r
- <item name="wcf.acp.package.step.install.optionals"><![CDATA[Optionale Pakete werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.package"><![CDATA[Paket wird registriert ...]]></item>\r
- <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden installiert ...]]></item>\r
- <item name="wcf.acp.package.step.install.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>\r
- <item name="wcf.acp.package.step.install.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
- <item name="wcf.acp.package.step.title"><![CDATA[Paket <b>{$packageName|encodeJS}</b>: ]]></item>\r
- <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Dateien werden gelöscht ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Deinstallation abgeschlossen]]></item>\r
- <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Optionale Pakete werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden deinstalliert ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
- <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>\r
- <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>\r
- <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>\r
- <item name="wcf.acp.package.step.update.finish"><![CDATA[Paketaktualisierung abgeschlossen]]></item>\r
- <item name="wcf.acp.package.step.update.optionals"><![CDATA[Optionale Pakete werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.package"><![CDATA[Paket wird aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden aktualisiert ...]]></item>\r
- <item name="wcf.acp.package.step.update.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>\r
- <item name="wcf.acp.package.step.update.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>\r
- <item name="wcf.acp.package.uninstall"><![CDATA[Paketdeinstallation]]></item>\r
- <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Abbruch der Paketdeinstallation]]></item>\r
- <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[Die Deinstallation des Paketes ist nicht möglich, da mindestens ein abhängiges Paket nicht deinstalliert werden kann.]]></item>\r
- <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Diese{if $dependentPackages|count == 1}s Paket wird{else} Pakete werden{/if}, nach Ihrer Bestätigung, ohne weitere Sicherheitsabfrage deinstalliert.]]></item>\r
- <item name="wcf.acp.package.update"><![CDATA[Paketaktualisierung]]></item>\r
- <item name="wcf.acp.package.updateDate"><![CDATA[Aktualisierungsdatum]]></item>\r
- <item name="wcf.acp.package.view.author"><![CDATA[Hersteller:]]></item>\r
- <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Zur Administrationsoberfläche wechseln]]></item>\r
- <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Paket deinstallieren]]></item>\r
- <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Alle Pakete deinstallieren]]></item>\r
- <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Wollen Sie dieses Paket wirklich deinstallieren?]]></item>\r
- <item name="wcf.acp.package.view.button.update"><![CDATA[Paket aktualisieren]]></item>\r
- <item name="wcf.acp.package.view.date"><![CDATA[Herstellungsdatum:]]></item>\r
- <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Abhängige Pakete]]></item>\r
- <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[Dieses Paket wird von {#$dependentPackages|count} {if $dependentPackages|count == 1}anderen Paket{else}anderen Paketen{/if} benötigt.]]></item>\r
- <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}Dieses Paket wird von 1 anderen Paket benötigt{else}{#$dependentPackages|count} Pakete sind direkt oder indirekt von diesem Paket abhängig{/if}.]]></item>\r
- <item name="wcf.acp.package.view.dir"><![CDATA[Installationsverzeichnis:]]></item>\r
- <item name="wcf.acp.package.view.identifier"><![CDATA[Bezeichner:]]></item>\r
- <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installierte Instanz:]]></item>\r
- <item name="wcf.acp.package.view.parent"><![CDATA[Übergeordnetes Paket:]]></item>\r
- <item name="wcf.acp.package.view.properties"><![CDATA[Eigenschaften]]></item>\r
- <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Benötigte Pakete]]></item>\r
- <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[Dieses Paket benötigt {#$requiredPackages|count} {if $requiredPackages|count == 1}anderes Paket{else}andere Pakete{/if}.]]></item>\r
- <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>\r
- <item name="wcf.acp.package.view.version"><![CDATA[Installierte Version:]]></item>\r
- </category>\r
- <category name="wcf.acp.packageUpdate">\r
- <item name="wcf.acp.packageUpdate"><![CDATA[Pakete aktualisieren]]></item>\r
- <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentifizierung mit Update-Server]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Verbindungs-Daten]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Benutzername und Kennwort wurden nicht akzeptiert.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Kennwort]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Geben Sie ein Kennwort an, das zur Authentifizierung benötigt wird.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Benutzername]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Geben Sie einen Benutzernamen an, der zur Authentifizierung benötigt wird.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[Benutzeranmeldung]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server-Meldung]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server-Name]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Benutzerdaten dauerhaft speichern]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[Speichert die eingegebenen Benutzerdaten dauerhaft, sodass Sie die Daten zu einem späteren Zeitpunkt nicht erneut eingeben müssen.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Adresse]]></item>\r
- <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installierte Version]]></item>\r
- <item name="wcf.acp.packageUpdate.error"><![CDATA[Es ist folgender Fehler aufgetreten: ]]></item>\r
- <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[Das Herunterladen des Paketes {$package} ist fehlgeschlagen.]]></item>\r
- <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[Beim Versuch die Paketliste herunterzuladen, ist ein Fehler aufgetreten.]]></item>\r
- <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[Es {if $excludedPackages|count == 1}ist folgender Konflikt{else}sind folgende Konflikte{/if} aufgetreten:]]></item>\r
- <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[Das installierte Paket »{$excludedPackage.existingPackageName}« ist mit dem Paket »{$excludedPackage.packageName}« in Version {$excludedPackage.packageVersion} nicht kompatibel.]]></item>\r
- <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[Das Paket »{$excludedPackage.packageName}« in Version {$excludedPackage.packageVersion} ist mit dem installierten Paket »{$excludedPackage.existingPackageName}« nicht kompatibel.]]></item>\r
- <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} wird installiert]]></item>\r
- <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[Derzeit sind keine Updates verfügbar.]]></item>\r
- <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[Sie haben kein Update ausgewählt.]]></item>\r
- <item name="wcf.acp.packageUpdate.options"><![CDATA[Optionen]]></item>\r
- <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[Paket ist bereits installiert und kann kein weiteres Mal installiert werden.]]></item>\r
- <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Paket installieren]]></item>\r
- <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Weitere Paket-Instanz installieren (Paket ist bereits {#$package.instances} mal installiert)]]></item>\r
- <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Installiertes Paket {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} Version {$updatableInstance.packageVersion} aktualisieren]]></item>\r
- <item name="wcf.acp.packageUpdate.search"><![CDATA[Pakete suchen]]></item>\r
- <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Autor]]></item>\r
- <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Suche nach ...]]></item>\r
- <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Bereits installierte einzigartige Pakete ausblenden]]></item>\r
- <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Paketname]]></item>\r
- <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Paketname und -beschreibung durchsuchen]]></item>\r
- <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update-Server]]></item>\r
- <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Alle Update-Server durchsuchen]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Art des Paketes]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Sonstige Pakete]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Zusatzmodul für bereits installierte Pakete]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Endanwendung]]></item>\r
- <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Alle Pakete auswählen]]></item>\r
- <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} wird aktualisiert auf {$package.toVersion}]]></item>\r
- <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[Neue Version]]></item>\r
- <item name="wcf.acp.packageUpdate.updates"><![CDATA[Folgende Paket-Aktualisierungen/-Installationen werden durchgeführt:]]></item>\r
- </category>\r
- <category name="wcf.acp.sessionLog">\r
- <item name="wcf.acp.sessionLog.access.view"><![CDATA[Aktionen der protokollierten Sitzung von »{$sessionLog->username}«]]></item>\r
- <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[Insgesamt {#$items} protokollierte Aktion{if $items != 1}en{/if}]]></item>\r
- <item name="wcf.acp.sessionLog.accesses"><![CDATA[Aktionen]]></item>\r
- <item name="wcf.acp.sessionLog.className"><![CDATA[Klasse]]></item>\r
- <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP-Adresse]]></item>\r
- <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Letzte Aktion]]></item>\r
- <item name="wcf.acp.sessionLog.packageName"><![CDATA[Paket]]></item>\r
- <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Methode]]></item>\r
- <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>\r
- <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.sessionLog.time"><![CDATA[Datum]]></item>\r
- <item name="wcf.acp.sessionLog.userAgent"><![CDATA[Browser-Kennung]]></item>\r
- <item name="wcf.acp.sessionLog.view"><![CDATA[Protokollierte Sitzungen]]></item>\r
- <item name="wcf.acp.sessionLog.view.count"><![CDATA[Insgesamt {#$items} protokollierte Sitzung{if $items != 1}en{/if}]]></item>\r
- </category>\r
- <category name="wcf.acp.updateServer">\r
- <item name="wcf.acp.updateServer.add"><![CDATA[Server hinzufügen]]></item>\r
- <item name="wcf.acp.updateServer.add.success"><![CDATA[Der Server wurde erfolgreich angelegt.]]></item>\r
- <item name="wcf.acp.updateServer.data"><![CDATA[Server-Daten]]></item>\r
- <item name="wcf.acp.updateServer.delete"><![CDATA[Server löschen]]></item>\r
- <item name="wcf.acp.updateServer.delete.success"><![CDATA[Der Server wurde erfolgreich gelöscht.]]></item>\r
- <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Wollen Sie den Server wirklich löschen?]]></item>\r
- <item name="wcf.acp.updateServer.disable"><![CDATA[Deaktivieren]]></item>\r
- <item name="wcf.acp.updateServer.edit"><![CDATA[Server bearbeiten]]></item>\r
- <item name="wcf.acp.updateServer.edit.success"><![CDATA[Ihre Änderungen wurden erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.updateServer.enable"><![CDATA[Aktivieren]]></item>\r
- <item name="wcf.acp.updateServer.errorText"><![CDATA[Fehlermeldungen]]></item>\r
- <item name="wcf.acp.updateServer.htPassword"><![CDATA[Kennwort]]></item>\r
- <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Geben Sie ein Kennwort an, das zur Authentifizierung benötigt wird (optional).]]></item>\r
- <item name="wcf.acp.updateServer.htUsername"><![CDATA[Benutzername]]></item>\r
- <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Geben Sie einen Benutzernamen an, der zur Authentifizierung benötigt wird (optional).]]></item>\r
- <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[Beim letzten Verbindungsversuch trat folgende Fehlermeldungen auf:]]></item>\r
- <item name="wcf.acp.updateServer.list.available"><![CDATA[Insgesamt {#$items} Server eingetragen]]></item>\r
- <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server-ID]]></item>\r
- <item name="wcf.acp.updateServer.packages"><![CDATA[Pakete]]></item>\r
- <item name="wcf.acp.updateServer.server"><![CDATA[Adresse]]></item>\r
- <item name="wcf.acp.updateServer.server.description"><![CDATA[Geben Sie die Adresse (URL) zu einem Paketserver an.]]></item>\r
- <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[Die eingetragene Adresse ist ungültig.]]></item>\r
- <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>\r
- <item name="wcf.acp.updateServer.timestamp"><![CDATA[Letzter Zugriff]]></item>\r
- <item name="wcf.acp.updateServer.view"><![CDATA[Verfügbare Update-Server]]></item>\r
- <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[Es sind keine Update-Server eingetragen.]]></item>\r
- </category>\r
- <category name="wcf.acp.user">\r
- <item name="wcf.acp.user.add"><![CDATA[Benutzer hinzufügen]]></item>\r
- <item name="wcf.acp.user.add.data"><![CDATA[Benutzerdaten]]></item>\r
- <item name="wcf.acp.user.add.success"><![CDATA[Der neue Benutzer wurde erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.user.assignToGroup"><![CDATA[Benutzergruppe zuweisen]]></item>\r
- <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Folgende Benutzer den unten ausgewählten Benutzergruppen zuweisen]]></item>\r
- <item name="wcf.acp.user.assignToGroup.success"><![CDATA[Die Zuweisung wurde erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.user.button.assignGroup"><![CDATA[Benutzergruppe zuweisen]]></item>\r
- <item name="wcf.acp.user.button.exportMail"><![CDATA[E-Mail-Adressen exportieren]]></item>\r
- <item name="wcf.acp.user.button.sendMail"><![CDATA[E-Mail senden]]></item>\r
- <item name="wcf.acp.user.delete"><![CDATA[Benutzer löschen]]></item>\r
- <item name="wcf.acp.user.delete.error"><![CDATA[Es konnte kein Benutzer gelöscht werden.]]></item>\r
- <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}Der Benutzer wurde{else}{#$deletedUsers} Benutzer wurden{/if} erfolgreich gelöscht.]]></item>\r
- <item name="wcf.acp.user.delete.sure"><![CDATA[Wollen Sie diesen Benutzer wirklich löschen?]]></item>\r
- <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Wollen Sie die markierten Benutzer wirklich löschen?]]></item>\r
- <item name="wcf.acp.user.edit"><![CDATA[Benutzer bearbeiten]]></item>\r
- <item name="wcf.acp.user.edit.success"><![CDATA[Die Änderungen an diesem Benutzer wurden erfolgreich gespeichert.]]></item>\r
- <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[Sie bearbeiten Ihr eigenes Benutzerkonto. Änderungen an den Mitgliedschaften in Benutzergruppen können womöglich dazu führen, dass Sie aus der Administrationsoberfläche ausgeschlossen werden. Bitte seien Sie entsprechend vorsichtig!]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress"><![CDATA[E-Mail-Adressen exportieren]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Exportformat]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Exporteinstellungen]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[E-Mail-Adressen von folgenden Benutzern exportieren]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Trennzeichen]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Texttrenner]]></item>\r
- <item name="wcf.acp.user.groups"><![CDATA[Benutzergruppe(n)]]></item>\r
- <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Finde Benutzer, die in den ausgewählten Benutzergruppen nicht Mitglied sind.]]></item>\r
- <item name="wcf.acp.user.list"><![CDATA[Benutzer]]></item>\r
- <item name="wcf.acp.user.list.all"><![CDATA[Alle Benutzer]]></item>\r
- <item name="wcf.acp.user.list.count"><![CDATA[Insgesamt {#$items} Benutzer]]></item>\r
- <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "Einen Benutzer markiert" : this.count+" Benutzer markiert"]]></item>\r
- <item name="wcf.acp.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>\r
- <item name="wcf.acp.user.massProcessing.action"><![CDATA[Aktion]]></item>\r
- <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Bedingungen]]></item>\r
- <item name="wcf.acp.user.massProcessing.success"><![CDATA[Die gewählte Aktion wurde erfolgreich auf {#$affectedUsers} Benutzer ausgeführt.]]></item>\r
- <item name="wcf.acp.user.massProcessing.warning"><![CDATA[Die Massenverarbeitung von Benutzern führt die unten ausgewählte Aktion <b>ohne zusätzliche Sicherheitsabfrage</b> auf alle Benutzer aus, die unter die eingestellten Bedingungen fallen. Die Bearbeitungen können unter Umständen sehr rechenintensiv werden und sollten deshalb möglichst nur dann ausgeführt werden, wenn sich die Seite im Wartungsmodus befindet! Die Veränderungen können nicht rückgängig gemacht werden. Bitte benutzen Sie diese Funktion mit der nötigen Vorsicht!]]></item>\r
- <item name="wcf.acp.user.search"><![CDATA[Benutzer suchen]]></item>\r
- <item name="wcf.acp.user.search.conditions"><![CDATA[Kriterien der Suche]]></item>\r
- <item name="wcf.acp.user.search.conditions.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profil]]></item>\r
- <item name="wcf.acp.user.search.display"><![CDATA[Darstellung]]></item>\r
- <item name="wcf.acp.user.search.display.columns"><![CDATA[Angezeigte Informationen]]></item>\r
- <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Sonstiges]]></item>\r
- <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profil]]></item>\r
- <item name="wcf.acp.user.search.display.general"><![CDATA[Allgemein]]></item>\r
- <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Benutzer pro Seite]]></item>\r
- <item name="wcf.acp.user.search.display.sort"><![CDATA[Sortierung]]></item>\r
- <item name="wcf.acp.user.search.error.noMatches"><![CDATA[Zu den angegebenen Kriterien wurde kein Benutzer gefunden.]]></item>\r
- <item name="wcf.acp.user.search.matches"><![CDATA[{if $items == 1}Ein Ergebnis{else}{#$items} Ergebnisse{/if}]]></item>\r
- <item name="wcf.acp.user.search.withinResults"><![CDATA[In den Ergebnissen suchen]]></item>\r
- <item name="wcf.acp.user.sendMail"><![CDATA[E-Mail an Benutzer senden]]></item>\r
- <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail an alle Benutzer]]></item>\r
- <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[E-Mail als HTML verschicken]]></item>\r
- <item name="wcf.acp.user.sendMail.from"><![CDATA[Absender]]></item>\r
- <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Hier können Sie die E-Mail-Adresse des Absenders definieren.{if MAIL_USE_FORMATTED_ADDRESS} Es ist auch folgendes Format möglich:{/if}</p>\r
-{if MAIL_USE_FORMATTED_ADDRESS}<p style="text-align: center; line-height: 2em;"><code>Absender Name <email@absender.tld></code></p>{/if}\r
-<p>Wenn Sie unter System -> Optionen -> E-Mail alles ausgefüllt haben, wird dieses Feld automatisch ausgefüllt. Sollten Sie E-Mails per SMTP senden, so achten Sie darauf, dass die E-Mail-Adresse des Absenders auch vom Server akzeptiert werden muss.</p>]]></item>\r
- <item name="wcf.acp.user.sendMail.group"><![CDATA[E-Mail an Gruppenmitglieder]]></item>\r
- <item name="wcf.acp.user.sendMail.groups"><![CDATA[E-Mail an die Mitglieder folgender Benutzergruppen senden]]></item>\r
- <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-Mail]]></item>\r
- <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[E-Mail an folgende Benutzer senden]]></item>\r
- <item name="wcf.acp.user.sendMail.subject"><![CDATA[Betreff]]></item>\r
- <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Geben Sie hier die Betreffzeile der E-Mail an.]]></item>\r
- <item name="wcf.acp.user.sendMail.text"><![CDATA[Nachricht]]></item>\r
- <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Tragen Sie hier die Nachricht ein, die Sie den Benutzern senden möchten.]]></item>\r
- <item name="wcf.acp.user.userNote"><![CDATA[Angemeldet als {$this->user->username}.]]></item>\r
- </category>\r
- <category name="wcf.acp.worker">\r
- <item name="wcf.acp.worker.currentStep"><![CDATA[Aktueller Schritt]]></item>\r
- <item name="wcf.acp.worker.description"><![CDATA[Bitte lassen Sie dieses Browser-Fenster offen, bis der Prozess abgeschlossen ist und melden Sie sich auf keinen Fall in einem anderen Browser-Fenster separat in der Administrationsoberfläche an, da dies den Prozess behindern könnte.]]></item>\r
- <item name="wcf.acp.worker.progress.finish"><![CDATA[Vorgang erfolgreich abgeschlossen]]></item>\r
- <item name="wcf.acp.worker.progress.working"><![CDATA[Vorgang läuft ...]]></item>\r
- <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>\r
- <item name="wcf.acp.worker.title"><![CDATA[Prozess läuft ...]]></item>\r
- </category>\r
- <category name="wcf.global">\r
- <item name="wcf.global.button.back"><![CDATA[« Zurück]]></item>\r
- <item name="wcf.global.button.close"><![CDATA[Schließen]]></item>\r
- <item name="wcf.global.button.collapse"><![CDATA[Zuklappen]]></item>\r
- <item name="wcf.global.button.collapsible"><![CDATA[Auf- und Zuklappen]]></item>\r
- <item name="wcf.global.button.delete"><![CDATA[Löschen]]></item>\r
- <item name="wcf.global.button.delete.confirm"><![CDATA[Möchten Sie das Element wirklich löschen?]]></item>\r
- <item name="wcf.global.button.deleteCompletely"><![CDATA[Endgültig löschen]]></item>\r
- <item name="wcf.global.button.edit"><![CDATA[Bearbeiten]]></item>\r
- <item name="wcf.global.button.editor.jump"><![CDATA[Zum Editor wechseln]]></item>\r
- <item name="wcf.global.button.expand"><![CDATA[Aufklappen]]></item>\r
- <item name="wcf.global.button.mark"><![CDATA[Markieren]]></item>\r
- <item name="wcf.global.button.next"><![CDATA[Weiter »]]></item>\r
- <item name="wcf.global.button.preview"><![CDATA[Vorschau]]></item>\r
- <item name="wcf.global.button.reset"><![CDATA[Zurücksetzen]]></item>\r
- <item name="wcf.global.button.submit"><![CDATA[Absenden]]></item>\r
- <item name="wcf.global.button.unmark"><![CDATA[Demarkieren]]></item>\r
- <item name="wcf.global.date.day"><![CDATA[Tag]]></item>\r
- <item name="wcf.global.date.days"><![CDATA[Tage]]></item>\r
- <item name="wcf.global.date.hour"><![CDATA[Stunde]]></item>\r
- <item name="wcf.global.date.hours"><![CDATA[Stunden]]></item>\r
- <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>\r
- <item name="wcf.global.date.minutes"><![CDATA[Minuten]]></item>\r
- <item name="wcf.global.date.month"><![CDATA[Monat]]></item>\r
- <item name="wcf.global.date.months"><![CDATA[Monate]]></item>\r
- <item name="wcf.global.date.second"><![CDATA[Sekunde]]></item>\r
- <item name="wcf.global.date.seconds"><![CDATA[Sekunden]]></item>\r
- <item name="wcf.global.date.week"><![CDATA[Woche]]></item>\r
- <item name="wcf.global.date.weeks"><![CDATA[Wochen]]></item>\r
- <item name="wcf.global.date.year"><![CDATA[Jahr]]></item>\r
- <item name="wcf.global.date.year.notRequired"><![CDATA[Die Angabe des Jahres ist optional.]]></item>\r
- <item name="wcf.global.date.years"><![CDATA[Jahre]]></item>\r
- <item name="wcf.global.dateInputOrder"><![CDATA[day-month-year]]></item>\r
- <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>\r
- <item name="wcf.global.defaultValue"><![CDATA[Standard]]></item>\r
- <item name="wcf.global.error.backward"><![CDATA[Zurück zur vorherigen Seite]]></item>\r
- <item name="wcf.global.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>\r
- <item name="wcf.global.error.file.notFound"><![CDATA[Die Datei konnte nicht gefunden werden.]]></item>\r
- <item name="wcf.global.error.illegalLink"><![CDATA[Sie haben einen ungültigen oder nicht mehr gültigen Link aufgerufen.]]></item>\r
- <item name="wcf.global.error.permissionDenied"><![CDATA[Der Zutritt zu dieser Seite ist Ihnen leider verwehrt. Sie besitzen nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.]]></item>\r
- <item name="wcf.global.error.permissionDenied.title"><![CDATA[Zutritt verwehrt]]></item>\r
- <item name="wcf.global.error.title"><![CDATA[Fehlermeldung]]></item>\r
- <item name="wcf.global.form.error"><![CDATA[Ihre Angaben sind ungültig. Bitte überprüfen Sie die markierten Eingabefelder.]]></item>\r
- <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>\r
- <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>\r
- <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>\r
- <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>\r
- <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>\r
- <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede »Du«)]]></item>\r
- <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>\r
- <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>\r
- <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>\r
- <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>\r
- <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>\r
- <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>\r
- <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>\r
- <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>\r
- <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>\r
- <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>\r
- <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>\r
- <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>\r
- <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>\r
- <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>\r
- <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>\r
- <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>\r
- <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>\r
- <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>\r
- <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>\r
- <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>\r
- <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>\r
- <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>\r
- <item name="wcf.global.language.th"><![CDATA[Thailändisch]]></item>\r
- <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>\r
- <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
- <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>\r
- <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>\r
- <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>\r
- <item name="wcf.global.multiSelect"><![CDATA[Mehrfache Markierungen sind durch zusätzliches Drücken der Taste »Strg/Ctrl« (Windows) oder »Befehl/Command« (Mac OS) möglich.]]></item>\r
- <item name="wcf.global.page.input"><![CDATA[Zu folgender Seite springen]]></item>\r
- <item name="wcf.global.page.next"><![CDATA[nächste Seite]]></item>\r
- <item name="wcf.global.page.previous"><![CDATA[vorherige Seite]]></item>\r
- <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>\r
- <item name="wcf.global.pageTitle"><![CDATA[WoltLab® Community Framework™]]></item>\r
- <item name="wcf.global.redirect.title"><![CDATA[Weiterleitung]]></item>\r
- <item name="wcf.global.redirect.url"><![CDATA[Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!]]></item>\r
- <item name="wcf.global.scrollDown"><![CDATA[Zum Seitenende]]></item>\r
- <item name="wcf.global.scrollUp"><![CDATA[Zum Seitenanfang]]></item>\r
- <item name="wcf.global.search.matchesExactly"><![CDATA[Exakter Treffer]]></item>\r
- \r
- <item name="wcf.global.skipToContent"><![CDATA[Zum Seiteninhalt springen]]></item>\r
- <item name="wcf.global.sortOrder.ascending"><![CDATA[in aufsteigender Reihenfolge]]></item>\r
- <item name="wcf.global.sortOrder.descending"><![CDATA[in absteigender Reihenfolge]]></item>\r
- <item name="wcf.global.thousandsSeparator"><![CDATA[ ]]></item>\r
- \r
- <item name="wcf.global.date.dateFormat"><![CDATA[j. F Y]]></item>\r
- <item name="wcf.global.date.timeFormat"><![CDATA[H:i]]></item>\r
- <item name="wcf.global.date.dateTimeFormat"><![CDATA[%date%, %time%]]></item>\r
- \r
- <!-- variables for dynamic javascript datetime -->\r
- <item name="wcf.global.date.relative.minutes"><![CDATA['Vor ' + (($minutes > 1) ? $minutes + ' Minuten' : 'einer Minute' )]]></item>\r
- <item name="wcf.global.date.relative.hours"><![CDATA['Vor ' + (($hours > 1) ? $hours + ' Stunden' : 'einer Stunde' )]]></item>\r
- <item name="wcf.global.date.relative.pastDays"><![CDATA[(($days > 1) ? '%day%' : 'Gestern' ) + ', %time%']]></item>\r
- \r
- <!-- variables for localized date formats; unnecessary in english -->\r
- <item name="wcf.global.date.month.january"><![CDATA[Januar]]></item>\r
- <item name="wcf.global.date.month.february"><![CDATA[Februar]]></item>\r
- <item name="wcf.global.date.month.march"><![CDATA[März]]></item>\r
- <item name="wcf.global.date.month.april"><![CDATA[April]]></item>\r
- <item name="wcf.global.date.month.may"><![CDATA[Mai]]></item>\r
- <item name="wcf.global.date.month.june"><![CDATA[Juni]]></item>\r
- <item name="wcf.global.date.month.july"><![CDATA[Juli]]></item>\r
- <item name="wcf.global.date.month.august"><![CDATA[August]]></item>\r
- <item name="wcf.global.date.month.september"><![CDATA[September]]></item>\r
- <item name="wcf.global.date.month.october"><![CDATA[Oktober]]></item>\r
- <item name="wcf.global.date.month.november"><![CDATA[November]]></item>\r
- <item name="wcf.global.date.month.december"><![CDATA[Dezember]]></item>\r
- <item name="wcf.global.date.month.jan"><![CDATA[Jan]]></item>\r
- <item name="wcf.global.date.month.feb"><![CDATA[Feb]]></item>\r
- <item name="wcf.global.date.month.mar"><![CDATA[Mär]]></item>\r
- <item name="wcf.global.date.month.apr"><![CDATA[Apr]]></item>\r
- <item name="wcf.global.date.month.may"><![CDATA[Mai]]></item>\r
- <item name="wcf.global.date.month.jun"><![CDATA[Jun]]></item>\r
- <item name="wcf.global.date.month.jul"><![CDATA[Jul]]></item>\r
- <item name="wcf.global.date.month.aug"><![CDATA[Aug]]></item>\r
- <item name="wcf.global.date.month.sep"><![CDATA[Sep]]></item>\r
- <item name="wcf.global.date.month.oct"><![CDATA[Okt]]></item>\r
- <item name="wcf.global.date.month.nov"><![CDATA[Nov]]></item>\r
- <item name="wcf.global.date.month.dec"><![CDATA[Dez]]></item>\r
- <item name="wcf.global.date.day.sunday"><![CDATA[Sonntag]]></item>\r
- <item name="wcf.global.date.day.monday"><![CDATA[Montag]]></item>\r
- <item name="wcf.global.date.day.tuesday"><![CDATA[Dienstag]]></item>\r
- <item name="wcf.global.date.day.wednesday"><![CDATA[Mittwoch]]></item>\r
- <item name="wcf.global.date.day.thursday"><![CDATA[Donnerstag]]></item>\r
- <item name="wcf.global.date.day.friday"><![CDATA[Freitag]]></item>\r
- <item name="wcf.global.date.day.saturday"><![CDATA[Samstag]]></item>\r
- <item name="wcf.global.date.day.sun"><![CDATA[Son]]></item>\r
- <item name="wcf.global.date.day.mon"><![CDATA[Mon]]></item>\r
- <item name="wcf.global.date.day.tue"><![CDATA[Die]]></item>\r
- <item name="wcf.global.date.day.wed"><![CDATA[Mit]]></item>\r
- <item name="wcf.global.date.day.thu"><![CDATA[Don]]></item>\r
- <item name="wcf.global.date.day.fri"><![CDATA[Fre]]></item>\r
- <item name="wcf.global.date.day.sat"><![CDATA[Sam]]></item>\r
- <item name="wcf.global.date.timezone.pacific.kwajalein"><![CDATA[(UTC-12:00) Kwajalein]]></item>\r
- <item name="wcf.global.date.timezone.pacific.midway"><![CDATA[(UTC-11:00) Midway]]></item>\r
- <item name="wcf.global.date.timezone.pacific.samoa"><![CDATA[(UTC-11:00) Samoa]]></item>\r
- <item name="wcf.global.date.timezone.pacific.honolulu"><![CDATA[(UTC-10:00) Hawaii]]></item>\r
- <item name="wcf.global.date.timezone.america.anchorage"><![CDATA[(UTC-09:00) Alaska]]></item>\r
- <item name="wcf.global.date.timezone.america.tijuana"><![CDATA[(UTC-08:00) Tijuana, Niederkalifornien]]></item>\r
- <item name="wcf.global.date.timezone.america.los_angeles"><![CDATA[(UTC-08:00) Pacific Zeit]]></item>\r
- <item name="wcf.global.date.timezone.america.phoenix"><![CDATA[(UTC-07:00) Arizona]]></item>\r
- <item name="wcf.global.date.timezone.america.chihuahua"><![CDATA[(UTC-07:00) Chihuahua, La Paz, Mazatlan]]></item>\r
- <item name="wcf.global.date.timezone.america.denver"><![CDATA[(UTC-07:00) Mountain Zeit]]></item>\r
- <item name="wcf.global.date.timezone.america.chicago"><![CDATA[(UTC-06:00) Central Zeit]]></item>\r
- <item name="wcf.global.date.timezone.america.mexico_city"><![CDATA[(UTC-06:00) Guadalajara, Mexiko-Stadt, Monterrey]]></item>\r
- <item name="wcf.global.date.timezone.america.tegucigalpa"><![CDATA[(UTC-06:00) Mittelamerika]]></item>\r
- <item name="wcf.global.date.timezone.america.regina"><![CDATA[(UTC-06:00) Saskatchewan]]></item>\r
- <item name="wcf.global.date.timezone.america.bogota"><![CDATA[(UTC-05:00) Bogotá, Lima, Quito]]></item>\r
- <item name="wcf.global.date.timezone.america.new_york"><![CDATA[(UTC-05:00) Eastern Zeit]]></item>\r
- <item name="wcf.global.date.timezone.america.indiana.indianapolis"><![CDATA[(UTC-05:00) Indiana (Ost)]]></item>\r
- <item name="wcf.global.date.timezone.america.rio_branco"><![CDATA[(UTC-05:00) Rio Branco]]></item>\r
- <item name="wcf.global.date.timezone.america.caracas"><![CDATA[(UTC-04:30) Caracas]]></item>\r
- <item name="wcf.global.date.timezone.america.asuncion"><![CDATA[(UTC-04:00) Asuncion]]></item>\r
- <item name="wcf.global.date.timezone.america.halifax"><![CDATA[(UTC-04:00) Atlantic (Kanada)]]></item>\r
- <item name="wcf.global.date.timezone.america.cuiaba"><![CDATA[(UTC-04:00) Cuiaba]]></item>\r
- <item name="wcf.global.date.timezone.america.la_paz"><![CDATA[(UTC-04:00) Georgetown, La Paz, Manaus, San Juan]]></item>\r
- <item name="wcf.global.date.timezone.america.santiago"><![CDATA[(UTC-04:00) Santiago]]></item>\r
- <item name="wcf.global.date.timezone.america.st_johns"><![CDATA[(UTC-03:30) Neufundland]]></item>\r
- <item name="wcf.global.date.timezone.america.sao_paulo"><![CDATA[(UTC-03:00) Brasilia]]></item>\r
- <item name="wcf.global.date.timezone.america.argentina.buenos_aires"><![CDATA[(UTC-03:00) Buenos Aires]]></item>\r
- <item name="wcf.global.date.timezone.america.cayenne"><![CDATA[(UTC-03:00) Cayenne, Fortaleza]]></item>\r
- <item name="wcf.global.date.timezone.america.godthab"><![CDATA[(UTC-03:00) Grönland]]></item>\r
- <item name="wcf.global.date.timezone.america.montevideo"><![CDATA[(UTC-03:00) Montevideo]]></item>\r
- <item name="wcf.global.date.timezone.atlantic.south_georgia"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>\r
- <item name="wcf.global.date.timezone.atlantic.azores"><![CDATA[(UTC-01:00) Azoren]]></item>\r
- <item name="wcf.global.date.timezone.atlantic.cape_verde"><![CDATA[(UTC-01:00) Kap Verde]]></item>\r
- <item name="wcf.global.date.timezone.africa.casablanca"><![CDATA[(UTC) Casablanca]]></item>\r
- <item name="wcf.global.date.timezone.europe.london"><![CDATA[(UTC) Dublin, Edinburgh, Lissabon, London]]></item>\r
- <item name="wcf.global.date.timezone.africa.monrovia"><![CDATA[(UTC) Monrovia, Reykjavik]]></item>\r
- <item name="wcf.global.date.timezone.europe.berlin"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien]]></item>\r
- <item name="wcf.global.date.timezone.europe.belgrade"><![CDATA[(UTC+01:00) Belgrad, Bratislava, Bupdapest, Ljubljana, Prag]]></item>\r
- <item name="wcf.global.date.timezone.europe.paris"><![CDATA[(UTC+01:00) Brüssel, Kopenhagen, Madrid, Paris]]></item>\r
- <item name="wcf.global.date.timezone.europe.sarajevo"><![CDATA[(UTC+01:00) Sarajevo, Skopje, Warschau, Zagreb]]></item>\r
- <item name="wcf.global.date.timezone.africa.algiers"><![CDATA[(UTC+01:00) West-Zentralafrika]]></item>\r
- <item name="wcf.global.date.timezone.africa.windhoek"><![CDATA[(UTC+01:00) Windhuk]]></item>\r
- <item name="wcf.global.date.timezone.asia.amman"><![CDATA[(UTC+02:00) Amman]]></item>\r
- <item name="wcf.global.date.timezone.europe.athens"><![CDATA[(UTC+02:00) Athen, Bukarest, Istanbul]]></item>\r
- <item name="wcf.global.date.timezone.asia.beirut"><![CDATA[(UTC+02:00) Beirut]]></item>\r
- <item name="wcf.global.date.timezone.asia.damascus"><![CDATA[(UTC+02:00) Damaskus]]></item>\r
- <item name="wcf.global.date.timezone.africa.harare"><![CDATA[(UTC+02:00) Harare, Pretoria]]></item>\r
- <item name="wcf.global.date.timezone.europe.helsinki"><![CDATA[(UTC+02:00) Helsinki, Kiew, Riga, Sofia, Tallinn, Wilna]]></item>\r
- <item name="wcf.global.date.timezone.asia.jerusalem"><![CDATA[(UTC+02:00) Jerusalem]]></item>\r
- <item name="wcf.global.date.timezone.africa.cairo"><![CDATA[(UTC+02:00) Kairo]]></item>\r
- <item name="wcf.global.date.timezone.europe.minsk"><![CDATA[(UTC+02:00) Minsk]]></item>\r
- <item name="wcf.global.date.timezone.asia.baghdad"><![CDATA[(UTC+03:00) Bagdad]]></item>\r
- <item name="wcf.global.date.timezone.asia.kuwait"><![CDATA[(UTC+03:00) Kuwait, Riad]]></item>\r
- <item name="wcf.global.date.timezone.europe.moscow"><![CDATA[(UTC+03:00) Moskau, St. Petersburg, Wolgograd]]></item>\r
- <item name="wcf.global.date.timezone.africa.nairobi"><![CDATA[(UTC+03:00) Nairobi]]></item>\r
- <item name="wcf.global.date.timezone.asia.tehran"><![CDATA[(UTC+03:30) Teheran]]></item>\r
- <item name="wcf.global.date.timezone.asia.muscat"><![CDATA[(UTC+04:00) Abu Dhabi, Muskat]]></item>\r
- <item name="wcf.global.date.timezone.asia.baku"><![CDATA[(UTC+04:00) Baku]]></item>\r
- <item name="wcf.global.date.timezone.asia.yerevan"><![CDATA[(UTC+04:00) Eriwan]]></item>\r
- <item name="wcf.global.date.timezone.indian.mauritius"><![CDATA[(UTC+04:00) Port Louis]]></item>\r
- <item name="wcf.global.date.timezone.asia.tbilisi"><![CDATA[(UTC+04:00) Tiflis]]></item>\r
- <item name="wcf.global.date.timezone.asia.kabul"><![CDATA[(UTC+04:30) Kabul]]></item>\r
- <item name="wcf.global.date.timezone.asia.karachi"><![CDATA[(UTC+05:00) Islamabad, Karatschi]]></item>\r
- <item name="wcf.global.date.timezone.asia.yekaterinburg"><![CDATA[(UTC+05:00) Jekaterinburg]]></item>\r
- <item name="wcf.global.date.timezone.asia.tashkent"><![CDATA[(UTC+05:00) Taschkent]]></item>\r
- <item name="wcf.global.date.timezone.asia.kolkata"><![CDATA[(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi]]></item>\r
- <item name="wcf.global.date.timezone.asia.colombo"><![CDATA[(UTC+05:30) Sri Jayawardenepura]]></item>\r
- <item name="wcf.global.date.timezone.asia.katmandu"><![CDATA[(UTC+05:45) Katmandu]]></item>\r
- <item name="wcf.global.date.timezone.asia.almaty"><![CDATA[(UTC+06:00) Astana]]></item>\r
- <item name="wcf.global.date.timezone.asia.dhaka"><![CDATA[(UTC+06:00) Dakka]]></item>\r
- <item name="wcf.global.date.timezone.asia.novosibirsk"><![CDATA[(UTC+06:00) Nowosibirsk]]></item>\r
- <item name="wcf.global.date.timezone.asia.rangoon"><![CDATA[(UTC+06:30) Yangon (Rangun)]]></item>\r
- <item name="wcf.global.date.timezone.asia.bangkok"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta]]></item>\r
- <item name="wcf.global.date.timezone.asia.krasnoyarsk"><![CDATA[(UTC+07:00) Krasnojarsk]]></item>\r
- <item name="wcf.global.date.timezone.asia.irkutsk"><![CDATA[(UTC+08:00) Irkutsk]]></item>\r
- <item name="wcf.global.date.timezone.asia.kuala_lumpur"><![CDATA[(UTC+08:00) Kuala Lumpur, Singapur]]></item>\r
- <item name="wcf.global.date.timezone.asia.chongqing"><![CDATA[(UTC+08:00) Peking, Chongqing, Hongkong, Urumchi]]></item>\r
- <item name="wcf.global.date.timezone.australia.perth"><![CDATA[(UTC+08:00) Perth]]></item>\r
- <item name="wcf.global.date.timezone.asia.taipei"><![CDATA[(UTC+08:00) Taipeh]]></item>\r
- <item name="wcf.global.date.timezone.asia.ulaanbaatar"><![CDATA[(UTC+08:00) Ulan-Bator]]></item>\r
- <item name="wcf.global.date.timezone.asia.yakutsk"><![CDATA[(UTC+09:00) Jakutsk]]></item>\r
- <item name="wcf.global.date.timezone.asia.tokyo"><![CDATA[(UTC+09:00) Osaka, Sapporo, Tokio]]></item>\r
- <item name="wcf.global.date.timezone.asia.seoul"><![CDATA[(UTC+09:00) Seoul]]></item>\r
- <item name="wcf.global.date.timezone.australia.adelaide"><![CDATA[(UTC+09:30) Adelaide]]></item>\r
- <item name="wcf.global.date.timezone.australia.darwin"><![CDATA[(UTC+09:30) Darwin]]></item>\r
- <item name="wcf.global.date.timezone.australia.brisbane"><![CDATA[(UTC+10:00) Brisbane]]></item>\r
- <item name="wcf.global.date.timezone.australia.sydney"><![CDATA[(UTC+10:00) Canberra, Melbourne, Sydney]]></item>\r
- <item name="wcf.global.date.timezone.pacific.guam"><![CDATA[(UTC+10:00) Guam, Port Moresby]]></item>\r
- <item name="wcf.global.date.timezone.australia.hobart"><![CDATA[(UTC+10:00) Hobart]]></item>\r
- <item name="wcf.global.date.timezone.asia.vladivostok"><![CDATA[(UTC+10:00) Wladiwostok]]></item>\r
- <item name="wcf.global.date.timezone.asia.magadan"><![CDATA[(UTC+11:00) Magadan]]></item>\r
- <item name="wcf.global.date.timezone.pacific.noumea"><![CDATA[(UTC+11:00) Salomonen, Neu-Kaledonien]]></item>\r
- <item name="wcf.global.date.timezone.pacific.auckland"><![CDATA[(UTC+12:00) Auckland, Wellington]]></item>\r
- <item name="wcf.global.date.timezone.pacific.fiji"><![CDATA[(UTC+12:00) Fidschi]]></item>\r
- <item name="wcf.global.date.timezone.asia.kamchatka"><![CDATA[(UTC+12:00) Kamtschatka]]></item>\r
- <item name="wcf.global.date.timezone.pacific.tongatapu"><![CDATA[(UTC+13:00) Nuku'alofa]]></item>\r
- </category>\r
- <category name="wcf.imageViewer">\r
- <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Bild " + (this.currentIndex + 1) + " von " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>\r
- <item name="wcf.imageViewer.close"><![CDATA[Schließen]]></item>\r
- <item name="wcf.imageViewer.enlarge"><![CDATA[Nur dieses Bild anzeigen (beendet die Bildbetrachtung)]]></item>\r
- <item name="wcf.imageViewer.next"><![CDATA[Nächstes Bild]]></item>\r
- <item name="wcf.imageViewer.pause"><![CDATA[Diashow stoppen]]></item>\r
- <item name="wcf.imageViewer.play"><![CDATA[Diashow starten (Bildwechsel alle 5 Sekunden)]]></item>\r
- <item name="wcf.imageViewer.previous"><![CDATA[Vorheriges Bild]]></item>\r
- </category>\r
- <category name="wcf.option">\r
- <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Kanarische Inseln, Lissabon, London, Monrovia, Ouagadougou, Reykjavík]]></item>\r
- <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brüssel, Kopenhagen, Madrid, Paris, Prag, Rom, Sarajevo, Stockholm, Tunis, Warschau, Wien]]></item>\r
- <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athen, Beirut, Bukarest, Helsinki, Istanbul, Jerusalem, Kairo, Kapstadt, Khartum, Kiew, Minsk, Sofia]]></item>\r
- <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Abeba, Antananarivo, Bagdad, Daressalam, Kampala, Kuwait, Mogadischu, Moskau, Nairobi, Riad]]></item>\r
- <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Teheran]]></item>\r
- <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Eriwan, Maskat, Réunion, Tiflis]]></item>\r
- <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>\r
- <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Asgabat, Bischkek, Duschanbe, Islamabad, Jekaterinburg, Karatschi, Malediven, Taschkent]]></item>\r
- <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, Neu-Delhi]]></item>\r
- <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>\r
- <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Nowosibirsk]]></item>\r
- <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Kokosinseln, Rangun]]></item>\r
- <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnojarsk, Vientiane]]></item>\r
- <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hongkong, Irkutsk, Kuala Lumpur, Manila, Peking, Perth, Singapur, Taipeh, Ulan Bator]]></item>\r
- <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Australien)]]></item>\r
- <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Jakutsk, Osaka, Pjöngjang, Sapporo, Seoul, Tokyo]]></item>\r
- <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>\r
- <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Wladiwostok]]></item>\r
- <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord-Howe-Insel (Australien)]]></item>\r
- <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, Neukaledonien, Salomonen]]></item>\r
- <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolkinsel]]></item>\r
- <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, Bairiki, Fidschi, Kamtschatka, Marshall-Inseln, Wellington]]></item>\r
- <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham-Inseln (Neuseeland)]]></item>\r
- <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenixinseln]]></item>\r
- <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Linieninseln, Weihnachtsinsel]]></item>\r
- <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azoren, Kapverdische Inseln]]></item>\r
- <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>\r
- <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Brasília, Buenos Aires, Cayenne, Georgetown, Grönland, Montevideo]]></item>\r
- <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Neufundland]]></item>\r
- <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Asunción, Atlantik (Kanada), La Paz, Port-of-Spain, Santiago]]></item>\r
- <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>\r
- <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Atlanta, Bogotá, Detroit, Lima, Miami, New York, San Francisco de Quito, Toronto]]></item>\r
- <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Chicago, Dallas, Kansas City, Mexiko-Stadt, Winnipeg, Zentralamerika]]></item>\r
- <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Arizona, Calgary, Chihuahua, Denver, Mazatlan, Salt Lake City]]></item>\r
- <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Los Angeles, Seattle, Tijuana, Vancouver]]></item>\r
- <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>\r
- <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) Französisch-Polynesien]]></item>\r
- <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cookinseln, Hawaii]]></item>\r
- <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midwayinseln, Samoa]]></item>\r
- <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Eniwetok, Kwajalein]]></item>\r
- </category>\r
- <category name="wcf.page">\r
- <item name="wcf.page.pageNo"><![CDATA[Seite {#$pageNo}]]></item>\r
- </category>\r
- <category name="wcf.user">\r
- <item name="wcf.user.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>\r
- <item name="wcf.user.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>\r
- <item name="wcf.user.email"><![CDATA[E-Mail-Adresse]]></item>\r
- <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch.]]></item>\r
- <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>\r
- <item name="wcf.user.error.email.notUnique"><![CDATA[Diese E-Mail-Adresse ist bereits durch einen anderen Benutzer vergeben.]]></item>\r
- <item name="wcf.user.error.email.notValid"><![CDATA[Sie haben eine ungültige E-Mail-Adresse eingegeben.]]></item>\r
- <item name="wcf.user.error.password.false"><![CDATA[Dieses Kennwort ist falsch.]]></item>\r
- <item name="wcf.user.error.username.notFound"><![CDATA[Der Benutzername »{$username}« konnte nicht gefunden werden.]]></item>\r
- <item name="wcf.user.error.username.notUnique"><![CDATA[Dieser Benutzername ist bereits vergeben.]]></item>\r
- <item name="wcf.user.error.username.notValid"><![CDATA[Sie haben einen ungültigen Benutzernamen eingegeben.]]></item>\r
- <item name="wcf.user.language"><![CDATA[Sprache]]></item>\r
- <item name="wcf.user.language.description"><![CDATA[Bitte wählen Sie aus, in welcher Sprache die Benutzeroberfläche erscheinen soll!]]></item>\r
- <item name="wcf.user.logout"><![CDATA[Abmelden]]></item>\r
- <item name="wcf.user.password"><![CDATA[Kennwort]]></item>\r
- <item name="wcf.user.registrationDate"><![CDATA[Registrierungsdatum]]></item>\r
- <item name="wcf.user.userID"><![CDATA[Benutzer-ID]]></item>\r
- <item name="wcf.user.username"><![CDATA[Benutzername]]></item>\r
- <item name="wcf.user.visibleLanguages"><![CDATA[Zeige Inhalte in folgenden Sprachen an]]></item>\r
- <item name="wcf.user.visibleLanguages.description"><![CDATA[Geben Sie an, in welchen Sprachen erstellte Inhalte angezeigt werden sollen.]]></item>\r
- </category>\r
- <category name="wcf.user.option">\r
- <item name="wcf.user.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>\r
- </category>\r
-</language>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de">
+ <category name="wcf.acp">
+ <item name="wcf.acp"><![CDATA[Administrationsoberfläche]]></item>
+ <item name="wcf.acp.help"><![CDATA[Hilfe]]></item>
+ <item name="wcf.acp.help.complete"><![CDATA[Vollständige Hilfe]]></item>
+ <item name="wcf.acp.help.disable"><![CDATA[Hilfe deaktivieren]]></item>
+ <item name="wcf.acp.help.interactive"><![CDATA[Interaktive Hilfe]]></item>
+ <item name="wcf.acp.packageQuickAccess"><![CDATA[Paket wechseln]]></item>
+ <item name="wcf.acp.search.extended"><![CDATA[Erweiterte Suche ...]]></item>
+ <item name="wcf.acp.sitemap"><![CDATA[Sitemap]]></item>
+ </category>
+ <category name="wcf.acp.cache">
+ <item name="wcf.acp.cache.button.clear"><![CDATA[Cache leeren]]></item>
+ <item name="wcf.acp.cache.clear.success"><![CDATA[Der Cache wurde erfolgreich gelöscht.]]></item>
+ <item name="wcf.acp.cache.clear.sure"><![CDATA[Wollen Sie den Cache wirklich komplett leeren?]]></item>
+ <item name="wcf.acp.cache.data"><![CDATA[Eigenschaften]]></item>
+ <item name="wcf.acp.cache.data.files"><![CDATA[Dateien]]></item>
+ <item name="wcf.acp.cache.data.size"><![CDATA[Größe]]></item>
+ <item name="wcf.acp.cache.data.source"><![CDATA[Quelle]]></item>
+ <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>
+ <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>
+ <item name="wcf.acp.cache.list.mtime"><![CDATA[Letzte Aktualisierung]]></item>
+ <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>
+ <item name="wcf.acp.cache.list.perm"><![CDATA[Zugriffsrechte]]></item>
+ <item name="wcf.acp.cache.list.size"><![CDATA[Größe]]></item>
+ </category>
+ <category name="wcf.acp.cronjob">
+ <item name="wcf.acp.cronjob.active"><![CDATA[Aktiv]]></item>
+ <item name="wcf.acp.cronjob.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>
+ <item name="wcf.acp.cronjob.add.data"><![CDATA[Allgemeine Daten]]></item>
+ <item name="wcf.acp.cronjob.add.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde hinzugefügt.]]></item>
+ <item name="wcf.acp.cronjob.add.timing"><![CDATA[Zeitsteuerung]]></item>
+ <item name="wcf.acp.cronjob.className"><![CDATA[Pfad zur Klasse]]></item>
+ <item name="wcf.acp.cronjob.className.description"><![CDATA[Geben Sie den Pfad zu der PHP-Datei an, die die entsprechende auszuführende Klasse enthält. Die Pfadangabe muss relativ zum Installationsverzeichnis der ausgewählten Endanwendung sein.]]></item>
+ <item name="wcf.acp.cronjob.cronjobID"><![CDATA[ID]]></item>
+ <item name="wcf.acp.cronjob.delete"><![CDATA[Zeitgesteuerte Aufgabe löschen]]></item>
+ <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht gelöscht werden.]]></item>
+ <item name="wcf.acp.cronjob.delete.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde gelöscht.]]></item>
+ <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Sind Sie sicher, dass Sie diese zeitgesteuerte Aufgabe löschen möchten?]]></item>
+ <item name="wcf.acp.cronjob.description"><![CDATA[Beschreibung]]></item>
+ <item name="wcf.acp.cronjob.description.description"><![CDATA[Hier können Sie eine kurze Beschreibung der Aufgabe eintragen.]]></item>
+ <item name="wcf.acp.cronjob.disable"><![CDATA[Deaktivieren]]></item>
+ <item name="wcf.acp.cronjob.edit"><![CDATA[Zeitgesteuerte Aufgabe bearbeiten]]></item>
+ <item name="wcf.acp.cronjob.edit.data"><![CDATA[Allgemeine Daten]]></item>
+ <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[Die zeitgesteuerte Aufgabe kann nicht verändert werden.]]></item>
+ <item name="wcf.acp.cronjob.edit.success"><![CDATA[Die zeitgesteuerte Aufgabe wurde erfolgreich geändert.]]></item>
+ <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Zeitsteuerung]]></item>
+ <item name="wcf.acp.cronjob.enable"><![CDATA[Aktivieren]]></item>
+ <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[Der angegebene Pfad ist ungültig.]]></item>
+ <item name="wcf.acp.cronjob.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>
+ <item name="wcf.acp.cronjob.error.notValid"><![CDATA[Das Zeitformat ist ungültig.]]></item>
+ <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Zeitgesteuerte Aufgabe mehrfach ausführen]]></item>
+ <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[Durch Aktivieren dieser Option wird die Aufgabe mehrfach ausgeführt, wenn zwischen dem letzten Ausführungszeitpunkt und dem aktuellen Zeitpunkt weitere Ausführungszeitpunkte liegen.]]></item>
+ <item name="wcf.acp.cronjob.execute"><![CDATA[Aufgabe jetzt ausführen]]></item>
+ <item name="wcf.acp.cronjob.execute.success"><![CDATA[Die Aufgabe wurde erfolgreich ausgeführt.]]></item>
+ <item name="wcf.acp.cronjob.inactive"><![CDATA[Inaktiv]]></item>
+ <item name="wcf.acp.cronjob.info"><![CDATA[Allgemeine Informationen]]></item>
+ <item name="wcf.acp.cronjob.intro"><![CDATA[Das Anlegen von zeitgesteuerten Aufgaben erfordert eine genaue Kenntnis der Crontab-Syntax auf unixähnlichen Systemen. Weiterführende Informationen dazu erhalten Sie auf dieser Website: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>]]></item>
+ <item name="wcf.acp.cronjob.lastExec"><![CDATA[Letzte Ausführung]]></item>
+ <item name="wcf.acp.cronjob.list"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+ <item name="wcf.acp.cronjob.list.count"><![CDATA[Insgesamt {#$items} zeitgesteuerte Aufgabe{if $items != 1}n{/if}]]></item>
+ <item name="wcf.acp.cronjob.log"><![CDATA[Protokoll der ausgeführten zeitgesteuerten Aufgaben]]></item>
+ <item name="wcf.acp.cronjob.log.clear"><![CDATA[Alle löschen]]></item>
+ <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Sind Sie sicher, dass Sie alle Protokoll-Einträge löschen möchten?]]></item>
+ <item name="wcf.acp.cronjob.log.data"><![CDATA[Insgesamt {#$items} {if $items == 1}Eintrag{else}Einträge{/if}]]></item>
+ <item name="wcf.acp.cronjob.log.error"><![CDATA[Fehler:]]></item>
+ <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Ausgeführt]]></item>
+ <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[Derzeit sind keine Einträge vorhanden.]]></item>
+ <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>
+ <item name="wcf.acp.cronjob.nextExec"><![CDATA[Nächste Ausführung]]></item>
+ <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[Derzeit ist keine zeitgesteuerte Aufgabe vorhanden.]]></item>
+ <item name="wcf.acp.cronjob.packageName"><![CDATA[Installiert von]]></item>
+ <item name="wcf.acp.cronjob.runNow"><![CDATA[Jetzt ausführen]]></item>
+ <item name="wcf.acp.cronjob.startDom"><![CDATA[Tag des Monats]]></item>
+ <item name="wcf.acp.cronjob.startDom.description"><![CDATA[An diesen Tagen des Monats (1 - 31) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>
+ <item name="wcf.acp.cronjob.startDow"><![CDATA[Tag der Woche]]></item>
+ <item name="wcf.acp.cronjob.startDow.description"><![CDATA[An diesen Tagen der Woche (0 - 6 mit Sonntag = 0 oder mon - sun) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>
+ <item name="wcf.acp.cronjob.startHour"><![CDATA[Stunde]]></item>
+ <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Zu diesen Stunden (0 - 23) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>
+ <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>
+ <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Zu diesen Minuten (0 - 59) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>
+ <item name="wcf.acp.cronjob.startMonth"><![CDATA[Monat]]></item>
+ <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[In diesen Monaten (1 - 12 oder jan - dec) soll die Aufgabe ausgeführt werden.]]></item>
+ <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>
+ <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>
+ <item name="wcf.acp.cronjob.subtitle"><![CDATA[»Cronjobs«]]></item>
+ </category>
+ <category name="wcf.acp.group">
+ <item name="wcf.acp.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>
+ <item name="wcf.acp.group.add.permissions"><![CDATA[Zugriffsrechte]]></item>
+ <item name="wcf.acp.group.add.success"><![CDATA[Die Benutzergruppe wurde erfolgreich angelegt.]]></item>
+ <item name="wcf.acp.group.administrators"><![CDATA[Administratoren]]></item>
+ <item name="wcf.acp.group.data"><![CDATA[Allgemeine Daten]]></item>
+ <item name="wcf.acp.group.delete"><![CDATA[Benutzergruppe löschen]]></item>
+ <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}Die Benutzergruppe wurde{else}{#$deletedGroups} Benutzergruppen wurden{/if} erfolgreich gelöscht.]]></item>
+ <item name="wcf.acp.group.delete.sure"><![CDATA[Wollen Sie diese Benutzergruppe wirklich löschen?]]></item>
+ <item name="wcf.acp.group.edit"><![CDATA[Benutzergruppe bearbeiten]]></item>
+ <item name="wcf.acp.group.edit.success"><![CDATA[Ihre Änderungen an der Benutzergruppe wurde erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[Sie sind selbst Mitglied dieser Benutzergruppe. Änderungen an den Zugriffsrechten dieser Benutzergruppe können womöglich dazu führen, dass Sie aus der Administrationsoberfläche ausgeschlossen werden. Bitte seien Sie entsprechend vorsichtig!]]></item>
+ <item name="wcf.acp.group.everyone"><![CDATA[Jeder]]></item>
+ <item name="wcf.acp.group.groupID"><![CDATA[Gruppen-ID]]></item>
+ <item name="wcf.acp.group.groupName"><![CDATA[Name der Benutzergruppe]]></item>
+ <item name="wcf.acp.group.groupName.description"><![CDATA[Geben Sie einen Namen für die Gruppe an.]]></item>
+ <item name="wcf.acp.group.guests"><![CDATA[Gäste]]></item>
+ <item name="wcf.acp.group.list"><![CDATA[Benutzergruppen]]></item>
+ <item name="wcf.acp.group.list.data"><![CDATA[Insgesamt {#$items} Benutzergruppen]]></item>
+ <item name="wcf.acp.group.members"><![CDATA[Anzahl Mitglieder]]></item>
+ <item name="wcf.acp.group.moderators"><![CDATA[Moderatoren]]></item>
+ <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Kann Administrationsoberfläche betreten]]></item>
+ <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Mitglieder dieser Benutzergruppe können die Administrationsoberfläche betreten und dort abhängig von den weiteren Zugriffsrechten verschiedene Aktionen durchführen. Diese Option muss aktiviert sein, wenn diesen Benutzern andere administrative Funktionen erlaubt werden sollen.]]></item>
+ <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Kann versteckte Profilinformationen sehen]]></item>
+ <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Mitglieder dieser Benutzergruppe können die versteckten Informationen in Benutzerprofilen sehen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Kann allgemeine Einstellungen vornehmen]]></item>
+ <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Mitglieder dieser Benutzergruppe können die allgemeinen System-Einstellungen sehen und bearbeiten. Z.B. Forum ein-/ausschalten.]]></item>
+ <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Kann Protokolle abrufen]]></item>
+ <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können die System-Protokolle abrufen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Kann neue zeitgesteuerte Aufgaben anlegen]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue zeitgesteuerte Aufgaben anlegen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben löschen]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben löschen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Kann Protokoll der zeitgesteuerten Aufgaben löschen]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Protokoll der zeitgesteuerten Aufgaben löschen. Bei der Ausführung einer zeitgesteuerten Aufgabe wird festgehalten, ob dieser erfolgreich ausgeführt wurde.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben ändern]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Kann zeitgesteuerte Aufgaben deaktivieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene zeitgesteuerte Aufgaben deaktivieren. Diese werden dann nicht mehr ausgeführt, können später jedoch auch wieder aktiviert werden.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Kann Update-Server bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Update-Server bearbeiten und neue hinzufügen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Kann Pakete installieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können zusätzliche Pakete installieren.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Kann Pakete deinstallieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete entfernen.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Kann Pakete aktualisieren]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Pakete aktualisieren.]]></item>
+ <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Zugängliche Benutzergruppen]]></item>
+ <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Mitglieder dieser Benutzergruppe haben auf diese Gruppen Zugriff. Zusätzlich muss angegeben werden, ob z.B. die Benutzergruppe bearbeitet werden darf.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Kann neue Benutzergruppen erstellen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzergruppen erstellen.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Kann neue Benutzer erstellen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können neue Benutzer erstellen. Ist bei "Zugängliche Benutzergruppen" eine Option aktiviert, kann diese Gruppe beim Erstellen des Benutzers zugewiesen werden.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Kann Benutzergruppen löschen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen löschen.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Kann Benutzer löschen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer löschen.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Kann Benutzergruppen bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzergruppen bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Kann E-Mail-Adressen bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Kann Kennwörter bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Mitglieder dieser Benutzergruppe können das Kennwort von anderen Benutzern bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Kann Benutzer bearbeiten]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer bearbeiten.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Kann E-Mails an Benutzer senden]]></item>
+ <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können die E-Mail-Adresse von anderen Benutzern sehen und ihnen E-Mails senden.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Kann Benutzer suchen]]></item>
+ <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Mitglieder dieser Benutzergruppe können vorhandene Benutzer und deren Profile durchsuchen.]]></item>
+ <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrative Rechte]]></item>
+ <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Inhalte]]></item>
+ <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Darstellung]]></item>
+ <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.general"><![CDATA[Allgemeine administrative Rechte]]></item>
+ <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Wartung]]></item>
+ <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System-Funktionen]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Paketverwaltung]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.user"><![CDATA[Benutzer-Funktionen]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Gruppenverwaltung]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[Benutzerverwaltung]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderative Rechte]]></item>
+ <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.user"><![CDATA[Allgemeine Rechte]]></item>
+ <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>
+ <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Kann deaktivierte Stile benutzen]]></item>
+ <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Mitglieder dieser Benutzergruppe können deaktivierte Stile auswählen.]]></item>
+ <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Stil-Verwaltung]]></item>
+ <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.showMembers"><![CDATA[Zeige die Mitglieder dieser Benutzergruppe]]></item>
+ <item name="wcf.acp.group.superModerators"><![CDATA[Super Moderatoren]]></item>
+ <item name="wcf.acp.group.users"><![CDATA[Registrierte Benutzer]]></item>
+ </category>
+ <category name="wcf.acp.login">
+ <item name="wcf.acp.login"><![CDATA[Anmeldung]]></item>
+ <item name="wcf.acp.login.data"><![CDATA[Zugangsdaten]]></item>
+ </category>
+ <category name="wcf.acp.masterPassword">
+ <item name="wcf.acp.masterPassword"><![CDATA[Hauptkennwort]]></item>
+ <item name="wcf.acp.masterPassword.confirm"><![CDATA[Hauptkennwort wiederholen]]></item>
+ <item name="wcf.acp.masterPassword.enter"><![CDATA[Hauptkennwort erforderlich]]></item>
+ <item name="wcf.acp.masterPassword.enter.description"><![CDATA[Die aufgerufene Seite oder Aktion erfordert aus Sicherheitsgründen die Eingabe des Hauptkennwortes. Pro Sitzung ist die Eingabe des Hauptkennwortes nur einmal erforderlich. Falls Sie das Hauptkennwort vergessen haben sollten, können Sie es zurücksetzen, indem Sie die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschen.]]></item>
+ <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[Das Hauptkennwort ist nicht korrekt. Falls Sie das Hauptkennwort vergessen haben sollten, können Sie es zurücksetzen, indem Sie die Datei <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em> löschen.]]></item>
+ <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>
+ <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[Das Kennwort wurde als unsicher erkannt. Das Kennwort sollte mindestens acht Zeichen lang sein, große und kleine lateinische Buchstaben, Zahlen und Sonderzeichen enthalten. Es darf nicht mit den Kennwörtern von anderen Administratoren übereinstimmen.]]></item>
+ <item name="wcf.acp.masterPassword.example"><![CDATA[Vorschlag]]></item>
+ <item name="wcf.acp.masterPassword.example.set"><![CDATA[Vorschlag übernehmen]]></item>
+ <item name="wcf.acp.masterPassword.init"><![CDATA[Hauptkennwort festlegen]]></item>
+ <item name="wcf.acp.masterPassword.init.description"><![CDATA[Das Hauptkennwort ist ein zusätzlicher Schutz für sicherheitskritische Funktionen. Sie sollten hier ein möglichst sicheres Kennwort verwenden, dass sich von Ihrem normalen Administrator-Kennwort unterscheidet, Dritten nicht bekannt ist und auch nicht auf anderen Internetseiten verwendet wird.]]></item>
+ </category>
+ <category name="wcf.acp.menu">
+ <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatisches Update]]></item>
+ <item name="wcf.acp.menu.link.content"><![CDATA[Inhalte]]></item>
+ <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Zeitgesteuerte Aufgabe hinzufügen]]></item>
+ <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[Zeitgesteuerte Aufgaben]]></item>
+ <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[Zeitgesteuerte Aufgaben auflisten]]></item>
+ <item name="wcf.acp.menu.link.display"><![CDATA[Darstellung]]></item>
+ <item name="wcf.acp.menu.link.group"><![CDATA[Benutzergruppen]]></item>
+ <item name="wcf.acp.menu.link.group.add"><![CDATA[Benutzergruppe hinzufügen]]></item>
+ <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-Mail an Gruppenmitglieder]]></item>
+ <item name="wcf.acp.menu.link.group.view"><![CDATA[Benutzergruppen auflisten]]></item>
+ <item name="wcf.acp.menu.link.log"><![CDATA[Protokoll]]></item>
+ <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>
+ <item name="wcf.acp.menu.link.log.session"><![CDATA[Sitzungen]]></item>
+ <item name="wcf.acp.menu.link.maintenance"><![CDATA[Wartung]]></item>
+ <item name="wcf.acp.menu.link.option"><![CDATA[Optionen]]></item>
+ <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Sichern & Wiederherstellen]]></item>
+ <item name="wcf.acp.menu.link.package"><![CDATA[Paketverwaltung]]></item>
+ <item name="wcf.acp.menu.link.package.database"><![CDATA[Pakete suchen]]></item>
+ <item name="wcf.acp.menu.link.package.install"><![CDATA[Paket installieren]]></item>
+ <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Server hinzufügen]]></item>
+ <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server auflisten]]></item>
+ <item name="wcf.acp.menu.link.package.view"><![CDATA[Pakete auflisten]]></item>
+ <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>
+ <item name="wcf.acp.menu.link.user"><![CDATA[Benutzer]]></item>
+ <item name="wcf.acp.menu.link.user.add"><![CDATA[Benutzer hinzufügen]]></item>
+ <item name="wcf.acp.menu.link.user.list"><![CDATA[Benutzer auflisten]]></item>
+ <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-Mail an alle Benutzer]]></item>
+ <item name="wcf.acp.menu.link.user.management"><![CDATA[Benutzer]]></item>
+ <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>
+ <item name="wcf.acp.menu.link.user.search"><![CDATA[Benutzer suchen]]></item>
+ </category>
+ <category name="wcf.acp.option">
+ <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Hostname ausschließen]]></item>
+ <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Geben Sie pro Zeile einen Hostname an, die Sie von der Seite ausschließen möchten.]]></item>
+ <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[IP-Adresse ausschließen]]></item>
+ <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Geben Sie pro Zeile eine IP-Adresse an, die Sie von der Seite ausschließen möchten.]]></item>
+ <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Browser-Kennung ausschließen]]></item>
+ <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Geben Sie pro Zeile eine Browser-Kennung (User-Agent) an, die Sie von der Seite ausschließen möchten.]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache-Server]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Geben Sie hier die Adresse des Memcache-Servers ein! Mehrere Server können zeilenweise angegeben werden.]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Persistente Verbindungen aktivieren]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[Sollen beim Verbinden mit dem Memcache-Server persistente Verbindungen genutzt werden?]]></item>
+ <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache-Methode]]></item>
+ <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>
+ <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Bitte wählen Sie die gewünschte Cache-Methode aus! Beachten Sie, dass einige Methoden spezielle Anforderungen an das Server-System stellen und nicht auf jedem Server zur Verfügung stehen.]]></item>
+ <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[Dateisystem (Standard)]]></item>
+ <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (Experimentell)]]></item>
+ <item name="wcf.acp.option.category.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>
+ <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.cache.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>
+ <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache speichert häufig benötige Daten im Arbeitsspeicher zwischen. Dies kann die Last auf die Datenbank und das Dateisystem drastisch reduzieren. Lesen Sie mehr über dieses Thema auf der folgenden Seite:
+<ul>
+ <li><a href="http://memcached.org/">memcached.org</a></li>
+</ul>]]></item>
+ <item name="wcf.acp.option.category.general.date"><![CDATA[Datum & Zeit]]></item>
+ <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>
+ <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>
+ <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>
+ <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy-Server]]></item>
+ <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[Hier können Sie optional Proxy-Server für Verbindungen zu externen Servern konfigurieren.]]></item>
+ <item name="wcf.acp.option.category.general.mail"><![CDATA[E-Mails]]></item>
+ <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.mail.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Versand]]></item>
+ <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.offline"><![CDATA[Wartungsmodus]]></item>
+ <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module"><![CDATA[Module an / aus]]></item>
+ <item name="wcf.acp.option.category.module.content"><![CDATA[Inhalte]]></item>
+ <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.display"><![CDATA[Darstellung]]></item>
+ <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>
+ <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.user"><![CDATA[Benutzer]]></item>
+ <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security"><![CDATA[Sicherheit]]></item>
+ <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>
+ <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internetseiten werden häufig durch andere Programme angegriffen. So gibt es beispielsweise die Möglichkeit, automatisiert hunderte von Benutzerkonten zu erstellen. Um sich davor zu schützen, können Sie an verschiedenen Stellen ein sogenanntes <a href="http://de.wikipedia.org/wiki/Captcha" class="externalURL">Captcha-Bild</a> anzeigen lassen. Unregistrierte Benutzer müssen erst den Code eingeben, der auf diesem Bild steht. Roboter können diesen Code nicht lesen. Beachten Sie, dass Captcha-Bilder von blinden und sehbehinderten Benutzern nicht identifiziert werden können.]]></item>
+ <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>
+ <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.censorship"><![CDATA[Zensur]]></item>
+ <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sitzungen]]></item>
+ <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.user"><![CDATA[Mitglieder]]></item>
+ <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookiedomain]]></item>
+ <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Hier können Sie optional eine Domain angeben, unter der der Cookie laufen soll. Standardmäßig sollten Sie dieses Feld frei lassen, da ein Ausfüllen nur in wenigen Fällen notwendig ist.]]></item>
+ <item name="wcf.acp.option.cookie_path"><![CDATA[Cookiepfad]]></item>
+ <item name="wcf.acp.option.cookie_path.description"><![CDATA[Der Cookiepfad wird absolut zum Document Root angegeben - also z.B. "/forum" für http://www.woltlab.de/forum.]]></item>
+ <item name="wcf.acp.option.cookie_prefix"><![CDATA[Präfix für Cookienamen]]></item>
+ <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Geben Sie einen Präfix an, der bei Cookienamen verwendet wird.]]></item>
+ <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Uhr automatisch auf Sommer-/Winterzeit umstellen]]></item>
+ <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Soll die Uhr automatisch auf Sommer-/Winterzeit umgestellt werden?]]></item>
+ <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Cache-Methode für Sitzungsdaten verwenden]]></item>
+ <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Soll für die Speicherung der Sitzungsdaten die ausgewählte Cache-Methode verwendet werden?]]></item>
+ <item name="wcf.acp.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>
+ <item name="wcf.acp.option.export"><![CDATA[Optionen sichern]]></item>
+ <item name="wcf.acp.option.export.download"><![CDATA[Sicherung der Optionen herunterladen]]></item>
+ <item name="wcf.acp.option.export.download.description"><![CDATA[Laden Sie eine Sicherung der Optionen auf Ihren lokalen Rechner herunter.]]></item>
+ <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Gzip-Komprimierung aktivieren]]></item>
+ <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Durch Aktivierung dieser Option werden die Inhalte komprimiert vom Server an den Client gesendet. Dies reduziert den Traffic.]]></item>
+ <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Seitencaching im Client-Browser verhindern]]></item>
+ <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Durch Aktivierung dieser Option können Sie das Caching der Seite im Browser verhindern.]]></item>
+ <item name="wcf.acp.option.http_gzip_level"><![CDATA[Gzip-Komprimierungslevel]]></item>
+ <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[Werte von 1-9 sind zulässig. Als Optimum zwischen Komprimierung und Serverlast empfiehlt sich Level 1.]]></item>
+ <item name="wcf.acp.option.import"><![CDATA[Optionen wiederherstellen]]></item>
+ <item name="wcf.acp.option.import.error.importFailed"><![CDATA[Die Optionen konnten nicht erfolgreich importiert werden.]]></item>
+ <item name="wcf.acp.option.import.success"><![CDATA[Die Optionen wurden erfolgreich importiert.]]></item>
+ <item name="wcf.acp.option.import.upload"><![CDATA[Sicherung der Optionen vom lokalen Computer hochladen]]></item>
+ <item name="wcf.acp.option.import.upload.description"><![CDATA[Geben Sie eine Sicherung der Optionen von Ihrem lokalen Rechner an.]]></item>
+ <item name="wcf.acp.option.importAndExport"><![CDATA[Optionen sichern & wiederherstellen]]></item>
+ <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator-Adresse]]></item>
+ <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Geben Sie die E-Mail-Adresse des Administrators an.]]></item>
+ <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Logfile-Pfad]]></item>
+ <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Geben Sie den Pfad zum Logfile an.]]></item>
+ <item name="wcf.acp.option.mail_from_address"><![CDATA[Absender-Adresse]]></item>
+ <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Geben Sie die Absender-Adresse bei automatisch generierten E-Mails an.]]></item>
+ <item name="wcf.acp.option.mail_from_name"><![CDATA[Absender-Name]]></item>
+ <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Geben Sie den Namen des Absenders bei automatisch generierten E-Mails an.]]></item>
+ <item name="wcf.acp.option.mail_send_method"><![CDATA[Versandmethode]]></item>
+ <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>
+ <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Wählen Sie eine Versandmethode aus.]]></item>
+ <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>
+ <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>
+ <item name="wcf.acp.option.mail_signature"><![CDATA[Signatur]]></item>
+ <item name="wcf.acp.option.mail_signature.description"><![CDATA[Tragen Sie hier eine Signatur ein, die bei System-E-Mails angezeigt werden soll.]]></item>
+ <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP-Server]]></item>
+ <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Tragen Sie hier den SMTP-Server ein.]]></item>
+ <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP-Kennwort]]></item>
+ <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Geben Sie das SMTP-Kennwort an.]]></item>
+ <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP-Port]]></item>
+ <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Geben Sie den SMTP-Port an.]]></item>
+ <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP-Benutzer]]></item>
+ <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Geben Sie den SMTP-Benutzer an.]]></item>
+ <item name="wcf.acp.option.mail_use_f_param"><![CDATA[»-f« Parameter verwenden]]></item>
+ <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Manche Server benötigen den »-f« Parameter beim Versenden von E-Mails. Falls Sie Probleme mit dem Versand von E-Mails haben, aktivieren Sie diese Einstellung.]]></item>
+ <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Formatierte E-Mail-Adressen verwenden]]></item>
+ <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Absender- und Empfänger-Adressen werden in folgendes Format gebracht: "Name <email@domain.tld>". Diese Funktion wird nicht von allen Mailservern unterstützt und sollte daher bei Problemen abgeschaltet werden.]]></item>
+ <item name="wcf.acp.option.module_master_password"><![CDATA[Hauptkennwort aktivieren]]></item>
+ <item name="wcf.acp.option.module_master_password.description"><![CDATA[Aktiviert die zusätzliche Eingabe eines Kennworts beim Aufruf von sicherheitskritischen Bereichen.]]></item>
+ <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>
+ <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server für HTTP-Verbindungen]]></item>
+ <item name="wcf.acp.option.session_timeout"><![CDATA[Gültigkeitslänge einer Sitzung]]></item>
+ <item name="wcf.acp.option.session_timeout.description"><![CDATA[Geben Sie an, wie lange die Sitzung gültig ist [Sekunden]. ]]></item>
+ <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[IP-Adresse der Sitzung überprüfen]]></item>
+ <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[Anzahl der Blöcke der IP-Adresse die beim Auslesen der Sitzung überprüft werden sollen. Eine hohe Einstellung kann Benutzer ausschließen, die mit wechselnden IP-Adressen im Internet unterwegs sind.]]></item>
+ <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Browser-Kennung der Sitzung überprüfen]]></item>
+ <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Soll die Browser-Kennung beim Auslesen der Sitzung überprüft werden?]]></item>
+ <item name="wcf.acp.option.success"><![CDATA[Ihre Einstellungsänderungen wurden erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.option.timezone"><![CDATA[Zeitzone]]></item>
+ <item name="wcf.acp.option.timezone.description"><![CDATA[Wählen Sie die Standard Zeitzone Ihrer Seite.]]></item>
+ <item name="wcf.acp.option.user_online_timeout"><![CDATA[Timeout für Benutzer-Online]]></item>
+ <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Geben Sie an, wie lange der Benutzer trotz Inaktivität als online markiert werden soll [Sekunden].]]></item>
+ <item name="wcf.acp.option.category.general.page"><![CDATA[Seite]]></item>
+ <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.meta_description"><![CDATA[Meta Description]]></item>
+ <item name="wcf.acp.option.meta_description.description"><![CDATA[Geben Sie eine Meta Description an.]]></item>
+ <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta Keywords]]></item>
+ <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Tragen Sie die Wörter ein, die im Meta-Tag Keywords stehen sollen.]]></item>
+ <item name="wcf.acp.option.page_description"><![CDATA[Seitenbeschreibung]]></item>
+ <item name="wcf.acp.option.page_description.description"><![CDATA[Fügen Sie hier eine kurze Beschreibung Ihrer Seite ein.]]></item>
+ <item name="wcf.acp.option.page_title"><![CDATA[Titel der Seite]]></item>
+ <item name="wcf.acp.option.page_title.description"><![CDATA[Geben Sie hier den Globalen Titel der Seite an. Dieser Titel wird im Seitenkopf dargestellt, wenn Sie die Anzeige dieses Textes im Stileditor aktiviert haben.]]></item>
+ <item name="wcf.acp.option.page_url"><![CDATA[Adresse (URL) der Seite]]></item>
+ <item name="wcf.acp.option.page_url.description"><![CDATA[Geben Sie an, unter welcher Adresse (URL) die Seite aufzurufen ist (ohne abschließenden Slash).]]></item>
+ <item name="wcf.acp.option.page_urls"><![CDATA[Weitere URLs]]></item>
+ <item name="wcf.acp.option.page_urls.description"><![CDATA[Geben Sie hier weitere URLs an, unter denen Ihre Seite erreichbar ist.]]></item>
+ </category>
+ <category name="wcf.acp.package">
+ <item name="wcf.acp.package.cancel"><![CDATA[Abbruch der Paketinstallation]]></item>
+ <item name="wcf.acp.package.description"><![CDATA[Beschreibung]]></item>
+ <item name="wcf.acp.package.install"><![CDATA[Paketinstallation]]></item>
+ <item name="wcf.acp.package.install.cancel"><![CDATA[Installation abbrechen]]></item>
+ <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Wollen Sie die Installation wirklich abbrechen?]]></item>
+ <item name="wcf.acp.package.install.error"><![CDATA[Die Abhängigkeiten dieses Paketes konnten nicht aufgelöst werden.]]></item>
+ <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[Die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket »{$packageName}« in Version {$packageVersion} kann aufgrund von Inkompatibilitäten zu {if $excludedPackages|count == 1}folgendem Paket{else}folgenden Paketen{/if} nicht durchgeführt werden:]]></item>
+ <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in Version {$excludedPackage.packageVersion}]]></item>
+ <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket lässt{else}Folgende Pakete lassen{/if} die {if $action == 'install'}Paketinstallation{else}Paketaktualisierung{/if} von Paket »{$packageName}« in Version {$packageVersion} aufgrund von Inkompatibilitäten nicht zu:]]></item>
+ <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in Version {$excludingPackage.packageVersion}]]></item>
+ <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Folgendes Paket ist{else}Folgende Pakete sind{/if} mit dem Paket »{$packageName}« in Version {$packageVersion} nicht kompatibel. Wenn Sie die Installation fortführen, {if $excludingPackages|count == 1}wird das Paket{else}werden die Pakete{/if} vermutlich nicht mehr korrekt funktionieren.]]></item>
+ <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}ist bereits installiert{else}{if $package.file|isset}liegt dem Paket bei{else}fehlt{/if}{/if})</span>]]></item>
+ <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Wollen Sie die Paketinstallation wirklich abbrechen?]]></item>
+ <item name="wcf.acp.package.install.updatableInstances"><![CDATA[Folgende Pakete können mit diesem Paket aktualisiert werden]]></item>
+ <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Wählen Sie eines der folgenden Pakete aus, um seine Version zu aktualisieren. Falls Sie das Paket neu installieren möchten, klicken Sie unten auf »Weiter«.]]></item>
+ <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[Es ist bereits eine Kopie dieses Paketes installiert. Wenn Sie fortfahren, wird eine weitere Kopie dieses Paketes installiert. Falls Sie eine vorhandene Kopie dieses Paketes aktualisieren möchten, wählen Sie die Kopie aus der folgenden Liste aus.]]></item>
+ <item name="wcf.acp.package.install.version"><![CDATA[Version des Paketes:]]></item>
+ <item name="wcf.acp.package.installDate"><![CDATA[Installationsdatum]]></item>
+ <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[Beim Versuch die Dateien des Paketes zu entpacken, ist folgender Fehler aufgetreten:]]></item>
+ <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[Folgende Dateien konnten nicht erfolgreich entpackt werden. Bitte überprüfen Sie, ob der entsprechende Zielort beschreibbar ist.]]></item>
+ <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Tabellen Konflikt]]></item>
+ <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Keine Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>
+ <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Alle Tabellen überschreiben und während der gesamten Installation nicht mehr nachfragen.]]></item>
+ <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Notwendige Änderungen]]></item>
+ <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Betroffene Tabelle]]></item>
+ <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Vorhandene Tabellen Ihrer Datenbank stehen im Konflikt mit Tabellen, die für dieses Paket installiert werden müssen. Bitte wählen Sie aus, ob diese Tabellen überschrieben werden sollen.]]></item>
+ <item name="wcf.acp.package.list"><![CDATA[Installierte Pakete]]></item>
+ <item name="wcf.acp.package.list.author"><![CDATA[Hersteller]]></item>
+ <item name="wcf.acp.package.list.count"><![CDATA[Insgesamt sind {#$items} Pakete installiert.]]></item>
+ <item name="wcf.acp.package.list.date"><![CDATA[Herstellungsdatum]]></item>
+ <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>
+ <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>
+ <item name="wcf.acp.package.list.other"><![CDATA[Sonstiges Paket]]></item>
+ <item name="wcf.acp.package.list.plugin"><![CDATA[Zusatzmodul]]></item>
+ <item name="wcf.acp.package.list.standalone"><![CDATA[Endanwendung]]></item>
+ <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>
+ <item name="wcf.acp.package.optionals"><![CDATA[Optionale Zusatzpakete installieren]]></item>
+ <item name="wcf.acp.package.optionals.description"><![CDATA[Das aktuelle Paket bringt folgende optionale Zusatzpakete mit. Bitte wählen Sie aus, welche Zusatzpakete Sie installieren möchten.]]></item>
+ <item name="wcf.acp.package.optionals.installed"><![CDATA[ (Dieses Paket ist bereits installiert.)]]></item>
+ <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (Die Voraussetzungen für dieses Paket werden nicht erfüllt.)]]></item>
+ <item name="wcf.acp.package.packageDir"><![CDATA[Installationsverzeichnis]]></item>
+ <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>
+ <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Es ist bereits eine andere Anwendung in dem angegebenen Verzeichnis installiert.]]></item>
+ <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>
+ <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[Das angegebene Verzeichnis ist nicht beschreibbar.]]></item>
+ <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[Das angegebene Verzeichnis wird bereits von WoltLab Community Framework beansprucht. Bitte wählen Sie ein anderes Verzeichnis.]]></item>
+ <item name="wcf.acp.package.packageDir.input"><![CDATA[Bitte geben Sie hier das Installationsverzeichnis an.]]></item>
+ <item name="wcf.acp.package.packageDir.url"><![CDATA[Nach der Installation in das angegebene Installationsverzeichnis ist die Anwendung über folgende Adresse (URL) erreichbar:]]></item>
+ <item name="wcf.acp.package.requirements"><![CDATA[Abhängigkeiten auswählen]]></item>
+ <item name="wcf.acp.package.requirements.description"><![CDATA[Das aktuelle Paket benötigt Pakete, von denen mehrere Instanzen installiert sind. Bitte wählen Sie aus, zu welcher Instanz jeweils eine Abhängigkeit hergestellt werden soll.]]></item>
+ <item name="wcf.acp.package.rollback"><![CDATA[Paketinstallation zurücksetzen]]></item>
+ <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright © {$packageAuthor}]]></item>
+ <item name="wcf.acp.package.startInstall"><![CDATA[Neues Paket installieren]]></item>
+ <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[Das angegebene Paket lässt keine Neuinstallation zu.]]></item>
+ <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[Das angegebene Archiv ist kein gültiges Paket.]]></item>
+ <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[Paket »{$package->getName()}« kann mit dem angegebenen Archiv nicht aktualisiert werden.]]></item>
+ <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[Es konnte keine Datei unter dem angegebenen Pfad gefunden wurden.]]></item>
+ <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[Dieses Paket ist bereits installiert. Das Paket kann nicht mehrfach installiert werden.]]></item>
+ <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[Das Hochladen der ausgewählten Datei ist fehlgeschlagen.]]></item>
+ <item name="wcf.acp.package.startInstall.source"><![CDATA[Quelle auswählen]]></item>
+ <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Direkten Pfad zum Paket angeben]]></item>
+ <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Geben Sie den direkten Pfad zur Paketdatei an. Dabei kann es sich um die Internet Adresse der Paketdatei oder alternativ den Pfad zur Paketdatei im Dateisystem handeln.]]></item>
+ <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Paket vom lokalen Computer hochladen]]></item>
+ <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Geben Sie eine Paketdatei von Ihrem lokalen Rechner an.]]></item>
+ <item name="wcf.acp.package.startUpdate"><![CDATA[Paket »{$package->getName()}« aktualisieren]]></item>
+ <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>
+ <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>
+ <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation abgeschlossen]]></item>
+ <item name="wcf.acp.package.step.install.optionals"><![CDATA[Optionale Pakete werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.package"><![CDATA[Paket wird registriert ...]]></item>
+ <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden installiert ...]]></item>
+ <item name="wcf.acp.package.step.install.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>
+ <item name="wcf.acp.package.step.install.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+ <item name="wcf.acp.package.step.title"><![CDATA[Paket <b>{$packageName|encodeJS}</b>: ]]></item>
+ <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Dateien werden gelöscht ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Deinstallation abgeschlossen]]></item>
+ <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Optionale Pakete werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden deinstalliert ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+ <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Menüpunkte der Administrationsoberfläche werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Templates der Administrationsoberfläche werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Zeitgesteuerte Aufgaben werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Event-Listener werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Dateien werden entpackt ...]]></item>
+ <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Benutzergruppeneinstellungen werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Sprache wird aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Optionen werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Spezielles Skript wird ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Datenbank wird aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Templates werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Benutzerprofilfelder werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden ausgeführt ...]]></item>
+ <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Mögliche Konflikte werden überprüft ...]]></item>
+ <item name="wcf.acp.package.step.update.finish"><![CDATA[Paketaktualisierung abgeschlossen]]></item>
+ <item name="wcf.acp.package.step.update.optionals"><![CDATA[Optionale Pakete werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.package"><![CDATA[Paket wird aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Paket-Installations-Zusatzmodule werden aktualisiert ...]]></item>
+ <item name="wcf.acp.package.step.update.parent"><![CDATA[Zuordnung zum übergeordneten Paket wird vorgenommen ...]]></item>
+ <item name="wcf.acp.package.step.update.requirements"><![CDATA[Abhängigkeiten werden aufgelöst ...]]></item>
+ <item name="wcf.acp.package.uninstall"><![CDATA[Paketdeinstallation]]></item>
+ <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Abbruch der Paketdeinstallation]]></item>
+ <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[Die Deinstallation des Paketes ist nicht möglich, da mindestens ein abhängiges Paket nicht deinstalliert werden kann.]]></item>
+ <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Diese{if $dependentPackages|count == 1}s Paket wird{else} Pakete werden{/if}, nach Ihrer Bestätigung, ohne weitere Sicherheitsabfrage deinstalliert.]]></item>
+ <item name="wcf.acp.package.update"><![CDATA[Paketaktualisierung]]></item>
+ <item name="wcf.acp.package.updateDate"><![CDATA[Aktualisierungsdatum]]></item>
+ <item name="wcf.acp.package.view.author"><![CDATA[Hersteller:]]></item>
+ <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Zur Administrationsoberfläche wechseln]]></item>
+ <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Paket deinstallieren]]></item>
+ <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Alle Pakete deinstallieren]]></item>
+ <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Wollen Sie dieses Paket wirklich deinstallieren?]]></item>
+ <item name="wcf.acp.package.view.button.update"><![CDATA[Paket aktualisieren]]></item>
+ <item name="wcf.acp.package.view.date"><![CDATA[Herstellungsdatum:]]></item>
+ <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Abhängige Pakete]]></item>
+ <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[Dieses Paket wird von {#$dependentPackages|count} {if $dependentPackages|count == 1}anderen Paket{else}anderen Paketen{/if} benötigt.]]></item>
+ <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}Dieses Paket wird von 1 anderen Paket benötigt{else}{#$dependentPackages|count} Pakete sind direkt oder indirekt von diesem Paket abhängig{/if}.]]></item>
+ <item name="wcf.acp.package.view.dir"><![CDATA[Installationsverzeichnis:]]></item>
+ <item name="wcf.acp.package.view.identifier"><![CDATA[Bezeichner:]]></item>
+ <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installierte Instanz:]]></item>
+ <item name="wcf.acp.package.view.parent"><![CDATA[Übergeordnetes Paket:]]></item>
+ <item name="wcf.acp.package.view.properties"><![CDATA[Eigenschaften]]></item>
+ <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Benötigte Pakete]]></item>
+ <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[Dieses Paket benötigt {#$requiredPackages|count} {if $requiredPackages|count == 1}anderes Paket{else}andere Pakete{/if}.]]></item>
+ <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>
+ <item name="wcf.acp.package.view.version"><![CDATA[Installierte Version:]]></item>
+ </category>
+ <category name="wcf.acp.packageUpdate">
+ <item name="wcf.acp.packageUpdate"><![CDATA[Pakete aktualisieren]]></item>
+ <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentifizierung mit Update-Server]]></item>
+ <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Verbindungs-Daten]]></item>
+ <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Benutzername und Kennwort wurden nicht akzeptiert.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Kennwort]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Geben Sie ein Kennwort an, das zur Authentifizierung benötigt wird.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Benutzername]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Geben Sie einen Benutzernamen an, der zur Authentifizierung benötigt wird.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[Benutzeranmeldung]]></item>
+ <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server-Meldung]]></item>
+ <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server-Name]]></item>
+ <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Benutzerdaten dauerhaft speichern]]></item>
+ <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[Speichert die eingegebenen Benutzerdaten dauerhaft, sodass Sie die Daten zu einem späteren Zeitpunkt nicht erneut eingeben müssen.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Adresse]]></item>
+ <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installierte Version]]></item>
+ <item name="wcf.acp.packageUpdate.error"><![CDATA[Es ist folgender Fehler aufgetreten: ]]></item>
+ <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[Das Herunterladen des Paketes {$package} ist fehlgeschlagen.]]></item>
+ <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[Beim Versuch die Paketliste herunterzuladen, ist ein Fehler aufgetreten.]]></item>
+ <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[Es {if $excludedPackages|count == 1}ist folgender Konflikt{else}sind folgende Konflikte{/if} aufgetreten:]]></item>
+ <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[Das installierte Paket »{$excludedPackage.existingPackageName}« ist mit dem Paket »{$excludedPackage.packageName}« in Version {$excludedPackage.packageVersion} nicht kompatibel.]]></item>
+ <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[Das Paket »{$excludedPackage.packageName}« in Version {$excludedPackage.packageVersion} ist mit dem installierten Paket »{$excludedPackage.existingPackageName}« nicht kompatibel.]]></item>
+ <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} wird installiert]]></item>
+ <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[Derzeit sind keine Updates verfügbar.]]></item>
+ <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[Sie haben kein Update ausgewählt.]]></item>
+ <item name="wcf.acp.packageUpdate.options"><![CDATA[Optionen]]></item>
+ <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[Paket ist bereits installiert und kann kein weiteres Mal installiert werden.]]></item>
+ <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Paket installieren]]></item>
+ <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Weitere Paket-Instanz installieren (Paket ist bereits {#$package.instances} mal installiert)]]></item>
+ <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Installiertes Paket {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} Version {$updatableInstance.packageVersion} aktualisieren]]></item>
+ <item name="wcf.acp.packageUpdate.search"><![CDATA[Pakete suchen]]></item>
+ <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Autor]]></item>
+ <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Suche nach ...]]></item>
+ <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Bereits installierte einzigartige Pakete ausblenden]]></item>
+ <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Paketname]]></item>
+ <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Paketname und -beschreibung durchsuchen]]></item>
+ <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update-Server]]></item>
+ <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Alle Update-Server durchsuchen]]></item>
+ <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Art des Paketes]]></item>
+ <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Sonstige Pakete]]></item>
+ <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Zusatzmodul für bereits installierte Pakete]]></item>
+ <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Endanwendung]]></item>
+ <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Alle Pakete auswählen]]></item>
+ <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} wird aktualisiert auf {$package.toVersion}]]></item>
+ <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[Neue Version]]></item>
+ <item name="wcf.acp.packageUpdate.updates"><![CDATA[Folgende Paket-Aktualisierungen/-Installationen werden durchgeführt:]]></item>
+ </category>
+ <category name="wcf.acp.sessionLog">
+ <item name="wcf.acp.sessionLog.access.view"><![CDATA[Aktionen der protokollierten Sitzung von »{$sessionLog->username}«]]></item>
+ <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[Insgesamt {#$items} protokollierte Aktion{if $items != 1}en{/if}]]></item>
+ <item name="wcf.acp.sessionLog.accesses"><![CDATA[Aktionen]]></item>
+ <item name="wcf.acp.sessionLog.className"><![CDATA[Klasse]]></item>
+ <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP-Adresse]]></item>
+ <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Letzte Aktion]]></item>
+ <item name="wcf.acp.sessionLog.packageName"><![CDATA[Paket]]></item>
+ <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Methode]]></item>
+ <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>
+ <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>
+ <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>
+ <item name="wcf.acp.sessionLog.time"><![CDATA[Datum]]></item>
+ <item name="wcf.acp.sessionLog.userAgent"><![CDATA[Browser-Kennung]]></item>
+ <item name="wcf.acp.sessionLog.view"><![CDATA[Protokollierte Sitzungen]]></item>
+ <item name="wcf.acp.sessionLog.view.count"><![CDATA[Insgesamt {#$items} protokollierte Sitzung{if $items != 1}en{/if}]]></item>
+ </category>
+ <category name="wcf.acp.updateServer">
+ <item name="wcf.acp.updateServer.add"><![CDATA[Server hinzufügen]]></item>
+ <item name="wcf.acp.updateServer.add.success"><![CDATA[Der Server wurde erfolgreich angelegt.]]></item>
+ <item name="wcf.acp.updateServer.data"><![CDATA[Server-Daten]]></item>
+ <item name="wcf.acp.updateServer.delete"><![CDATA[Server löschen]]></item>
+ <item name="wcf.acp.updateServer.delete.success"><![CDATA[Der Server wurde erfolgreich gelöscht.]]></item>
+ <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Wollen Sie den Server wirklich löschen?]]></item>
+ <item name="wcf.acp.updateServer.disable"><![CDATA[Deaktivieren]]></item>
+ <item name="wcf.acp.updateServer.edit"><![CDATA[Server bearbeiten]]></item>
+ <item name="wcf.acp.updateServer.edit.success"><![CDATA[Ihre Änderungen wurden erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.updateServer.enable"><![CDATA[Aktivieren]]></item>
+ <item name="wcf.acp.updateServer.errorText"><![CDATA[Fehlermeldungen]]></item>
+ <item name="wcf.acp.updateServer.htPassword"><![CDATA[Kennwort]]></item>
+ <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Geben Sie ein Kennwort an, das zur Authentifizierung benötigt wird (optional).]]></item>
+ <item name="wcf.acp.updateServer.htUsername"><![CDATA[Benutzername]]></item>
+ <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Geben Sie einen Benutzernamen an, der zur Authentifizierung benötigt wird (optional).]]></item>
+ <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[Beim letzten Verbindungsversuch trat folgende Fehlermeldungen auf:]]></item>
+ <item name="wcf.acp.updateServer.list.available"><![CDATA[Insgesamt {#$items} Server eingetragen]]></item>
+ <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server-ID]]></item>
+ <item name="wcf.acp.updateServer.packages"><![CDATA[Pakete]]></item>
+ <item name="wcf.acp.updateServer.server"><![CDATA[Adresse]]></item>
+ <item name="wcf.acp.updateServer.server.description"><![CDATA[Geben Sie die Adresse (URL) zu einem Paketserver an.]]></item>
+ <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[Die eingetragene Adresse ist ungültig.]]></item>
+ <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>
+ <item name="wcf.acp.updateServer.timestamp"><![CDATA[Letzter Zugriff]]></item>
+ <item name="wcf.acp.updateServer.view"><![CDATA[Verfügbare Update-Server]]></item>
+ <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[Es sind keine Update-Server eingetragen.]]></item>
+ </category>
+ <category name="wcf.acp.user">
+ <item name="wcf.acp.user.add"><![CDATA[Benutzer hinzufügen]]></item>
+ <item name="wcf.acp.user.add.data"><![CDATA[Benutzerdaten]]></item>
+ <item name="wcf.acp.user.add.success"><![CDATA[Der neue Benutzer wurde erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.user.assignToGroup"><![CDATA[Benutzergruppe zuweisen]]></item>
+ <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Folgende Benutzer den unten ausgewählten Benutzergruppen zuweisen]]></item>
+ <item name="wcf.acp.user.assignToGroup.success"><![CDATA[Die Zuweisung wurde erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.user.button.assignGroup"><![CDATA[Benutzergruppe zuweisen]]></item>
+ <item name="wcf.acp.user.button.exportMail"><![CDATA[E-Mail-Adressen exportieren]]></item>
+ <item name="wcf.acp.user.button.sendMail"><![CDATA[E-Mail senden]]></item>
+ <item name="wcf.acp.user.delete"><![CDATA[Benutzer löschen]]></item>
+ <item name="wcf.acp.user.delete.error"><![CDATA[Es konnte kein Benutzer gelöscht werden.]]></item>
+ <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}Der Benutzer wurde{else}{#$deletedUsers} Benutzer wurden{/if} erfolgreich gelöscht.]]></item>
+ <item name="wcf.acp.user.delete.sure"><![CDATA[Wollen Sie diesen Benutzer wirklich löschen?]]></item>
+ <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Wollen Sie die markierten Benutzer wirklich löschen?]]></item>
+ <item name="wcf.acp.user.edit"><![CDATA[Benutzer bearbeiten]]></item>
+ <item name="wcf.acp.user.edit.success"><![CDATA[Die Änderungen an diesem Benutzer wurden erfolgreich gespeichert.]]></item>
+ <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[Sie bearbeiten Ihr eigenes Benutzerkonto. Änderungen an den Mitgliedschaften in Benutzergruppen können womöglich dazu führen, dass Sie aus der Administrationsoberfläche ausgeschlossen werden. Bitte seien Sie entsprechend vorsichtig!]]></item>
+ <item name="wcf.acp.user.exportEmailAddress"><![CDATA[E-Mail-Adressen exportieren]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Exportformat]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Exporteinstellungen]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[E-Mail-Adressen von folgenden Benutzern exportieren]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Trennzeichen]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Texttrenner]]></item>
+ <item name="wcf.acp.user.groups"><![CDATA[Benutzergruppe(n)]]></item>
+ <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Finde Benutzer, die in den ausgewählten Benutzergruppen nicht Mitglied sind.]]></item>
+ <item name="wcf.acp.user.list"><![CDATA[Benutzer]]></item>
+ <item name="wcf.acp.user.list.all"><![CDATA[Alle Benutzer]]></item>
+ <item name="wcf.acp.user.list.count"><![CDATA[Insgesamt {#$items} Benutzer]]></item>
+ <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "Einen Benutzer markiert" : this.count+" Benutzer markiert"]]></item>
+ <item name="wcf.acp.user.massProcessing"><![CDATA[Massenverarbeitung von Benutzern]]></item>
+ <item name="wcf.acp.user.massProcessing.action"><![CDATA[Aktion]]></item>
+ <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Bedingungen]]></item>
+ <item name="wcf.acp.user.massProcessing.success"><![CDATA[Die gewählte Aktion wurde erfolgreich auf {#$affectedUsers} Benutzer ausgeführt.]]></item>
+ <item name="wcf.acp.user.massProcessing.warning"><![CDATA[Die Massenverarbeitung von Benutzern führt die unten ausgewählte Aktion <b>ohne zusätzliche Sicherheitsabfrage</b> auf alle Benutzer aus, die unter die eingestellten Bedingungen fallen. Die Bearbeitungen können unter Umständen sehr rechenintensiv werden und sollten deshalb möglichst nur dann ausgeführt werden, wenn sich die Seite im Wartungsmodus befindet! Die Veränderungen können nicht rückgängig gemacht werden. Bitte benutzen Sie diese Funktion mit der nötigen Vorsicht!]]></item>
+ <item name="wcf.acp.user.search"><![CDATA[Benutzer suchen]]></item>
+ <item name="wcf.acp.user.search.conditions"><![CDATA[Kriterien der Suche]]></item>
+ <item name="wcf.acp.user.search.conditions.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profil]]></item>
+ <item name="wcf.acp.user.search.display"><![CDATA[Darstellung]]></item>
+ <item name="wcf.acp.user.search.display.columns"><![CDATA[Angezeigte Informationen]]></item>
+ <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Sonstiges]]></item>
+ <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profil]]></item>
+ <item name="wcf.acp.user.search.display.general"><![CDATA[Allgemein]]></item>
+ <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Benutzer pro Seite]]></item>
+ <item name="wcf.acp.user.search.display.sort"><![CDATA[Sortierung]]></item>
+ <item name="wcf.acp.user.search.error.noMatches"><![CDATA[Zu den angegebenen Kriterien wurde kein Benutzer gefunden.]]></item>
+ <item name="wcf.acp.user.search.matches"><![CDATA[{if $items == 1}Ein Ergebnis{else}{#$items} Ergebnisse{/if}]]></item>
+ <item name="wcf.acp.user.search.withinResults"><![CDATA[In den Ergebnissen suchen]]></item>
+ <item name="wcf.acp.user.sendMail"><![CDATA[E-Mail an Benutzer senden]]></item>
+ <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail an alle Benutzer]]></item>
+ <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[E-Mail als HTML verschicken]]></item>
+ <item name="wcf.acp.user.sendMail.from"><![CDATA[Absender]]></item>
+ <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Hier können Sie die E-Mail-Adresse des Absenders definieren.{if MAIL_USE_FORMATTED_ADDRESS} Es ist auch folgendes Format möglich:{/if}</p>
+{if MAIL_USE_FORMATTED_ADDRESS}<p style="text-align: center; line-height: 2em;"><code>Absender Name <email@absender.tld></code></p>{/if}
+<p>Wenn Sie unter System -> Optionen -> E-Mail alles ausgefüllt haben, wird dieses Feld automatisch ausgefüllt. Sollten Sie E-Mails per SMTP senden, so achten Sie darauf, dass die E-Mail-Adresse des Absenders auch vom Server akzeptiert werden muss.</p>]]></item>
+ <item name="wcf.acp.user.sendMail.group"><![CDATA[E-Mail an Gruppenmitglieder]]></item>
+ <item name="wcf.acp.user.sendMail.groups"><![CDATA[E-Mail an die Mitglieder folgender Benutzergruppen senden]]></item>
+ <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-Mail]]></item>
+ <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[E-Mail an folgende Benutzer senden]]></item>
+ <item name="wcf.acp.user.sendMail.subject"><![CDATA[Betreff]]></item>
+ <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Geben Sie hier die Betreffzeile der E-Mail an.]]></item>
+ <item name="wcf.acp.user.sendMail.text"><![CDATA[Nachricht]]></item>
+ <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Tragen Sie hier die Nachricht ein, die Sie den Benutzern senden möchten.]]></item>
+ <item name="wcf.acp.user.userNote"><![CDATA[Angemeldet als {$this->user->username}.]]></item>
+ </category>
+ <category name="wcf.acp.worker">
+ <item name="wcf.acp.worker.currentStep"><![CDATA[Aktueller Schritt]]></item>
+ <item name="wcf.acp.worker.description"><![CDATA[Bitte lassen Sie dieses Browser-Fenster offen, bis der Prozess abgeschlossen ist und melden Sie sich auf keinen Fall in einem anderen Browser-Fenster separat in der Administrationsoberfläche an, da dies den Prozess behindern könnte.]]></item>
+ <item name="wcf.acp.worker.progress.finish"><![CDATA[Vorgang erfolgreich abgeschlossen]]></item>
+ <item name="wcf.acp.worker.progress.working"><![CDATA[Vorgang läuft ...]]></item>
+ <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>
+ <item name="wcf.acp.worker.title"><![CDATA[Prozess läuft ...]]></item>
+ </category>
+ <category name="wcf.global">
+ <item name="wcf.global.button.back"><![CDATA[« Zurück]]></item>
+ <item name="wcf.global.button.close"><![CDATA[Schließen]]></item>
+ <item name="wcf.global.button.collapse"><![CDATA[Zuklappen]]></item>
+ <item name="wcf.global.button.collapsible"><![CDATA[Auf- und Zuklappen]]></item>
+ <item name="wcf.global.button.delete"><![CDATA[Löschen]]></item>
+ <item name="wcf.global.button.delete.confirm"><![CDATA[Möchten Sie das Element wirklich löschen?]]></item>
+ <item name="wcf.global.button.deleteCompletely"><![CDATA[Endgültig löschen]]></item>
+ <item name="wcf.global.button.edit"><![CDATA[Bearbeiten]]></item>
+ <item name="wcf.global.button.editor.jump"><![CDATA[Zum Editor wechseln]]></item>
+ <item name="wcf.global.button.expand"><![CDATA[Aufklappen]]></item>
+ <item name="wcf.global.button.mark"><![CDATA[Markieren]]></item>
+ <item name="wcf.global.button.next"><![CDATA[Weiter »]]></item>
+ <item name="wcf.global.button.preview"><![CDATA[Vorschau]]></item>
+ <item name="wcf.global.button.reset"><![CDATA[Zurücksetzen]]></item>
+ <item name="wcf.global.button.submit"><![CDATA[Absenden]]></item>
+ <item name="wcf.global.button.unmark"><![CDATA[Demarkieren]]></item>
+ <item name="wcf.global.date.day"><![CDATA[Tag]]></item>
+ <item name="wcf.global.date.days"><![CDATA[Tage]]></item>
+ <item name="wcf.global.date.hour"><![CDATA[Stunde]]></item>
+ <item name="wcf.global.date.hours"><![CDATA[Stunden]]></item>
+ <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>
+ <item name="wcf.global.date.minutes"><![CDATA[Minuten]]></item>
+ <item name="wcf.global.date.month"><![CDATA[Monat]]></item>
+ <item name="wcf.global.date.months"><![CDATA[Monate]]></item>
+ <item name="wcf.global.date.second"><![CDATA[Sekunde]]></item>
+ <item name="wcf.global.date.seconds"><![CDATA[Sekunden]]></item>
+ <item name="wcf.global.date.week"><![CDATA[Woche]]></item>
+ <item name="wcf.global.date.weeks"><![CDATA[Wochen]]></item>
+ <item name="wcf.global.date.year"><![CDATA[Jahr]]></item>
+ <item name="wcf.global.date.year.notRequired"><![CDATA[Die Angabe des Jahres ist optional.]]></item>
+ <item name="wcf.global.date.years"><![CDATA[Jahre]]></item>
+ <item name="wcf.global.dateInputOrder"><![CDATA[day-month-year]]></item>
+ <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>
+ <item name="wcf.global.defaultValue"><![CDATA[Standard]]></item>
+ <item name="wcf.global.error.backward"><![CDATA[Zurück zur vorherigen Seite]]></item>
+ <item name="wcf.global.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>
+ <item name="wcf.global.error.file.notFound"><![CDATA[Die Datei konnte nicht gefunden werden.]]></item>
+ <item name="wcf.global.error.illegalLink"><![CDATA[Sie haben einen ungültigen oder nicht mehr gültigen Link aufgerufen.]]></item>
+ <item name="wcf.global.error.permissionDenied"><![CDATA[Der Zutritt zu dieser Seite ist Ihnen leider verwehrt. Sie besitzen nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.]]></item>
+ <item name="wcf.global.error.permissionDenied.title"><![CDATA[Zutritt verwehrt]]></item>
+ <item name="wcf.global.error.title"><![CDATA[Fehlermeldung]]></item>
+ <item name="wcf.global.form.error"><![CDATA[Ihre Angaben sind ungültig. Bitte überprüfen Sie die markierten Eingabefelder.]]></item>
+ <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>
+ <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>
+ <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>
+ <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>
+ <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>
+ <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede »Du«)]]></item>
+ <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>
+ <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>
+ <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>
+ <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>
+ <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>
+ <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>
+ <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>
+ <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>
+ <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>
+ <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>
+ <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>
+ <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>
+ <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>
+ <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>
+ <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>
+ <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>
+ <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>
+ <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>
+ <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>
+ <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>
+ <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>
+ <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>
+ <item name="wcf.global.language.th"><![CDATA[Thailändisch]]></item>
+ <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>
+ <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>
+ <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>
+ <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>
+ <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>
+ <item name="wcf.global.multiSelect"><![CDATA[Mehrfache Markierungen sind durch zusätzliches Drücken der Taste »Strg/Ctrl« (Windows) oder »Befehl/Command« (Mac OS) möglich.]]></item>
+ <item name="wcf.global.page.input"><![CDATA[Zu folgender Seite springen]]></item>
+ <item name="wcf.global.page.next"><![CDATA[nächste Seite]]></item>
+ <item name="wcf.global.page.previous"><![CDATA[vorherige Seite]]></item>
+ <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>
+ <item name="wcf.global.pageTitle"><![CDATA[WoltLab® Community Framework™]]></item>
+ <item name="wcf.global.redirect.title"><![CDATA[Weiterleitung]]></item>
+ <item name="wcf.global.redirect.url"><![CDATA[Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!]]></item>
+ <item name="wcf.global.scrollDown"><![CDATA[Zum Seitenende]]></item>
+ <item name="wcf.global.scrollUp"><![CDATA[Zum Seitenanfang]]></item>
+ <item name="wcf.global.search.matchesExactly"><![CDATA[Exakter Treffer]]></item>
+
+ <item name="wcf.global.skipToContent"><![CDATA[Zum Seiteninhalt springen]]></item>
+ <item name="wcf.global.sortOrder.ascending"><![CDATA[in aufsteigender Reihenfolge]]></item>
+ <item name="wcf.global.sortOrder.descending"><![CDATA[in absteigender Reihenfolge]]></item>
+ <item name="wcf.global.thousandsSeparator"><![CDATA[ ]]></item>
+
+ <item name="wcf.global.date.dateFormat"><![CDATA[j. F Y]]></item>
+ <item name="wcf.global.date.timeFormat"><![CDATA[H:i]]></item>
+ <item name="wcf.global.date.dateTimeFormat"><![CDATA[%date%, %time%]]></item>
+
+ <!-- variables for dynamic javascript datetime -->
+ <item name="wcf.global.date.relative.minutes"><![CDATA['Vor ' + (($minutes > 1) ? $minutes + ' Minuten' : 'einer Minute' )]]></item>
+ <item name="wcf.global.date.relative.hours"><![CDATA['Vor ' + (($hours > 1) ? $hours + ' Stunden' : 'einer Stunde' )]]></item>
+ <item name="wcf.global.date.relative.pastDays"><![CDATA[(($days > 1) ? '%day%' : 'Gestern' ) + ', %time%']]></item>
+
+ <!-- variables for localized date formats; unnecessary in english -->
+ <item name="wcf.global.date.month.january"><![CDATA[Januar]]></item>
+ <item name="wcf.global.date.month.february"><![CDATA[Februar]]></item>
+ <item name="wcf.global.date.month.march"><![CDATA[März]]></item>
+ <item name="wcf.global.date.month.april"><![CDATA[April]]></item>
+ <item name="wcf.global.date.month.may"><![CDATA[Mai]]></item>
+ <item name="wcf.global.date.month.june"><![CDATA[Juni]]></item>
+ <item name="wcf.global.date.month.july"><![CDATA[Juli]]></item>
+ <item name="wcf.global.date.month.august"><![CDATA[August]]></item>
+ <item name="wcf.global.date.month.september"><![CDATA[September]]></item>
+ <item name="wcf.global.date.month.october"><![CDATA[Oktober]]></item>
+ <item name="wcf.global.date.month.november"><![CDATA[November]]></item>
+ <item name="wcf.global.date.month.december"><![CDATA[Dezember]]></item>
+ <item name="wcf.global.date.month.jan"><![CDATA[Jan]]></item>
+ <item name="wcf.global.date.month.feb"><![CDATA[Feb]]></item>
+ <item name="wcf.global.date.month.mar"><![CDATA[Mär]]></item>
+ <item name="wcf.global.date.month.apr"><![CDATA[Apr]]></item>
+ <item name="wcf.global.date.month.may"><![CDATA[Mai]]></item>
+ <item name="wcf.global.date.month.jun"><![CDATA[Jun]]></item>
+ <item name="wcf.global.date.month.jul"><![CDATA[Jul]]></item>
+ <item name="wcf.global.date.month.aug"><![CDATA[Aug]]></item>
+ <item name="wcf.global.date.month.sep"><![CDATA[Sep]]></item>
+ <item name="wcf.global.date.month.oct"><![CDATA[Okt]]></item>
+ <item name="wcf.global.date.month.nov"><![CDATA[Nov]]></item>
+ <item name="wcf.global.date.month.dec"><![CDATA[Dez]]></item>
+ <item name="wcf.global.date.day.sunday"><![CDATA[Sonntag]]></item>
+ <item name="wcf.global.date.day.monday"><![CDATA[Montag]]></item>
+ <item name="wcf.global.date.day.tuesday"><![CDATA[Dienstag]]></item>
+ <item name="wcf.global.date.day.wednesday"><![CDATA[Mittwoch]]></item>
+ <item name="wcf.global.date.day.thursday"><![CDATA[Donnerstag]]></item>
+ <item name="wcf.global.date.day.friday"><![CDATA[Freitag]]></item>
+ <item name="wcf.global.date.day.saturday"><![CDATA[Samstag]]></item>
+ <item name="wcf.global.date.day.sun"><![CDATA[Son]]></item>
+ <item name="wcf.global.date.day.mon"><![CDATA[Mon]]></item>
+ <item name="wcf.global.date.day.tue"><![CDATA[Die]]></item>
+ <item name="wcf.global.date.day.wed"><![CDATA[Mit]]></item>
+ <item name="wcf.global.date.day.thu"><![CDATA[Don]]></item>
+ <item name="wcf.global.date.day.fri"><![CDATA[Fre]]></item>
+ <item name="wcf.global.date.day.sat"><![CDATA[Sam]]></item>
+ <item name="wcf.global.date.timezone.pacific.kwajalein"><![CDATA[(UTC-12:00) Kwajalein]]></item>
+ <item name="wcf.global.date.timezone.pacific.midway"><![CDATA[(UTC-11:00) Midway]]></item>
+ <item name="wcf.global.date.timezone.pacific.samoa"><![CDATA[(UTC-11:00) Samoa]]></item>
+ <item name="wcf.global.date.timezone.pacific.honolulu"><![CDATA[(UTC-10:00) Hawaii]]></item>
+ <item name="wcf.global.date.timezone.america.anchorage"><![CDATA[(UTC-09:00) Alaska]]></item>
+ <item name="wcf.global.date.timezone.america.tijuana"><![CDATA[(UTC-08:00) Tijuana, Niederkalifornien]]></item>
+ <item name="wcf.global.date.timezone.america.los_angeles"><![CDATA[(UTC-08:00) Pacific Zeit]]></item>
+ <item name="wcf.global.date.timezone.america.phoenix"><![CDATA[(UTC-07:00) Arizona]]></item>
+ <item name="wcf.global.date.timezone.america.chihuahua"><![CDATA[(UTC-07:00) Chihuahua, La Paz, Mazatlan]]></item>
+ <item name="wcf.global.date.timezone.america.denver"><![CDATA[(UTC-07:00) Mountain Zeit]]></item>
+ <item name="wcf.global.date.timezone.america.chicago"><![CDATA[(UTC-06:00) Central Zeit]]></item>
+ <item name="wcf.global.date.timezone.america.mexico_city"><![CDATA[(UTC-06:00) Guadalajara, Mexiko-Stadt, Monterrey]]></item>
+ <item name="wcf.global.date.timezone.america.tegucigalpa"><![CDATA[(UTC-06:00) Mittelamerika]]></item>
+ <item name="wcf.global.date.timezone.america.regina"><![CDATA[(UTC-06:00) Saskatchewan]]></item>
+ <item name="wcf.global.date.timezone.america.bogota"><![CDATA[(UTC-05:00) Bogotá, Lima, Quito]]></item>
+ <item name="wcf.global.date.timezone.america.new_york"><![CDATA[(UTC-05:00) Eastern Zeit]]></item>
+ <item name="wcf.global.date.timezone.america.indiana.indianapolis"><![CDATA[(UTC-05:00) Indiana (Ost)]]></item>
+ <item name="wcf.global.date.timezone.america.rio_branco"><![CDATA[(UTC-05:00) Rio Branco]]></item>
+ <item name="wcf.global.date.timezone.america.caracas"><![CDATA[(UTC-04:30) Caracas]]></item>
+ <item name="wcf.global.date.timezone.america.asuncion"><![CDATA[(UTC-04:00) Asuncion]]></item>
+ <item name="wcf.global.date.timezone.america.halifax"><![CDATA[(UTC-04:00) Atlantic (Kanada)]]></item>
+ <item name="wcf.global.date.timezone.america.cuiaba"><![CDATA[(UTC-04:00) Cuiaba]]></item>
+ <item name="wcf.global.date.timezone.america.la_paz"><![CDATA[(UTC-04:00) Georgetown, La Paz, Manaus, San Juan]]></item>
+ <item name="wcf.global.date.timezone.america.santiago"><![CDATA[(UTC-04:00) Santiago]]></item>
+ <item name="wcf.global.date.timezone.america.st_johns"><![CDATA[(UTC-03:30) Neufundland]]></item>
+ <item name="wcf.global.date.timezone.america.sao_paulo"><![CDATA[(UTC-03:00) Brasilia]]></item>
+ <item name="wcf.global.date.timezone.america.argentina.buenos_aires"><![CDATA[(UTC-03:00) Buenos Aires]]></item>
+ <item name="wcf.global.date.timezone.america.cayenne"><![CDATA[(UTC-03:00) Cayenne, Fortaleza]]></item>
+ <item name="wcf.global.date.timezone.america.godthab"><![CDATA[(UTC-03:00) Grönland]]></item>
+ <item name="wcf.global.date.timezone.america.montevideo"><![CDATA[(UTC-03:00) Montevideo]]></item>
+ <item name="wcf.global.date.timezone.atlantic.south_georgia"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>
+ <item name="wcf.global.date.timezone.atlantic.azores"><![CDATA[(UTC-01:00) Azoren]]></item>
+ <item name="wcf.global.date.timezone.atlantic.cape_verde"><![CDATA[(UTC-01:00) Kap Verde]]></item>
+ <item name="wcf.global.date.timezone.africa.casablanca"><![CDATA[(UTC) Casablanca]]></item>
+ <item name="wcf.global.date.timezone.europe.london"><![CDATA[(UTC) Dublin, Edinburgh, Lissabon, London]]></item>
+ <item name="wcf.global.date.timezone.africa.monrovia"><![CDATA[(UTC) Monrovia, Reykjavik]]></item>
+ <item name="wcf.global.date.timezone.europe.berlin"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien]]></item>
+ <item name="wcf.global.date.timezone.europe.belgrade"><![CDATA[(UTC+01:00) Belgrad, Bratislava, Bupdapest, Ljubljana, Prag]]></item>
+ <item name="wcf.global.date.timezone.europe.paris"><![CDATA[(UTC+01:00) Brüssel, Kopenhagen, Madrid, Paris]]></item>
+ <item name="wcf.global.date.timezone.europe.sarajevo"><![CDATA[(UTC+01:00) Sarajevo, Skopje, Warschau, Zagreb]]></item>
+ <item name="wcf.global.date.timezone.africa.algiers"><![CDATA[(UTC+01:00) West-Zentralafrika]]></item>
+ <item name="wcf.global.date.timezone.africa.windhoek"><![CDATA[(UTC+01:00) Windhuk]]></item>
+ <item name="wcf.global.date.timezone.asia.amman"><![CDATA[(UTC+02:00) Amman]]></item>
+ <item name="wcf.global.date.timezone.europe.athens"><![CDATA[(UTC+02:00) Athen, Bukarest, Istanbul]]></item>
+ <item name="wcf.global.date.timezone.asia.beirut"><![CDATA[(UTC+02:00) Beirut]]></item>
+ <item name="wcf.global.date.timezone.asia.damascus"><![CDATA[(UTC+02:00) Damaskus]]></item>
+ <item name="wcf.global.date.timezone.africa.harare"><![CDATA[(UTC+02:00) Harare, Pretoria]]></item>
+ <item name="wcf.global.date.timezone.europe.helsinki"><![CDATA[(UTC+02:00) Helsinki, Kiew, Riga, Sofia, Tallinn, Wilna]]></item>
+ <item name="wcf.global.date.timezone.asia.jerusalem"><![CDATA[(UTC+02:00) Jerusalem]]></item>
+ <item name="wcf.global.date.timezone.africa.cairo"><![CDATA[(UTC+02:00) Kairo]]></item>
+ <item name="wcf.global.date.timezone.europe.minsk"><![CDATA[(UTC+02:00) Minsk]]></item>
+ <item name="wcf.global.date.timezone.asia.baghdad"><![CDATA[(UTC+03:00) Bagdad]]></item>
+ <item name="wcf.global.date.timezone.asia.kuwait"><![CDATA[(UTC+03:00) Kuwait, Riad]]></item>
+ <item name="wcf.global.date.timezone.europe.moscow"><![CDATA[(UTC+03:00) Moskau, St. Petersburg, Wolgograd]]></item>
+ <item name="wcf.global.date.timezone.africa.nairobi"><![CDATA[(UTC+03:00) Nairobi]]></item>
+ <item name="wcf.global.date.timezone.asia.tehran"><![CDATA[(UTC+03:30) Teheran]]></item>
+ <item name="wcf.global.date.timezone.asia.muscat"><![CDATA[(UTC+04:00) Abu Dhabi, Muskat]]></item>
+ <item name="wcf.global.date.timezone.asia.baku"><![CDATA[(UTC+04:00) Baku]]></item>
+ <item name="wcf.global.date.timezone.asia.yerevan"><![CDATA[(UTC+04:00) Eriwan]]></item>
+ <item name="wcf.global.date.timezone.indian.mauritius"><![CDATA[(UTC+04:00) Port Louis]]></item>
+ <item name="wcf.global.date.timezone.asia.tbilisi"><![CDATA[(UTC+04:00) Tiflis]]></item>
+ <item name="wcf.global.date.timezone.asia.kabul"><![CDATA[(UTC+04:30) Kabul]]></item>
+ <item name="wcf.global.date.timezone.asia.karachi"><![CDATA[(UTC+05:00) Islamabad, Karatschi]]></item>
+ <item name="wcf.global.date.timezone.asia.yekaterinburg"><![CDATA[(UTC+05:00) Jekaterinburg]]></item>
+ <item name="wcf.global.date.timezone.asia.tashkent"><![CDATA[(UTC+05:00) Taschkent]]></item>
+ <item name="wcf.global.date.timezone.asia.kolkata"><![CDATA[(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi]]></item>
+ <item name="wcf.global.date.timezone.asia.colombo"><![CDATA[(UTC+05:30) Sri Jayawardenepura]]></item>
+ <item name="wcf.global.date.timezone.asia.katmandu"><![CDATA[(UTC+05:45) Katmandu]]></item>
+ <item name="wcf.global.date.timezone.asia.almaty"><![CDATA[(UTC+06:00) Astana]]></item>
+ <item name="wcf.global.date.timezone.asia.dhaka"><![CDATA[(UTC+06:00) Dakka]]></item>
+ <item name="wcf.global.date.timezone.asia.novosibirsk"><![CDATA[(UTC+06:00) Nowosibirsk]]></item>
+ <item name="wcf.global.date.timezone.asia.rangoon"><![CDATA[(UTC+06:30) Yangon (Rangun)]]></item>
+ <item name="wcf.global.date.timezone.asia.bangkok"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta]]></item>
+ <item name="wcf.global.date.timezone.asia.krasnoyarsk"><![CDATA[(UTC+07:00) Krasnojarsk]]></item>
+ <item name="wcf.global.date.timezone.asia.irkutsk"><![CDATA[(UTC+08:00) Irkutsk]]></item>
+ <item name="wcf.global.date.timezone.asia.kuala_lumpur"><![CDATA[(UTC+08:00) Kuala Lumpur, Singapur]]></item>
+ <item name="wcf.global.date.timezone.asia.chongqing"><![CDATA[(UTC+08:00) Peking, Chongqing, Hongkong, Urumchi]]></item>
+ <item name="wcf.global.date.timezone.australia.perth"><![CDATA[(UTC+08:00) Perth]]></item>
+ <item name="wcf.global.date.timezone.asia.taipei"><![CDATA[(UTC+08:00) Taipeh]]></item>
+ <item name="wcf.global.date.timezone.asia.ulaanbaatar"><![CDATA[(UTC+08:00) Ulan-Bator]]></item>
+ <item name="wcf.global.date.timezone.asia.yakutsk"><![CDATA[(UTC+09:00) Jakutsk]]></item>
+ <item name="wcf.global.date.timezone.asia.tokyo"><![CDATA[(UTC+09:00) Osaka, Sapporo, Tokio]]></item>
+ <item name="wcf.global.date.timezone.asia.seoul"><![CDATA[(UTC+09:00) Seoul]]></item>
+ <item name="wcf.global.date.timezone.australia.adelaide"><![CDATA[(UTC+09:30) Adelaide]]></item>
+ <item name="wcf.global.date.timezone.australia.darwin"><![CDATA[(UTC+09:30) Darwin]]></item>
+ <item name="wcf.global.date.timezone.australia.brisbane"><![CDATA[(UTC+10:00) Brisbane]]></item>
+ <item name="wcf.global.date.timezone.australia.sydney"><![CDATA[(UTC+10:00) Canberra, Melbourne, Sydney]]></item>
+ <item name="wcf.global.date.timezone.pacific.guam"><![CDATA[(UTC+10:00) Guam, Port Moresby]]></item>
+ <item name="wcf.global.date.timezone.australia.hobart"><![CDATA[(UTC+10:00) Hobart]]></item>
+ <item name="wcf.global.date.timezone.asia.vladivostok"><![CDATA[(UTC+10:00) Wladiwostok]]></item>
+ <item name="wcf.global.date.timezone.asia.magadan"><![CDATA[(UTC+11:00) Magadan]]></item>
+ <item name="wcf.global.date.timezone.pacific.noumea"><![CDATA[(UTC+11:00) Salomonen, Neu-Kaledonien]]></item>
+ <item name="wcf.global.date.timezone.pacific.auckland"><![CDATA[(UTC+12:00) Auckland, Wellington]]></item>
+ <item name="wcf.global.date.timezone.pacific.fiji"><![CDATA[(UTC+12:00) Fidschi]]></item>
+ <item name="wcf.global.date.timezone.asia.kamchatka"><![CDATA[(UTC+12:00) Kamtschatka]]></item>
+ <item name="wcf.global.date.timezone.pacific.tongatapu"><![CDATA[(UTC+13:00) Nuku'alofa]]></item>
+ </category>
+ <category name="wcf.imageViewer">
+ <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Bild " + (this.currentIndex + 1) + " von " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>
+ <item name="wcf.imageViewer.close"><![CDATA[Schließen]]></item>
+ <item name="wcf.imageViewer.enlarge"><![CDATA[Nur dieses Bild anzeigen (beendet die Bildbetrachtung)]]></item>
+ <item name="wcf.imageViewer.next"><![CDATA[Nächstes Bild]]></item>
+ <item name="wcf.imageViewer.pause"><![CDATA[Diashow stoppen]]></item>
+ <item name="wcf.imageViewer.play"><![CDATA[Diashow starten (Bildwechsel alle 5 Sekunden)]]></item>
+ <item name="wcf.imageViewer.previous"><![CDATA[Vorheriges Bild]]></item>
+ </category>
+ <category name="wcf.option">
+ <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Kanarische Inseln, Lissabon, London, Monrovia, Ouagadougou, Reykjavík]]></item>
+ <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brüssel, Kopenhagen, Madrid, Paris, Prag, Rom, Sarajevo, Stockholm, Tunis, Warschau, Wien]]></item>
+ <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athen, Beirut, Bukarest, Helsinki, Istanbul, Jerusalem, Kairo, Kapstadt, Khartum, Kiew, Minsk, Sofia]]></item>
+ <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Abeba, Antananarivo, Bagdad, Daressalam, Kampala, Kuwait, Mogadischu, Moskau, Nairobi, Riad]]></item>
+ <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Teheran]]></item>
+ <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Eriwan, Maskat, Réunion, Tiflis]]></item>
+ <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>
+ <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Asgabat, Bischkek, Duschanbe, Islamabad, Jekaterinburg, Karatschi, Malediven, Taschkent]]></item>
+ <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, Neu-Delhi]]></item>
+ <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>
+ <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Nowosibirsk]]></item>
+ <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Kokosinseln, Rangun]]></item>
+ <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnojarsk, Vientiane]]></item>
+ <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hongkong, Irkutsk, Kuala Lumpur, Manila, Peking, Perth, Singapur, Taipeh, Ulan Bator]]></item>
+ <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Australien)]]></item>
+ <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Jakutsk, Osaka, Pjöngjang, Sapporo, Seoul, Tokyo]]></item>
+ <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>
+ <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Wladiwostok]]></item>
+ <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord-Howe-Insel (Australien)]]></item>
+ <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, Neukaledonien, Salomonen]]></item>
+ <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolkinsel]]></item>
+ <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, Bairiki, Fidschi, Kamtschatka, Marshall-Inseln, Wellington]]></item>
+ <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham-Inseln (Neuseeland)]]></item>
+ <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenixinseln]]></item>
+ <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Linieninseln, Weihnachtsinsel]]></item>
+ <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azoren, Kapverdische Inseln]]></item>
+ <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mittelatlantik]]></item>
+ <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Brasília, Buenos Aires, Cayenne, Georgetown, Grönland, Montevideo]]></item>
+ <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Neufundland]]></item>
+ <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Asunción, Atlantik (Kanada), La Paz, Port-of-Spain, Santiago]]></item>
+ <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>
+ <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Atlanta, Bogotá, Detroit, Lima, Miami, New York, San Francisco de Quito, Toronto]]></item>
+ <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Chicago, Dallas, Kansas City, Mexiko-Stadt, Winnipeg, Zentralamerika]]></item>
+ <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Arizona, Calgary, Chihuahua, Denver, Mazatlan, Salt Lake City]]></item>
+ <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Los Angeles, Seattle, Tijuana, Vancouver]]></item>
+ <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>
+ <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) Französisch-Polynesien]]></item>
+ <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cookinseln, Hawaii]]></item>
+ <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midwayinseln, Samoa]]></item>
+ <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Eniwetok, Kwajalein]]></item>
+ </category>
+ <category name="wcf.page">
+ <item name="wcf.page.pageNo"><![CDATA[Seite {#$pageNo}]]></item>
+ </category>
+ <category name="wcf.user">
+ <item name="wcf.user.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>
+ <item name="wcf.user.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>
+ <item name="wcf.user.email"><![CDATA[E-Mail-Adresse]]></item>
+ <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch.]]></item>
+ <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch.]]></item>
+ <item name="wcf.user.error.email.notUnique"><![CDATA[Diese E-Mail-Adresse ist bereits durch einen anderen Benutzer vergeben.]]></item>
+ <item name="wcf.user.error.email.notValid"><![CDATA[Sie haben eine ungültige E-Mail-Adresse eingegeben.]]></item>
+ <item name="wcf.user.error.password.false"><![CDATA[Dieses Kennwort ist falsch.]]></item>
+ <item name="wcf.user.error.username.notFound"><![CDATA[Der Benutzername »{$username}« konnte nicht gefunden werden.]]></item>
+ <item name="wcf.user.error.username.notUnique"><![CDATA[Dieser Benutzername ist bereits vergeben.]]></item>
+ <item name="wcf.user.error.username.notValid"><![CDATA[Sie haben einen ungültigen Benutzernamen eingegeben.]]></item>
+ <item name="wcf.user.language"><![CDATA[Sprache]]></item>
+ <item name="wcf.user.language.description"><![CDATA[Bitte wählen Sie aus, in welcher Sprache die Benutzeroberfläche erscheinen soll!]]></item>
+ <item name="wcf.user.logout"><![CDATA[Abmelden]]></item>
+ <item name="wcf.user.password"><![CDATA[Kennwort]]></item>
+ <item name="wcf.user.registrationDate"><![CDATA[Registrierungsdatum]]></item>
+ <item name="wcf.user.userID"><![CDATA[Benutzer-ID]]></item>
+ <item name="wcf.user.username"><![CDATA[Benutzername]]></item>
+ <item name="wcf.user.visibleLanguages"><![CDATA[Zeige Inhalte in folgenden Sprachen an]]></item>
+ <item name="wcf.user.visibleLanguages.description"><![CDATA[Geben Sie an, in welchen Sprachen erstellte Inhalte angezeigt werden sollen.]]></item>
+ </category>
+ <category name="wcf.user.option">
+ <item name="wcf.user.option.error.validationFailed"><![CDATA[Sie haben einen ungültigen Inhalt eingegeben.]]></item>
+ </category>
+</language>
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="en">\r
- <category name="wcf.acp">\r
- <item name="wcf.acp"><![CDATA[Administration Control Panel]]></item>\r
- <item name="wcf.acp.help"><![CDATA[Help]]></item>\r
- <item name="wcf.acp.help.complete"><![CDATA[Complete Help]]></item>\r
- <item name="wcf.acp.help.disable"><![CDATA[Disable online Help]]></item>\r
- <item name="wcf.acp.help.interactive"><![CDATA[Interactive Help]]></item>\r
- <item name="wcf.acp.packageQuickAccess"><![CDATA[Change Package]]></item>\r
- <item name="wcf.acp.search.extended"><![CDATA[Extended search ...]]></item>\r
- <item name="wcf.acp.sitemap"><![CDATA[Site-Map]]></item>\r
- </category>\r
- <category name="wcf.acp.cache">\r
- <item name="wcf.acp.cache.button.clear"><![CDATA[Empty cache]]></item>\r
- <item name="wcf.acp.cache.clear.success"><![CDATA[The cache has been successfully emptied.]]></item>\r
- <item name="wcf.acp.cache.clear.sure"><![CDATA[Are you sure that you want to completely empty the cache?]]></item>\r
- <item name="wcf.acp.cache.data"><![CDATA[Settings]]></item>\r
- <item name="wcf.acp.cache.data.files"><![CDATA[Files]]></item>\r
- <item name="wcf.acp.cache.data.size"><![CDATA[Size]]></item>\r
- <item name="wcf.acp.cache.data.source"><![CDATA[Source]]></item>\r
- <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>\r
- <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>\r
- <item name="wcf.acp.cache.list.mtime"><![CDATA[Last updated]]></item>\r
- <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>\r
- <item name="wcf.acp.cache.list.perm"><![CDATA[Permissions]]></item>\r
- <item name="wcf.acp.cache.list.size"><![CDATA[Size]]></item>\r
- </category>\r
- <category name="wcf.acp.cronjob">\r
- <item name="wcf.acp.cronjob.active"><![CDATA[Enabled]]></item>\r
- <item name="wcf.acp.cronjob.add"><![CDATA[Add a new cron job]]></item>\r
- <item name="wcf.acp.cronjob.add.data"><![CDATA[General Information]]></item>\r
- <item name="wcf.acp.cronjob.add.success"><![CDATA[The cron job has been added successfully.]]></item>\r
- <item name="wcf.acp.cronjob.add.timing"><![CDATA[Schedule]]></item>\r
- <item name="wcf.acp.cronjob.className"><![CDATA[Class path]]></item>\r
- <item name="wcf.acp.cronjob.className.description"><![CDATA[Please enter here the path to the PHP file in which the associated cron job class is contained. This path must be relative to the installation folder of the WCF.]]></item>\r
- <item name="wcf.acp.cronjob.cronjobID"><![CDATA[Job ID]]></item>\r
- <item name="wcf.acp.cronjob.delete"><![CDATA[Delete]]></item>\r
- <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[This cron job cannot be deleted.]]></item>\r
- <item name="wcf.acp.cronjob.delete.success"><![CDATA[The cron job has been deleted successfully.]]></item>\r
- <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Are you sure that you want to remove this cron job?]]></item>\r
- <item name="wcf.acp.cronjob.description"><![CDATA[Description]]></item>\r
- <item name="wcf.acp.cronjob.description.description"><![CDATA[Here you may enter a short description for the cron job (preferably in English).]]></item>\r
- <item name="wcf.acp.cronjob.disable"><![CDATA[Disable]]></item>\r
- <item name="wcf.acp.cronjob.edit"><![CDATA[Edit]]></item>\r
- <item name="wcf.acp.cronjob.edit.data"><![CDATA[General Information]]></item>\r
- <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[This cron job cannot be edited.]]></item>\r
- <item name="wcf.acp.cronjob.edit.success"><![CDATA[The cron job has been modified successfully.]]></item>\r
- <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Schedule]]></item>\r
- <item name="wcf.acp.cronjob.enable"><![CDATA[Enable]]></item>\r
- <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[The path you have entered is invalid.]]></item>\r
- <item name="wcf.acp.cronjob.error.empty"><![CDATA[Please enter a valid entry here.]]></item>\r
- <item name="wcf.acp.cronjob.error.notValid"><![CDATA[The timings you have set are invalid.]]></item>\r
- <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Schedule multiple executions?]]></item>\r
- <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[When enabled, the respective task (cronjob) will be repeatedly executed at all possible dates between the previous specified execution date and the next.]]></item>\r
- <item name="wcf.acp.cronjob.execute"><![CDATA[Execute now]]></item>\r
- <item name="wcf.acp.cronjob.execute.success"><![CDATA[The job has been executed successfully.]]></item>\r
- <item name="wcf.acp.cronjob.inactive"><![CDATA[Disabled]]></item>\r
- <item name="wcf.acp.cronjob.info"><![CDATA[General Information]]></item>\r
- <item name="wcf.acp.cronjob.intro"><![CDATA[Configuring cronjobs (automatized scheduled tasks) requires distinct knowledge of the crontab syntax on Unix based systems. More information about this topic can be obtained on the following Webpage: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>.]]></item>\r
- <item name="wcf.acp.cronjob.lastExec"><![CDATA[Last scheduled execution]]></item>\r
- <item name="wcf.acp.cronjob.list"><![CDATA[Cron jobs]]></item>\r
- <item name="wcf.acp.cronjob.list.count"><![CDATA[There is a total of {#$items} cronjob{if $items != 1}s{/if}]]></item>\r
- <item name="wcf.acp.cronjob.log"><![CDATA[Log of executed cronjobs]]></item>\r
- <item name="wcf.acp.cronjob.log.clear"><![CDATA[Delete all]]></item>\r
- <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Are you sure that you want to remove all log entries?]]></item>\r
- <item name="wcf.acp.cronjob.log.data"><![CDATA[There is a total of {#$items} {if $items == 1}entry{else}entries{/if}]]></item>\r
- <item name="wcf.acp.cronjob.log.error"><![CDATA[Error:]]></item>\r
- <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Successfully executed]]></item>\r
- <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[There are currently no log entries available.]]></item>\r
- <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>\r
- <item name="wcf.acp.cronjob.nextExec"><![CDATA[Next scheduled execution]]></item>\r
- <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[There are currently no cronjobs available.]]></item>\r
- <item name="wcf.acp.cronjob.packageName"><![CDATA[Installed by]]></item>\r
- <item name="wcf.acp.cronjob.runNow"><![CDATA[Run now]]></item>\r
- <item name="wcf.acp.cronjob.startDom"><![CDATA[Day of month]]></item>\r
- <item name="wcf.acp.cronjob.startDom.description"><![CDATA[Day of the month (1 - 31) in which the cron job should be executed.]]></item>\r
- <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>\r
- <item name="wcf.acp.cronjob.startDow"><![CDATA[Weekday]]></item>\r
- <item name="wcf.acp.cronjob.startDow.description"><![CDATA[Weekday (0 - 6 with Sunday = 0 or mon - sun) in which the cron job should be executed.]]></item>\r
- <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>\r
- <item name="wcf.acp.cronjob.startHour"><![CDATA[Hour]]></item>\r
- <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Hours (0 - 23) in which the cron job should be executed.]]></item>\r
- <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>\r
- <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>\r
- <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Minutes (0 - 59) in which the cron job should be executed.]]></item>\r
- <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>\r
- <item name="wcf.acp.cronjob.startMonth"><![CDATA[Month]]></item>\r
- <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[Month (1 - 12 or jan - dec) in which the cron job should be executed.]]></item>\r
- <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>\r
- <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>\r
- <item name="wcf.acp.cronjob.subtitle"><![CDATA[]]></item>\r
- </category>\r
- <category name="wcf.acp.group">\r
- <item name="wcf.acp.group.add"><![CDATA[Add new user group]]></item>\r
- <item name="wcf.acp.group.add.permissions"><![CDATA[Permissions]]></item>\r
- <item name="wcf.acp.group.add.success"><![CDATA[The user group has been successfully added.]]></item>\r
- <item name="wcf.acp.group.administrators"><![CDATA[Administrators]]></item>\r
- <item name="wcf.acp.group.data"><![CDATA[General group information]]></item>\r
- <item name="wcf.acp.group.delete"><![CDATA[Delete this user group]]></item>\r
- <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}This user group has{else}{#$deletedGroups} These user groups have{/if} been successfully deleted.]]></item>\r
- <item name="wcf.acp.group.delete.sure"><![CDATA[Are you sure you would like to remove this user group?]]></item>\r
- <item name="wcf.acp.group.edit"><![CDATA[Edit this user group]]></item>\r
- <item name="wcf.acp.group.edit.success"><![CDATA[Your user group changes have been successfully saved.]]></item>\r
- <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[You are currently a member of this user group. Changing the permissions of this user group could result in locking yourself out of the Administration Control Panel. Please be careful!]]></item>\r
- <item name="wcf.acp.group.everyone"><![CDATA[Everyone]]></item>\r
- <item name="wcf.acp.group.groupID"><![CDATA[Group ID]]></item>\r
- <item name="wcf.acp.group.groupName"><![CDATA[Name of this user group]]></item>\r
- <item name="wcf.acp.group.groupName.description"><![CDATA[Enter here a name for this group.]]></item>\r
- <item name="wcf.acp.group.guests"><![CDATA[Guests]]></item>\r
- <item name="wcf.acp.group.list"><![CDATA[User groups]]></item>\r
- <item name="wcf.acp.group.list.data"><![CDATA[A total of {#$items} user groups]]></item>\r
- <item name="wcf.acp.group.members"><![CDATA[Number of members]]></item>\r
- <item name="wcf.acp.group.moderators"><![CDATA[Moderators]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Can enter Administration Control Panel?]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Activating this option will allow members of this user group to enter the Administration Control Panel and, dependent upon their permissions, run certain actions.]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Can view private user options]]></item>\r
- <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Members of this user group can view private user options.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Can change the system options?]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Activating this option will allow members of this user group to view and change the system options - e.g. Forum on/offline.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Can view logs]]></item>\r
- <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Members of this user group can view the system logs.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Can add new cronjobs]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Members of this user group can add new cronjobs.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Can delete existing cronjobs]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Members of this user group can delete existing cronjobs.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Can delete log files of running cronjobs]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Members of this user group can delete log files of running cronjobs. The log files are also checked by the associated cronjob if the log file was successfully written.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Can edit existing cronjobs]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Members of this user group can edit existing cronjobs.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Can disable existing cronjobs]]></item>\r
- <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Members of this user group can disable existing cronjobs. Disabling a cronjob only stops the actual cronjob from running, but does not remove it.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Can edit existing update servers]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Members of this user group can edit existing update servers and add new update servers.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Can install new packages]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Members of this user group can install additional packages.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Can remove existing packages]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Members of this user group can remove existing packages.]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Can update existing packages]]></item>\r
- <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Members of this user group can update existing packages.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Accessible user groups]]></item>\r
- <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Members of this user group have access to the following groups. For example, here you can set if the user group has permission to edit themselves.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Can add new user groups]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Members of this user group can add new user groups.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Can add new users]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Members of this user group can add new users. If the option for "Accessible User groups" has been enabled, then on creation of the user, the appropriate accessible user groups can also be assigned.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Can delete existing user groups]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Members of this user group can remove existing user groups.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Can delete existing users]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Members of this user group can delete existing users.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Can edit existing user groups]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Members of this user group can edit existing user groups.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Can edit user e-mail addresses]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Members of this user group can edit user e-mail addresses.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Can edit user passwords]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Members of this user group can edit user passwords.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Can edit existing users]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Members of this user group can edit existing users.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Can send e-mails to users]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Members of this user group can view other members' e-mail addresses and consequently send them e-mails.]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Can search users]]></item>\r
- <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Members of this user group can search existing users and their profiles.]]></item>\r
- <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrator permissions]]></item>\r
- <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Content]]></item>\r
- <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Design]]></item>\r
- <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.general"><![CDATA[General administrative permissions]]></item>\r
- <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Maintenance]]></item>\r
- <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System functions]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Cronjobs]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Package management]]></item>\r
- <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user"><![CDATA[User functions]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Group management]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[User management]]></item>\r
- <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderator permissions]]></item>\r
- <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.category.user"><![CDATA[General permissions]]></item>\r
- <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>\r
- <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Can view disabled styles]]></item>\r
- <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Members of this user group can choose to view disabled styles.]]></item>\r
- <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Style management]]></item>\r
- <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.group.showMembers"><![CDATA[Show the members of this user group]]></item>\r
- <item name="wcf.acp.group.superModerators"><![CDATA[Super moderators]]></item>\r
- <item name="wcf.acp.group.users"><![CDATA[Registered users]]></item>\r
- </category>\r
- <category name="wcf.acp.login">\r
- <item name="wcf.acp.login"><![CDATA[Login]]></item>\r
- <item name="wcf.acp.login.data"><![CDATA[Login details]]></item>\r
- </category>\r
- <category name="wcf.acp.masterPassword">\r
- <item name="wcf.acp.masterPassword"><![CDATA[Master password]]></item>\r
- <item name="wcf.acp.masterPassword.confirm"><![CDATA[Confirm master password]]></item>\r
- <item name="wcf.acp.masterPassword.enter"><![CDATA[Master password required]]></item>\r
- <item name="wcf.acp.masterPassword.enter.description"><![CDATA[This page or action requires you to enter the master password due to security reasons. You only need to do so once within a session. If you have forgotten the master password you can reset it by deleting the file <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em>.]]></item>\r
- <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[The master password is not correct.If you have forgotten the master password you can reset it by deleting the file <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em>.]]></item>\r
- <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[The entered passwords are not identical.]]></item>\r
- <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[The password is not secure. It has to contain at least eight characters, small and capital latin letters as well as numbers and special characters. It must not be identically with passwords of administrators of this page.]]></item>\r
- <item name="wcf.acp.masterPassword.example"><![CDATA[Suggestion]]></item>\r
- <item name="wcf.acp.masterPassword.example.set"><![CDATA[Use suggestion]]></item>\r
- <item name="wcf.acp.masterPassword.init"><![CDATA[Set master password]]></item>\r
- <item name="wcf.acp.masterPassword.init.description"><![CDATA[The master password is an additional protection for functions that are relevant to security. You should use a very secure password that must not be identically with your normal administrator password, unknown to others and not used on other websites.]]></item>\r
- </category>\r
- <category name="wcf.acp.menu">\r
- <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatic update]]></item>\r
- <item name="wcf.acp.menu.link.content"><![CDATA[Content]]></item>\r
- <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Add new cronjob]]></item>\r
- <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[View cronjob logs]]></item>\r
- <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[List cronjobs]]></item>\r
- <item name="wcf.acp.menu.link.display"><![CDATA[Design]]></item>\r
- <item name="wcf.acp.menu.link.group"><![CDATA[User groups]]></item>\r
- <item name="wcf.acp.menu.link.group.add"><![CDATA[Add new group]]></item>\r
- <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-mail all group members]]></item>\r
- <item name="wcf.acp.menu.link.group.view"><![CDATA[Group overview]]></item>\r
- <item name="wcf.acp.menu.link.log"><![CDATA[Log]]></item>\r
- <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>\r
- <item name="wcf.acp.menu.link.log.session"><![CDATA[Session]]></item>\r
- <item name="wcf.acp.menu.link.maintenance"><![CDATA[Maintenance]]></item>\r
- <item name="wcf.acp.menu.link.option"><![CDATA[Options]]></item>\r
- <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Import & export]]></item>\r
- <item name="wcf.acp.menu.link.package"><![CDATA[Packages]]></item>\r
- <item name="wcf.acp.menu.link.package.database"><![CDATA[Search packages]]></item>\r
- <item name="wcf.acp.menu.link.package.install"><![CDATA[Install new package]]></item>\r
- <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Add new server]]></item>\r
- <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server overview]]></item>\r
- <item name="wcf.acp.menu.link.package.view"><![CDATA[List installed packages]]></item>\r
- <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>\r
- <item name="wcf.acp.menu.link.user"><![CDATA[User]]></item>\r
- <item name="wcf.acp.menu.link.user.add"><![CDATA[Add user]]></item>\r
- <item name="wcf.acp.menu.link.user.list"><![CDATA[List users]]></item>\r
- <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-mail all users]]></item>\r
- <item name="wcf.acp.menu.link.user.management"><![CDATA[Users]]></item>\r
- <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Bulk processing of users]]></item>\r
- <item name="wcf.acp.menu.link.user.search"><![CDATA[Search for users]]></item>\r
- </category>\r
- <category name="wcf.acp.option">\r
- <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Exclude hostnames]]></item>\r
- <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Enter one hostname each row you want to exclude from this site.]]></item>\r
- <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[Exclude IP addresses]]></item>\r
- <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Enter one IP address each row you want to exclude from this site.]]></item>\r
- <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Exclude user agents]]></item>\r
- <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Enter one user agent each row you want to exclude from this site.]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache server]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Enter the address of the memcache server. You can enter one server each row.]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Use persistent connections]]></item>\r
- <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[By enabling this option a persistent connection to the memcache server will be used.]]></item>\r
- <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache type]]></item>\r
- <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>\r
- <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Please select the type of cache you want to use. Some of the types have special requirements to the server system and cannot be used in your environment.]]></item>\r
- <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[File system (default)]]></item>\r
- <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (experimental)]]></item>\r
- <item name="wcf.acp.option.category.general"><![CDATA[General]]></item>\r
- <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>\r
- <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.cache.general"><![CDATA[General]]></item>\r
- <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>\r
- <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache stores data in the memory that is often accessed. This may reduce the database load dramatically. Read more about the memcache on the following site:\r
-<ul>\r
- <li><a href="http://memcached.org/">memcached.org</a></li>\r
-</ul>]]></item>\r
- <item name="wcf.acp.option.category.general.date"><![CDATA[Date and time]]></item>\r
- <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>\r
- <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>\r
- <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>\r
- <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy server]]></item>\r
- <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[You can configure optional proxy servers for connections to external servers.]]></item>\r
- <item name="wcf.acp.option.category.general.mail"><![CDATA[E-mails]]></item>\r
- <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.mail.general"><![CDATA[General]]></item>\r
- <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Transmission]]></item>\r
- <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.general.offline"><![CDATA[Disable forum temporarily]]></item>\r
- <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module"><![CDATA[Modules on / off]]></item>\r
- <item name="wcf.acp.option.category.module.content"><![CDATA[Content]]></item>\r
- <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.display"><![CDATA[Display]]></item>\r
- <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>\r
- <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.module.user"><![CDATA[User]]></item>\r
- <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security"><![CDATA[Security]]></item>\r
- <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>\r
- <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internet pages are often attacked by programs and robots. E.g. it is possible to create hundreds of user accounts automatically. You can protect yourself against these spam bots with so called <a href="http://en.wikipedia.org/wiki/Captcha" class="externalURL">Captcha images</a> on every place where web forms can be submitted. Unregistered users then first have to identify the code on the Captcha before they can submit the form. Robots cannot read the code. Please not that Captcha images cannot be read by blind and visually impaired people.]]></item>\r
- <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>\r
- <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.censorship"><![CDATA[Censorship]]></item>\r
- <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.general"><![CDATA[General]]></item>\r
- <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sessions]]></item>\r
- <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.category.user"><![CDATA[Users]]></item>\r
- <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookie domain]]></item>\r
- <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Enter here the domain in which the cookie should be used. This is optional, so in most cases you don't need to specify the cookie domain.]]></item>\r
- <item name="wcf.acp.option.cookie_path"><![CDATA[Cookie path]]></item>\r
- <item name="wcf.acp.option.cookie_path.description"><![CDATA[The cookie path is concurrent to the document root of your site - e.g. "/forum" for http://www.woltlab.com/forum.]]></item>\r
- <item name="wcf.acp.option.cookie_prefix"><![CDATA[Cookie prefix]]></item>\r
- <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Enter a prefix to be used for the cookie name here.]]></item>\r
- <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Enable automatic Daylight Savings Time]]></item>\r
- <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Should the clock automatically change according to the summer/winter time?]]></item>\r
- <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Use cache method for session data]]></item>\r
- <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Should the selected cache method be used to save the session data?]]></item>\r
- <item name="wcf.acp.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>\r
- <item name="wcf.acp.option.export"><![CDATA[Export options]]></item>\r
- <item name="wcf.acp.option.export.download"><![CDATA[Download the exported options]]></item>\r
- <item name="wcf.acp.option.export.download.description"><![CDATA[Download the exported options as a backup file to your local machine.]]></item>\r
- <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Enable Gzip compression]]></item>\r
- <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Enable this option to send content from the server to clients in a compressed form. This option reduces traffic.]]></item>\r
- <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Disable caching of pages in browsers]]></item>\r
- <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Enabling this option will prevent browsers from caching the pages.]]></item>\r
- <item name="wcf.acp.option.http_gzip_level"><![CDATA[Compression level]]></item>\r
- <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[A value of 1 to 9 is required. For optimum output for compression and server performance, we recommend a value of 1.]]></item>\r
- <item name="wcf.acp.option.import"><![CDATA[Import options]]></item>\r
- <item name="wcf.acp.option.import.error.importFailed"><![CDATA[The import of the chosen file has failed.]]></item>\r
- <item name="wcf.acp.option.import.success"><![CDATA[The options have been imported successfully.]]></item>\r
- <item name="wcf.acp.option.import.upload"><![CDATA[Upload the options]]></item>\r
- <item name="wcf.acp.option.import.upload.description"><![CDATA[Upload the options to be imported from your local machine.]]></item>\r
- <item name="wcf.acp.option.importAndExport"><![CDATA[Import & Export options]]></item>\r
- <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator's e-mail address]]></item>\r
- <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Enter the administrator's e-mail address here.]]></item>\r
- <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Path to the debug log file]]></item>\r
- <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Enter the path to the log file here]]></item>\r
- <item name="wcf.acp.option.mail_from_address"><![CDATA[Sender's e-mail address]]></item>\r
- <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Enter the sender's e-mail address that should be used for automated e-mails here.]]></item>\r
- <item name="wcf.acp.option.mail_from_name"><![CDATA[Sender's name]]></item>\r
- <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Enter the sender's name that should be used for automated e-mails here.]]></item>\r
- <item name="wcf.acp.option.mail_send_method"><![CDATA[E-mail method]]></item>\r
- <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>\r
- <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Choose an e-mail transmission method.]]></item>\r
- <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>\r
- <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>\r
- <item name="wcf.acp.option.mail_signature"><![CDATA[Sender's signature]]></item>\r
- <item name="wcf.acp.option.mail_signature.description"><![CDATA[Enter a signature that should be sent with system e-mails here.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP host]]></item>\r
- <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Enter the SMTP server name here.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP password]]></item>\r
- <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Enter the SMTP password here.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP port]]></item>\r
- <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Enter the SMTP server port here.]]></item>\r
- <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP username]]></item>\r
- <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Enter the SMTP user name here.]]></item>\r
- <item name="wcf.acp.option.mail_use_f_param"><![CDATA[Enable the "-f" parameter]]></item>\r
- <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Some servers may require the "-f" parameter to be used when sending e-mails. If your users experience problems with receiving e-mails, try enabling this option.]]></item>\r
- <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Use formatted e-mail addresses]]></item>\r
- <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Sender's and receiver's addresses are formatted in "Name <email@domain.tld>". This option is not supported by all mail servers and should be turned off in case of any problems.]]></item>\r
- <item name="wcf.acp.option.module_master_password"><![CDATA[Enable master password]]></item>\r
- <item name="wcf.acp.option.module_master_password.description"><![CDATA[Pages and forms within the admin panel that are relevant to security can be protected with an additional master password.]]></item>\r
- <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>\r
- <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server for HTTP connections]]></item>\r
- <item name="wcf.acp.option.session_timeout"><![CDATA[Session timeout]]></item>\r
- <item name="wcf.acp.option.session_timeout.description"><![CDATA[Enter how long a session should remain valid for here [seconds].]]></item>\r
- <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[Check IP address of session]]></item>\r
- <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[The number or block of an IP address that should be checked while reading the session data. A high number can exclude users that use changing IP addresses.]]></item>\r
- <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Check user agent of session]]></item>\r
- <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Should the user agent be checked while reading the session data?]]></item>\r
- <item name="wcf.acp.option.success"><![CDATA[Your option changes have been successfully saved.]]></item>\r
- <item name="wcf.acp.option.timezone"><![CDATA[Time zone offset]]></item>\r
- <item name="wcf.acp.option.timezone.description"><![CDATA[Choose your default time zone for your site.]]></item>\r
- <item name="wcf.acp.option.user_online_timeout"><![CDATA[Users online timeout]]></item>\r
- <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Enter here how long users should remain marked as online after they are inactive [seconds].]]></item>\r
- <item name="wcf.acp.option.category.general.page"><![CDATA[Page]]></item>\r
- <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.option.meta_description"><![CDATA[Meta description]]></item>\r
- <item name="wcf.acp.option.meta_description.description"><![CDATA[Enter a meta description here.]]></item>\r
- <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta keywords]]></item>\r
- <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Enter some meta keywords here.]]></item>\r
- <item name="wcf.acp.option.page_description"><![CDATA[Page description]]></item>\r
- <item name="wcf.acp.option.page_description.description"><![CDATA[Enter a short description of the page.]]></item>\r
- <item name="wcf.acp.option.page_title"><![CDATA[Page title]]></item>\r
- <item name="wcf.acp.option.page_title.description"><![CDATA[Enter the global title of the page here. That title will show up inside the board header, if you have enabled it with the style editor.]]></item>\r
- <item name="wcf.acp.option.page_url"><![CDATA[Page URL]]></item>\r
- <item name="wcf.acp.option.page_url.description"><![CDATA[Please enter the URL of the page (without trailing slash).]]></item>\r
- <item name="wcf.acp.option.page_urls"><![CDATA[Further URLs]]></item>\r
- <item name="wcf.acp.option.page_urls.description"><![CDATA[Enter further URLs which are also directed at your site.]]></item>\r
- </category>\r
- <category name="wcf.acp.package">\r
- <item name="wcf.acp.package.cancel"><![CDATA[Cancel package installation]]></item>\r
- <item name="wcf.acp.package.description"><![CDATA[Description]]></item>\r
- <item name="wcf.acp.package.install"><![CDATA[Package Installation]]></item>\r
- <item name="wcf.acp.package.install.cancel"><![CDATA[Cancel the installation]]></item>\r
- <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Are you sure you would like to cancel this installation?]]></item>\r
- <item name="wcf.acp.package.install.error"><![CDATA[Package dependencies could not be satisfied for this Package.]]></item>\r
- <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[The {if $action == 'install'}package installation{else}package update{/if} of package "{$packageName}" in version {$packageVersion} cannot be executed due to incompatibilities with the following {if $excludedPackages|count == 1}package{else}packages{/if}:]]></item>\r
- <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in version {$excludedPackage.packageVersion}]]></item>\r
- <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Following package doesn't{else}Following packages don't{/if} allow the {if $action == 'install'}package installation{else}package update{/if} of package "{$packageName}" in version {$packageVersion} due to incompatibilities:]]></item>\r
- <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in version {$excludingPackage.packageVersion}]]></item>\r
- <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Following package is{else}Following packages are{/if} incompatible with package "{$packageName}" in version {$packageVersion}. If you proceed installation the {if $excludingPackages|count == 1}package{else}packages{/if} probably won't work anymore.]]></item>\r
-\r
- <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}Installed{else}{if $package.file|isset}is located within this Package{else}Not available{/if}{/if})</span>]]></item>\r
- <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Are you sure you would like to cancel the installation of this package?]]></item>\r
- <item name="wcf.acp.package.install.updatableInstances"><![CDATA[The following packages can be updated with this package]]></item>\r
- <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Select one of the following packages, in order to update its version. If you would like to install the package again, please click on "{lang}wcf.global.button.next{/lang}".]]></item>\r
- <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[A copy of this package is already installed. If you continue, a further copy of this package will be installed. If you would like to update an available copy of this package, please select the copy from the following list.]]></item>\r
- <item name="wcf.acp.package.install.version"><![CDATA[Package Version:]]></item>\r
- <item name="wcf.acp.package.installDate"><![CDATA[Installation date]]></item>\r
- <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[While unpacking the files of this package the following error occured:]]></item>\r
- <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[The following files could not be unpacked successfully. Please check if the destination folder is writable.]]></item>\r
- <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Conflicting Tables]]></item>\r
- <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Do not overwrite these tables and do not ask me again for this installation.]]></item>\r
- <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Overwrite the existing tables and do not ask me again for this installation.]]></item>\r
- <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Required changes]]></item>\r
- <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Tables affected]]></item>\r
- <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Existing database tables conflict with the tables required to be installed by this package. Please choose whether to overwrite these tables.]]></item>\r
- <item name="wcf.acp.package.list"><![CDATA[Installed packages]]></item>\r
- <item name="wcf.acp.package.list.author"><![CDATA[Author]]></item>\r
- <item name="wcf.acp.package.list.count"><![CDATA[A total of {#$items} packages installed]]></item>\r
- <item name="wcf.acp.package.list.date"><![CDATA[Date]]></item>\r
- <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>\r
- <item name="wcf.acp.package.list.other"><![CDATA[Package]]></item>\r
- <item name="wcf.acp.package.list.plugin"><![CDATA[Plugin]]></item>\r
- <item name="wcf.acp.package.list.standalone"><![CDATA[Standalone application]]></item>\r
- <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>\r
- <item name="wcf.acp.package.optionals"><![CDATA[Install optional packages]]></item>\r
- <item name="wcf.acp.package.optionals.description"><![CDATA[The selected package brings the following options. Please select those you would like to install.]]></item>\r
- <item name="wcf.acp.package.optionals.installed"><![CDATA[ (This Package is already installed.)]]></item>\r
- <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (The requirements of this Package have not been fulfilled.)]]></item>\r
- <item name="wcf.acp.package.packageDir"><![CDATA[Installation folder]]></item>\r
- <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>\r
- <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Another application is already installed in this folder.]]></item>\r
- <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[This folder is not valid.]]></item>\r
- <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[This folder is not writable.]]></item>\r
- <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[This folder is already in use by the WoltLab Community Framework. Please choose a different location.]]></item>\r
- <item name="wcf.acp.package.packageDir.input"><![CDATA[Please enter the installation folder name here.]]></item>\r
- <item name="wcf.acp.package.packageDir.url"><![CDATA[This application is accessible through the following URL after installation in this folder:]]></item>\r
- <item name="wcf.acp.package.requirements"><![CDATA[Select dependencies]]></item>\r
- <item name="wcf.acp.package.requirements.description"><![CDATA[The current package requires another package that is already installed several times. Please choose the instance that is required.]]></item>\r
- <item name="wcf.acp.package.rollback"><![CDATA[Rollback package installation]]></item>\r
- <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright © {$packageAuthor}]]></item>\r
- <item name="wcf.acp.package.startInstall"><![CDATA[Install new package]]></item>\r
- <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[The chosen package has no valid installation routine.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[The archive you have given is not a valid package.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[The package "{$package->getName()}" could not be updated with the supplied archive.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[No files were found within the specified directory.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[The chosen package is already installed. Packages can not be installed more than one time.]]></item>\r
- <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[The upload of the chosen archive has failed.]]></item>\r
- <item name="wcf.acp.package.startInstall.source"><![CDATA[Select package source]]></item>\r
- <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Enter the path of the package located on your server]]></item>\r
- <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Enter a direct path to the package-file here. An internet address can be used or alternatively the path to the package file using the server's file system.]]></item>\r
- <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Upload package from your local computer]]></item>\r
- <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Enter the package file to be uploaded from your computer here.]]></item>\r
- <item name="wcf.acp.package.startUpdate"><![CDATA[Update Package "{$package->getName()}"]]></item>\r
- <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Installing menu entries for the Administration Control Panel ...]]></item>\r
- <item name="wcf.acp.package.step.install.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Installing template patches for the Administration Control Panel ...]]></item>\r
- <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Installing templates for the Administration Control Panel ...]]></item>\r
- <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Installing cronjobs ...]]></item>\r
- <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Installing event listener ...]]></item>\r
- <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Unpacking package files ...]]></item>\r
- <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Installing user group options ...]]></item>\r
- <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Installing package languages ...]]></item>\r
- <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Installing package options ...]]></item>\r
- <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Executing special scripts ...]]></item>\r
- <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Installing database entries...]]></item>\r
- <item name="wcf.acp.package.step.install.TemplatePatchPackageInstallationPlugin"><![CDATA[Installing template patches ...]]></item>\r
- <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Installing package templates ...]]></item>\r
- <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Installing user profile fields ...]]></item>\r
- <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Checking for possible conflicts ...]]></item>\r
- <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>\r
- <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation is complete]]></item>\r
- <item name="wcf.acp.package.step.install.optionals"><![CDATA[Installing optional packages ...]]></item>\r
- <item name="wcf.acp.package.step.install.package"><![CDATA[Registering package ...]]></item>\r
- <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Installing package plugins ...]]></item>\r
- <item name="wcf.acp.package.step.install.parent"><![CDATA[Parent package allocation is being done ...]]></item>\r
- <item name="wcf.acp.package.step.install.requirements"><![CDATA[Checking dependencies ...]]></item>\r
- <item name="wcf.acp.package.step.title"><![CDATA[Package <b>{$packageName|encodeJS}</b>: ]]></item>\r
- <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Removing menu items from the Administration Control Panel ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Removing template patches of the Administration Control Panel ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Removing templates from the Administration Control Panel ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Uninstalling cronjobs ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Removing event listener ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Removing package files ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Removing user group options ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Removing package languages ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Removing package options ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Removing database entries...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.TemplatePatchPackageInstallationPlugin"><![CDATA[Removing template patches ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Removing package templates ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Removing user profile fields ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Package removal finished]]></item>\r
- <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Removing optional packages ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Removing package plugins ...]]></item>\r
- <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Removing package requirements ...]]></item>\r
- <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Updating menu items in the Administration Control Panel ...]]></item>\r
- <item name="wcf.acp.package.step.update.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Updating template patches in the Administration Control Panel ...]]></item>\r
- <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Updating templates in the Administration Control Panel ...]]></item>\r
- <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Updating cronjobs ...]]></item>\r
- <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Updating event listener ...]]></item>\r
- <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Unpacking package files ...]]></item>\r
- <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Updating user group options ...]]></item>\r
- <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Updating package languages ...]]></item>\r
- <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Updating package options ...]]></item>\r
- <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Executing special scripts ...]]></item>\r
- <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Updating database entries ...]]></item>\r
- <item name="wcf.acp.package.step.update.TemplatePatchPackageInstallationPlugin"><![CDATA[Updating template patches ...]]></item>\r
- <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Updating package templates ...]]></item>\r
- <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Updating user profile fields ...]]></item>\r
- <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>\r
- <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Checking for possible conflicts ...]]></item>\r
- <item name="wcf.acp.package.step.update.finish"><![CDATA[Package update finished]]></item>\r
- <item name="wcf.acp.package.step.update.optionals"><![CDATA[Updating optional packages ...]]></item>\r
- <item name="wcf.acp.package.step.update.package"><![CDATA[Updating package ...]]></item>\r
- <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Updating package plugins ...]]></item>\r
- <item name="wcf.acp.package.step.update.parent"><![CDATA[Parent package allocation is being done ...]]></item>\r
- <item name="wcf.acp.package.step.update.requirements"><![CDATA[Checking dependencies ...]]></item>\r
- <item name="wcf.acp.package.templatePatch.install.failed"><![CDATA[The patch that this package is trying to apply has failed because this patch is not compliant to its target file. Therefore this package cannot be installed. Please click the "{lang}wcf.acp.package.install.cancel{/lang}" button.]]></item>\r
- <item name="wcf.acp.package.templatePatch.repatch.failed"><![CDATA[Re-patching of the following templates has failed:<br />{foreach from=$failures item=$failure}{$failure.templateName} (Originally patched by: {$failure.packageName})<br />{/foreach}The original patch package that was previously applied may no longer function. You should still continue with this update by clicking on the "{lang}wcf.global.button.next{/lang}" button.]]></item>\r
- <item name="wcf.acp.package.templatePatch.uninstall.failed"><![CDATA[The patch that this package is trying to remove has failed because its target file has been externally amended. Therefore this package cannot be removed. Please click the "{lang}wcf.acp.package.uninstall.cancel{/lang}" button.]]></item>\r
- <item name="wcf.acp.package.uninstall"><![CDATA[Package removal]]></item>\r
- <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Cancel package-removal]]></item>\r
- <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[It is not possible to uninstall these packages, because there is at least one dependent package, that cannot be uninstalled.]]></item>\r
- <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Upon final confirmation {if $dependentPackages|count == 1}this package{else}these packages{/if} will be removed without any further promting.]]></item>\r
- <item name="wcf.acp.package.update"><![CDATA[Package update]]></item>\r
- <item name="wcf.acp.package.updateDate"><![CDATA[Date of update]]></item>\r
- <item name="wcf.acp.package.view.author"><![CDATA[Author:]]></item>\r
- <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Go to the Administration Control Panel]]></item>\r
- <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Remove package]]></item>\r
- <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Remove all packages]]></item>\r
- <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Are you sure that you would like to remove this package?]]></item>\r
- <item name="wcf.acp.package.view.button.update"><![CDATA[Update package]]></item>\r
- <item name="wcf.acp.package.view.date"><![CDATA[Date:]]></item>\r
- <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Dependent packages]]></item>\r
- <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[This package has a requirement from {if $dependentPackages|count == 1}one other package.{else}{#$dependentPackages|count} other packages.{/if}]]></item>\r
- <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}This package is required by one other Package{else}{#$dependentPackages|count} Packages are directly or indirectly dependent upon this package{/if}.]]></item>\r
- <item name="wcf.acp.package.view.dir"><![CDATA[Installation folder:]]></item>\r
- <item name="wcf.acp.package.view.identifier"><![CDATA[Identifier:]]></item>\r
- <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installed instance:]]></item>\r
- <item name="wcf.acp.package.view.parent"><![CDATA[Parent package:]]></item>\r
- <item name="wcf.acp.package.view.properties"><![CDATA[Properties]]></item>\r
- <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Required packages]]></item>\r
- <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[This package has a requirement of {if $requiredPackages|count == 1}one other package.{else}{#$requiredPackages|count} other packages.{/if}]]></item>\r
- <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>\r
- <item name="wcf.acp.package.view.version"><![CDATA[Installed version:]]></item>\r
- </category>\r
- <category name="wcf.acp.packageUpdate">\r
- <item name="wcf.acp.packageUpdate"><![CDATA[Update packages]]></item>\r
- <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentication with update server]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Connection data]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Username and password have not been accepted.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Password]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Please enter a valid password.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Username]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Please enter a valid username.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[User login]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server message]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server name]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Save user data permanantly]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[The entered user data will be saved permanently, so you do not have to input them again.]]></item>\r
- <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Address]]></item>\r
- <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installed version]]></item>\r
- <item name="wcf.acp.packageUpdate.error"><![CDATA[An error occured: ]]></item>\r
- <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[The download of the package {$package} has been failed.]]></item>\r
- <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[An error occured while trying to download the package list.]]></item>\r
- <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[The following {if $excludedPackages|count == 1}conflict{else}conflicts{/if} occured:]]></item>\r
- <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[The installed package "{$excludedPackage.existingPackageName}" is incompatible with the package "{$excludedPackage.packageName}" in version {$excludedPackage.packageVersion}.]]></item>\r
- <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[The package "{$excludedPackage.packageName}" in version {$excludedPackage.packageVersion} is not compatible with the installed package "{$excludedPackage.existingPackageName}".]]></item>\r
- <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} will be installed]]></item>\r
- <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[There are currently no updates available.]]></item>\r
- <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[You have not selected any update.]]></item>\r
- <item name="wcf.acp.packageUpdate.options"><![CDATA[Options]]></item>\r
- <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[This package is already installed and unique. Therefore it cannot be installed another time.]]></item>\r
- <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Install package]]></item>\r
- <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Install another package instance (packages is already installed {#$package.instances} time{if $package.instances > 1}s{/if})]]></item>\r
- <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Update installed package {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} version {$updatableInstance.packageVersion}]]></item>\r
- <item name="wcf.acp.packageUpdate.search"><![CDATA[Search packages]]></item>\r
- <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Author]]></item>\r
- <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Search for ...]]></item>\r
- <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Hide already installed unique packages]]></item>\r
- <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Package name]]></item>\r
- <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Package name and description]]></item>\r
- <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update server]]></item>\r
- <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Search all update server]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Type of package]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Other packages]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Plugin for already installed packages]]></item>\r
- <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Standalone application]]></item>\r
- <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Select all packages]]></item>\r
- <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} is updated to {$package.toVersion}]]></item>\r
- <item name="wcf.acp.packageUpdate.updates"><![CDATA[The following package updates and installations will be processed:]]></item>\r
- <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[New version]]></item>\r
- </category>\r
- <category name="wcf.acp.sessionLog">\r
- <item name="wcf.acp.sessionLog.access.view"><![CDATA[Actions of the logged session of "{$sessionLog->username}"]]></item>\r
- <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[There is a total of {#$items} logged action{if $items != 1}s{/if}]]></item>\r
- <item name="wcf.acp.sessionLog.accesses"><![CDATA[Actions]]></item>\r
- <item name="wcf.acp.sessionLog.className"><![CDATA[Class name]]></item>\r
- <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP address]]></item>\r
- <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Last action]]></item>\r
- <item name="wcf.acp.sessionLog.packageName"><![CDATA[Package]]></item>\r
- <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Method]]></item>\r
- <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>\r
- <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>\r
- <item name="wcf.acp.sessionLog.time"><![CDATA[Date]]></item>\r
- <item name="wcf.acp.sessionLog.userAgent"><![CDATA[User agent]]></item>\r
- <item name="wcf.acp.sessionLog.view"><![CDATA[Logged sessions]]></item>\r
- <item name="wcf.acp.sessionLog.view.count"><![CDATA[There is a total of {#$items} logged session{if $items != 1}s{/if}]]></item>\r
- </category>\r
- <category name="wcf.acp.updateServer">\r
- <item name="wcf.acp.updateServer.add"><![CDATA[Add server]]></item>\r
- <item name="wcf.acp.updateServer.add.success"><![CDATA[The server has been successfully added.]]></item>\r
- <item name="wcf.acp.updateServer.data"><![CDATA[Server data]]></item>\r
- <item name="wcf.acp.updateServer.delete"><![CDATA[Delete server]]></item>\r
- <item name="wcf.acp.updateServer.delete.success"><![CDATA[The server has been successfully deleted.]]></item>\r
- <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Do you really want to delete this server?]]></item>\r
- <item name="wcf.acp.updateServer.disable"><![CDATA[Disable]]></item>\r
- <item name="wcf.acp.updateServer.edit"><![CDATA[Edit server]]></item>\r
- <item name="wcf.acp.updateServer.edit.success"><![CDATA[Your changes have been successfully saved.]]></item>\r
- <item name="wcf.acp.updateServer.enable"><![CDATA[Enable]]></item>\r
- <item name="wcf.acp.updateServer.errorText"><![CDATA[Error messages]]></item>\r
- <item name="wcf.acp.updateServer.htPassword"><![CDATA[Password]]></item>\r
- <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Please enter a valid password (optional).]]></item>\r
- <item name="wcf.acp.updateServer.htUsername"><![CDATA[Username]]></item>\r
- <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Please enter a valid user name (optional).]]></item>\r
- <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[The following error occured while trying to connect:]]></item>\r
- <item name="wcf.acp.updateServer.list.available"><![CDATA[{#$items} server available]]></item>\r
- <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server id]]></item>\r
- <item name="wcf.acp.updateServer.packages"><![CDATA[Packages]]></item>\r
- <item name="wcf.acp.updateServer.server"><![CDATA[Address]]></item>\r
- <item name="wcf.acp.updateServer.server.description"><![CDATA[Please enter the URL to a package server.]]></item>\r
- <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[The entered address is invalid.]]></item>\r
- <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>\r
- <item name="wcf.acp.updateServer.timestamp"><![CDATA[Last access]]></item>\r
- <item name="wcf.acp.updateServer.view"><![CDATA[Available update server]]></item>\r
- <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[There are no update server available.]]></item>\r
- </category>\r
- <category name="wcf.acp.user">\r
- <item name="wcf.acp.user.add"><![CDATA[Add new user]]></item>\r
- <item name="wcf.acp.user.add.data"><![CDATA[User details]]></item>\r
- <item name="wcf.acp.user.add.success"><![CDATA[The new user has been successfully saved.]]></item>\r
- <item name="wcf.acp.user.assignToGroup"><![CDATA[Group assignment]]></item>\r
- <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Assign the following users to the selected group(s)]]></item>\r
- <item name="wcf.acp.user.assignToGroup.success"><![CDATA[The users have been successfully assigned to your chosen groups.]]></item>\r
- <item name="wcf.acp.user.button.assignGroup"><![CDATA[Group assignment]]></item>\r
- <item name="wcf.acp.user.button.exportMail"><![CDATA[Export e-mail addresses]]></item>\r
- <item name="wcf.acp.user.button.sendMail"><![CDATA[Send an e-mail]]></item>\r
- <item name="wcf.acp.user.delete"><![CDATA[Delete user(s)]]></item>\r
- <item name="wcf.acp.user.delete.error"><![CDATA[No user could be deleted.]]></item>\r
- <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}The user has {else}{#$deletedUsers} users have{/if} been successfully deleted.]]></item>\r
- <item name="wcf.acp.user.delete.sure"><![CDATA[Are you sure that you would like to delete this user?]]></item>\r
- <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Are you sure that you would like to delete the selected User(s)?]]></item>\r
- <item name="wcf.acp.user.edit"><![CDATA[Edit user]]></item>\r
- <item name="wcf.acp.user.edit.success"><![CDATA[The changes for this user have been successfully saved.]]></item>\r
- <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[You are currently editing your own user account. Changing the permissions of this user group might lead to locking yourself out of the Administration Control Panel. Please be careful!]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress"><![CDATA[Export e-mail addresses]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Export file format]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Export options]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[Export the e-mail addresses from the following users]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Separate the addresses with a ]]></item>\r
- <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Enclose the addresses with ]]></item>\r
- <item name="wcf.acp.user.groups"><![CDATA[Group memberships]]></item>\r
- <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Find users that are not members of the chosen user groups.]]></item>\r
- <item name="wcf.acp.user.list"><![CDATA[Users]]></item>\r
- <item name="wcf.acp.user.list.all"><![CDATA[All users]]></item>\r
- <item name="wcf.acp.user.list.count"><![CDATA[A total of {#$items} user{if $items > 1}s{/if}]]></item>\r
- <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "1 user selected" : this.count+" users selected"]]></item>\r
- <item name="wcf.acp.user.massProcessing"><![CDATA[Bulk processing of users]]></item>\r
- <item name="wcf.acp.user.massProcessing.action"><![CDATA[Action]]></item>\r
- <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Conditions]]></item>\r
- <item name="wcf.acp.user.massProcessing.success"><![CDATA[The chosen action has been executed successfully on {#$affectedUsers} users.]]></item>\r
- <item name="wcf.acp.user.massProcessing.warning"><![CDATA[The bulk processor will perform the following tasks <strong>without additional security notification</strong>, on all users matching the set conditions. Bulk processing can be very performance intensive, so it should only be executed when the forum is offline. To have a correct display of your content you should update the counters. The processing can not be reversed, so please be attentive when using this function.]]></item>\r
- <item name="wcf.acp.user.search"><![CDATA[Search for users]]></item>\r
- <item name="wcf.acp.user.search.conditions"><![CDATA[Search criteria]]></item>\r
- <item name="wcf.acp.user.search.conditions.general"><![CDATA[General search criteria]]></item>\r
- <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profile search criteria]]></item>\r
- <item name="wcf.acp.user.search.display"><![CDATA[Display]]></item>\r
- <item name="wcf.acp.user.search.display.columns"><![CDATA[Columns]]></item>\r
- <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Other]]></item>\r
- <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profile]]></item>\r
- <item name="wcf.acp.user.search.display.general"><![CDATA[General]]></item>\r
- <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Users per page]]></item>\r
- <item name="wcf.acp.user.search.display.sort"><![CDATA[Sorting]]></item>\r
- <item name="wcf.acp.user.search.error.noMatches"><![CDATA[No users have been found.]]></item>\r
- <item name="wcf.acp.user.search.matches"><![CDATA[Your search produced {if $items == 1}one result{else}{#$items} results{/if}]]></item>\r
- <item name="wcf.acp.user.search.withinResults"><![CDATA[Search within results]]></item>\r
- <item name="wcf.acp.user.sendMail"><![CDATA[Send an e-mail]]></item>\r
- <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail all Users]]></item>\r
- <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[Send e-mail as HTML]]></item>\r
- <item name="wcf.acp.user.sendMail.from"><![CDATA[Sender]]></item>\r
- <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Here you can enter the sender's e-mail address in the following format:</p>\r
-<p style="text-align: center; line-height: 2em;"><code>{if MAIL_USE_FORMATTED_ADDRESS}Senders name <email@sender.tld>{else}email@sender.tld{/if}</code></p>\r
-<p>If you have completely filled in the section under System -> Options -> E-mail, then this field will automatically be filled in. If you are sending e-mails using SMTP, then the sender's e-mail-Address must also be accepted by the server.</p>]]></item>\r
- <item name="wcf.acp.user.sendMail.group"><![CDATA[E-mail all group members]]></item>\r
- <item name="wcf.acp.user.sendMail.groups"><![CDATA[Send an e-mail to the members of the following user groups:]]></item>\r
- <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-mail]]></item>\r
- <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[Send an e-mail to the following users]]></item>\r
- <item name="wcf.acp.user.sendMail.subject"><![CDATA[Subject]]></item>\r
- <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Enter here the e-mail subject.]]></item>\r
- <item name="wcf.acp.user.sendMail.text"><![CDATA[Message]]></item>\r
- <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Enter here the message you want to send to users.]]></item>\r
- <item name="wcf.acp.user.userNote"><![CDATA[Welcome {$this->user->username}.]]></item>\r
- </category>\r
- <category name="wcf.acp.worker">\r
- <item name="wcf.acp.worker.currentStep"><![CDATA[Current process]]></item>\r
- <item name="wcf.acp.worker.description"><![CDATA[Please leave this browser window open until the process has successfully completed. Do NOT try to login to your administrations area using a separate browser window, as doing so may damage the current process.]]></item>\r
- <item name="wcf.acp.worker.progress.finish"><![CDATA[Process completed successfully]]></item>\r
- <item name="wcf.acp.worker.progress.working"><![CDATA[Processing ...]]></item>\r
- <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% complete]]></item>\r
- <item name="wcf.acp.worker.title"><![CDATA[Processing ...]]></item>\r
- </category>\r
- <category name="wcf.global">\r
- <item name="wcf.global.button.back"><![CDATA[« Back]]></item>\r
- <item name="wcf.global.button.close"><![CDATA[Close]]></item>\r
- <item name="wcf.global.button.collapse"><![CDATA[Collapse]]></item>\r
- <item name="wcf.global.button.collapsible"><![CDATA[Expand or collapse]]></item>\r
- <item name="wcf.global.button.delete"><![CDATA[Delete]]></item>\r
- <item name="wcf.global.button.delete.confirm"><![CDATA[Do you really want to delete this item?]]></item>\r
- <item name="wcf.global.button.deleteCompletely"><![CDATA[Delete completely]]></item>\r
- <item name="wcf.global.button.edit"><![CDATA[Edit]]></item>\r
- <item name="wcf.global.button.editor.jump"><![CDATA[Use full editor]]></item>\r
- <item name="wcf.global.button.expand"><![CDATA[Expand]]></item>\r
- <item name="wcf.global.button.mark"><![CDATA[Select]]></item>\r
- <item name="wcf.global.button.next"><![CDATA[Next »]]></item>\r
- <item name="wcf.global.button.preview"><![CDATA[Preview]]></item>\r
- <item name="wcf.global.button.reset"><![CDATA[Reset]]></item>\r
- <item name="wcf.global.button.submit"><![CDATA[Submit]]></item>\r
- <item name="wcf.global.button.unmark"><![CDATA[Unselect]]></item>\r
- <item name="wcf.global.date.day"><![CDATA[Day]]></item>\r
- <item name="wcf.global.date.days"><![CDATA[Days]]></item>\r
- <item name="wcf.global.date.hour"><![CDATA[Hour]]></item>\r
- <item name="wcf.global.date.hours"><![CDATA[Hours]]></item>\r
- <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>\r
- <item name="wcf.global.date.minutes"><![CDATA[Minutes]]></item>\r
- <item name="wcf.global.date.month"><![CDATA[Month]]></item>\r
- <item name="wcf.global.date.months"><![CDATA[Months]]></item>\r
- <item name="wcf.global.date.second"><![CDATA[Second]]></item>\r
- <item name="wcf.global.date.seconds"><![CDATA[Seconds]]></item>\r
- <item name="wcf.global.date.week"><![CDATA[Week]]></item>\r
- <item name="wcf.global.date.weeks"><![CDATA[Weeks]]></item>\r
- <item name="wcf.global.date.year"><![CDATA[Year]]></item>\r
- <item name="wcf.global.date.year.notRequired"><![CDATA[Specifying the year is optional.]]></item>\r
- <item name="wcf.global.date.years"><![CDATA[Years]]></item>\r
- <item name="wcf.global.dateFormat"><![CDATA[M jS Y]]></item>\r
- <item name="wcf.global.dateFormatToday"><![CDATA[<b>\T\o\d\a\y</b>, g:ia]]></item>\r
- <item name="wcf.global.dateFormatYesterday"><![CDATA[\Y\e\s\t\e\r\d\a\y, g:ia]]></item>\r
- <item name="wcf.global.dateInputOrder"><![CDATA[month-day-year]]></item> <!-- system variable; do not translate -->\r
- <item name="wcf.global.dateMethod"><![CDATA[date]]></item> <!-- system variable; do not translate -->\r
- <item name="wcf.global.decimalPoint"><![CDATA[.]]></item>\r
- <item name="wcf.global.defaultValue"><![CDATA[Default]]></item>\r
- <item name="wcf.global.error.backward"><![CDATA[Back to last page]]></item>\r
- <item name="wcf.global.error.empty"><![CDATA[Please enter the required information for this field.]]></item>\r
- <item name="wcf.global.error.file.notFound"><![CDATA[The file could not be found.]]></item>\r
- <item name="wcf.global.error.illegalLink"><![CDATA[The link you are trying to reach is no longer available or is invalid.]]></item>\r
- <item name="wcf.global.error.permissionDenied"><![CDATA[You are not allowed to enter this page. You do not have the required permissions to enter this page.]]></item>\r
- <item name="wcf.global.error.permissionDenied.title"><![CDATA[You are not allowed to enter this page.]]></item>\r
- <item name="wcf.global.error.title"><![CDATA[Error message]]></item>\r
- <item name="wcf.global.form.error"><![CDATA[The data you have entered are invalid. Please check the information you have given in the marked fields.]]></item>\r
- <item name="wcf.global.language.ar"><![CDATA[Arabic]]></item>\r
- <item name="wcf.global.language.bs"><![CDATA[Bosnian]]></item>\r
- <item name="wcf.global.language.cs"><![CDATA[Czech]]></item>\r
- <item name="wcf.global.language.da"><![CDATA[Danish]]></item>\r
- <item name="wcf.global.language.de"><![CDATA[German]]></item>\r
- <item name="wcf.global.language.de-informal"><![CDATA[German (Informal)]]></item>\r
- <item name="wcf.global.language.el"><![CDATA[Greek]]></item>\r
- <item name="wcf.global.language.en"><![CDATA[English]]></item>\r
- <item name="wcf.global.language.es"><![CDATA[Spanish]]></item>\r
- <item name="wcf.global.language.fa"><![CDATA[Persian (Farsi)]]></item>\r
- <item name="wcf.global.language.fi"><![CDATA[Finnish]]></item>\r
- <item name="wcf.global.language.fr"><![CDATA[French]]></item>\r
- <item name="wcf.global.language.he"><![CDATA[Hebrew]]></item>\r
- <item name="wcf.global.language.hr"><![CDATA[Croatian]]></item>\r
- <item name="wcf.global.language.hu"><![CDATA[Hungarian]]></item>\r
- <item name="wcf.global.language.it"><![CDATA[Italian]]></item>\r
- <item name="wcf.global.language.ja"><![CDATA[Japanese]]></item>\r
- <item name="wcf.global.language.ko"><![CDATA[Korean]]></item>\r
- <item name="wcf.global.language.nl"><![CDATA[Dutch]]></item>\r
- <item name="wcf.global.language.no"><![CDATA[Norwegian]]></item>\r
- <item name="wcf.global.language.pl"><![CDATA[Polish]]></item>\r
- <item name="wcf.global.language.pt"><![CDATA[Portuguese]]></item>\r
- <item name="wcf.global.language.pt-BR"><![CDATA[Portuguese (Brazil)]]></item>\r
- <item name="wcf.global.language.ro"><![CDATA[Romanian]]></item>\r
- <item name="wcf.global.language.ru"><![CDATA[Russian]]></item>\r
- <item name="wcf.global.language.sk"><![CDATA[Slovak]]></item>\r
- <item name="wcf.global.language.sr"><![CDATA[Serbian]]></item>\r
- <item name="wcf.global.language.sv"><![CDATA[Swedish]]></item>\r
- <item name="wcf.global.language.th"><![CDATA[Thai]]></item>\r
- <item name="wcf.global.language.tr"><![CDATA[Turkish]]></item>\r
- <item name="wcf.global.language.zh-CN"><![CDATA[Chinese (Simplified)]]></item>\r
- <item name="wcf.global.language.zh-TW"><![CDATA[Chinese (Traditional)]]></item>\r
- <item name="wcf.global.locale.unix"><![CDATA[en_US]]></item> <!-- system variable; do not translate -->\r
- <item name="wcf.global.locale.win"><![CDATA[english]]></item> <!-- system variable; do not translate -->\r
- <item name="wcf.global.multiSelect"><![CDATA[Multiple items can be selected by holding the "Ctrl/Shift" key (Windows) or "Command" (Mac OS) key and clicking the items required.]]></item>\r
- <item name="wcf.global.page.input"><![CDATA[Go to next page]]></item>\r
- <item name="wcf.global.page.next"><![CDATA[Next page]]></item>\r
- <item name="wcf.global.page.previous"><![CDATA[Previous page]]></item>\r
- <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item> <!-- system variable; do not translate -->\r
- <item name="wcf.global.pageTitle"><![CDATA[WoltLab® Community Framework™]]></item>\r
- <item name="wcf.global.redirect.title"><![CDATA[Redirection]]></item>\r
- <item name="wcf.global.redirect.url"><![CDATA[Please click here if the automatic redirection does not work!]]></item>\r
- <item name="wcf.global.scrollDown"><![CDATA[Go to page bottom]]></item>\r
- <item name="wcf.global.scrollUp"><![CDATA[Go to page end]]></item>\r
- <item name="wcf.global.search.matchesExactly"><![CDATA[Exact match]]></item>\r
- <item name="wcf.global.shortTimeFormat"><![CDATA[M jS Y, g:ia]]></item>\r
- <item name="wcf.global.skipToContent"><![CDATA[Skip navigation]]></item>\r
- <item name="wcf.global.sortOrder.ascending"><![CDATA[ascending]]></item>\r
- <item name="wcf.global.sortOrder.descending"><![CDATA[descending]]></item>\r
- <item name="wcf.global.thousandsSeparator"><![CDATA[,]]></item>\r
- <item name="wcf.global.timeFormat"><![CDATA[l, F jS Y, g:ia]]></item>\r
- </category>\r
- <category name="wcf.imageViewer">\r
- <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Image " + (this.currentIndex + 1) + " of " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>\r
- <item name="wcf.imageViewer.close"><![CDATA[Close]]></item>\r
- <item name="wcf.imageViewer.enlarge"><![CDATA[Show only this image (quits the image viewer)]]></item>\r
- <item name="wcf.imageViewer.next"><![CDATA[Next image]]></item>\r
- <item name="wcf.imageViewer.pause"><![CDATA[Stop slideshow]]></item>\r
- <item name="wcf.imageViewer.play"><![CDATA[Start slideshow (changes the image every 5 seconds)]]></item>\r
- <item name="wcf.imageViewer.previous"><![CDATA[Previous image]]></item>\r
- </category>\r
- <category name="wcf.option">\r
- <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Canary Islands, Lisbon, London, Monrovia, Ouagadougou, Reykjavík]]></item>\r
- <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brussels, Copenhagen, Madrid, Paris, Prague, Rome, Sarajevo, Stockholm, Tunis, Warsaw, Vienna]]></item>\r
- <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athens, Beirut, Bucharest, Helsinki, Istanbul, Jerusalem, Cairo, Cape Town, Khartoum, Kiev, Minsk, Sofia]]></item>\r
- <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Ababa, Antananarivo, Baghdad, Dodoma, Kampala, Kuwait City, Mogadishu, Moscow, Nairobi, Riyadh]]></item>\r
- <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Tehran]]></item>\r
- <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Yerevan, Muscat, Réunion, Tbilisi]]></item>\r
- <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>\r
- <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Ashgabat, Bishkek, Dushanbe, Islamabad, Yekaterinburg, Karachi, Maldive Islands, Tashkent]]></item>\r
- <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, New Delhi]]></item>\r
- <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>\r
- <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Novosibirsk]]></item>\r
- <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Cocos (Keeling) Islands, Yangon]]></item>\r
- <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnoyarsk, Vientiane]]></item>\r
- <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hong Kong, Irkutsk, Kuala Lumpur, Manila, Beijing, Perth, Singapore, Taipei, Ulaanbaatar]]></item>\r
- <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Western Australia)]]></item>\r
- <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Yakutsk, Osaka, Pyongyang, Sapporo, Seoul, Tokyo]]></item>\r
- <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>\r
- <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Vladivostok]]></item>\r
- <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord Howe Island (Australia)]]></item>\r
- <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, New Caledonia, Solomon Islands]]></item>\r
- <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolk Island]]></item>\r
- <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, South Tarawa, Fiji, Kamchatka, Marshall Islands, Wellington]]></item>\r
- <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham Islands (New Zealand)]]></item>\r
- <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenix Islands]]></item>\r
- <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Line Islands, Christmas Island]]></item>\r
- <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azores, Cape Verde Islands]]></item>\r
- <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mid-Atlantic]]></item>\r
- <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Brasília, Buenos Aires, Cayenne, Georgetown, Greenland, Montevideo]]></item>\r
- <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Newfoundland]]></item>\r
- <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Atlantic Time (Canada), Asunción, La Paz, Port-of-Spain, Santiago]]></item>\r
- <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>\r
- <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Eastern Time (US & Canada), Bogotá, Lima, San Francisco de Quito]]></item>\r
- <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Central Time (US & Canada), Central America, Mexico City]]></item>\r
- <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Mountain Time (US & Canada), Chihuahua, Mazatlan]]></item>\r
- <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Pacific Time (US & Canada), Tijuana]]></item>\r
- <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>\r
- <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) French Polynesia]]></item>\r
- <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cook Islands, Hawaii]]></item>\r
- <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midway Islands, Samoa]]></item>\r
- <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Enewetak, Kwajalein]]></item>\r
- </category>\r
- <category name="wcf.page">\r
- <item name="wcf.page.pageNo"><![CDATA[Page {#$pageNo}]]></item>\r
- </category>\r
- <category name="wcf.user">\r
- <item name="wcf.user.confirmEmail"><![CDATA[Confirm E-mail Address]]></item>\r
- <item name="wcf.user.confirmPassword"><![CDATA[Confirm password]]></item>\r
- <item name="wcf.user.email"><![CDATA[E-mail Address]]></item>\r
- <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[The given e-mail address and confirmation e-mail address are not identical.]]></item>\r
- <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[The given password and confirmation password are not identical.]]></item>\r
- <item name="wcf.user.error.email.notUnique"><![CDATA[The e-mail address you have entered has already been used by another user.]]></item>\r
- <item name="wcf.user.error.email.notValid"><![CDATA[The e-mail address you have entered is not valid.]]></item>\r
- <item name="wcf.user.error.password.false"><![CDATA[The password is not correct.]]></item>\r
- <item name="wcf.user.error.username.notFound"><![CDATA[The user name "{$username}" could not be found.]]></item>\r
- <item name="wcf.user.error.username.notUnique"><![CDATA[The user name you have entered is already in use.]]></item>\r
- <item name="wcf.user.error.username.notValid"><![CDATA[The username you have entered is not valid.]]></item>\r
- <item name="wcf.user.language"><![CDATA[Language]]></item>\r
- <item name="wcf.user.language.description"><![CDATA[Please select the user interface language to be shown in!]]></item>\r
- <item name="wcf.user.logout"><![CDATA[Logout]]></item>\r
- <item name="wcf.user.password"><![CDATA[Password]]></item>\r
- <item name="wcf.user.registrationDate"><![CDATA[Date of registration]]></item>\r
- <item name="wcf.user.userID"><![CDATA[User ID]]></item>\r
- <item name="wcf.user.username"><![CDATA[Username]]></item>\r
- <item name="wcf.user.visibleLanguages"><![CDATA[Show content in the following languages]]></item>\r
- <item name="wcf.user.visibleLanguages.description"><![CDATA[Select the content languages that should be shown here.]]></item>\r
- </category>\r
- <category name="wcf.user.option">\r
- <item name="wcf.user.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>\r
- </category>\r
-</language>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="en">
+ <category name="wcf.acp">
+ <item name="wcf.acp"><![CDATA[Administration Control Panel]]></item>
+ <item name="wcf.acp.help"><![CDATA[Help]]></item>
+ <item name="wcf.acp.help.complete"><![CDATA[Complete Help]]></item>
+ <item name="wcf.acp.help.disable"><![CDATA[Disable online Help]]></item>
+ <item name="wcf.acp.help.interactive"><![CDATA[Interactive Help]]></item>
+ <item name="wcf.acp.packageQuickAccess"><![CDATA[Change Package]]></item>
+ <item name="wcf.acp.search.extended"><![CDATA[Extended search ...]]></item>
+ <item name="wcf.acp.sitemap"><![CDATA[Site-Map]]></item>
+ </category>
+ <category name="wcf.acp.cache">
+ <item name="wcf.acp.cache.button.clear"><![CDATA[Empty cache]]></item>
+ <item name="wcf.acp.cache.clear.success"><![CDATA[The cache has been successfully emptied.]]></item>
+ <item name="wcf.acp.cache.clear.sure"><![CDATA[Are you sure that you want to completely empty the cache?]]></item>
+ <item name="wcf.acp.cache.data"><![CDATA[Settings]]></item>
+ <item name="wcf.acp.cache.data.files"><![CDATA[Files]]></item>
+ <item name="wcf.acp.cache.data.size"><![CDATA[Size]]></item>
+ <item name="wcf.acp.cache.data.source"><![CDATA[Source]]></item>
+ <item name="wcf.acp.cache.data.version"><![CDATA[Version]]></item>
+ <item name="wcf.acp.cache.list"><![CDATA[Cache]]></item>
+ <item name="wcf.acp.cache.list.mtime"><![CDATA[Last updated]]></item>
+ <item name="wcf.acp.cache.list.name"><![CDATA[Name]]></item>
+ <item name="wcf.acp.cache.list.perm"><![CDATA[Permissions]]></item>
+ <item name="wcf.acp.cache.list.size"><![CDATA[Size]]></item>
+ </category>
+ <category name="wcf.acp.cronjob">
+ <item name="wcf.acp.cronjob.active"><![CDATA[Enabled]]></item>
+ <item name="wcf.acp.cronjob.add"><![CDATA[Add a new cron job]]></item>
+ <item name="wcf.acp.cronjob.add.data"><![CDATA[General Information]]></item>
+ <item name="wcf.acp.cronjob.add.success"><![CDATA[The cron job has been added successfully.]]></item>
+ <item name="wcf.acp.cronjob.add.timing"><![CDATA[Schedule]]></item>
+ <item name="wcf.acp.cronjob.className"><![CDATA[Class path]]></item>
+ <item name="wcf.acp.cronjob.className.description"><![CDATA[Please enter here the path to the PHP file in which the associated cron job class is contained. This path must be relative to the installation folder of the WCF.]]></item>
+ <item name="wcf.acp.cronjob.cronjobID"><![CDATA[Job ID]]></item>
+ <item name="wcf.acp.cronjob.delete"><![CDATA[Delete]]></item>
+ <item name="wcf.acp.cronjob.delete.disabled"><![CDATA[This cron job cannot be deleted.]]></item>
+ <item name="wcf.acp.cronjob.delete.success"><![CDATA[The cron job has been deleted successfully.]]></item>
+ <item name="wcf.acp.cronjob.delete.sure"><![CDATA[Are you sure that you want to remove this cron job?]]></item>
+ <item name="wcf.acp.cronjob.description"><![CDATA[Description]]></item>
+ <item name="wcf.acp.cronjob.description.description"><![CDATA[Here you may enter a short description for the cron job (preferably in English).]]></item>
+ <item name="wcf.acp.cronjob.disable"><![CDATA[Disable]]></item>
+ <item name="wcf.acp.cronjob.edit"><![CDATA[Edit]]></item>
+ <item name="wcf.acp.cronjob.edit.data"><![CDATA[General Information]]></item>
+ <item name="wcf.acp.cronjob.edit.disabled"><![CDATA[This cron job cannot be edited.]]></item>
+ <item name="wcf.acp.cronjob.edit.success"><![CDATA[The cron job has been modified successfully.]]></item>
+ <item name="wcf.acp.cronjob.edit.timing"><![CDATA[Schedule]]></item>
+ <item name="wcf.acp.cronjob.enable"><![CDATA[Enable]]></item>
+ <item name="wcf.acp.cronjob.error.doesNotExist"><![CDATA[The path you have entered is invalid.]]></item>
+ <item name="wcf.acp.cronjob.error.empty"><![CDATA[Please enter a valid entry here.]]></item>
+ <item name="wcf.acp.cronjob.error.notValid"><![CDATA[The timings you have set are invalid.]]></item>
+ <item name="wcf.acp.cronjob.execMultiple"><![CDATA[Schedule multiple executions?]]></item>
+ <item name="wcf.acp.cronjob.execMultiple.description"><![CDATA[When enabled, the respective task (cronjob) will be repeatedly executed at all possible dates between the previous specified execution date and the next.]]></item>
+ <item name="wcf.acp.cronjob.execute"><![CDATA[Execute now]]></item>
+ <item name="wcf.acp.cronjob.execute.success"><![CDATA[The job has been executed successfully.]]></item>
+ <item name="wcf.acp.cronjob.inactive"><![CDATA[Disabled]]></item>
+ <item name="wcf.acp.cronjob.info"><![CDATA[General Information]]></item>
+ <item name="wcf.acp.cronjob.intro"><![CDATA[Configuring cronjobs (automatized scheduled tasks) requires distinct knowledge of the crontab syntax on Unix based systems. More information about this topic can be obtained on the following Webpage: <a href="{@RELATIVE_WCF_DIR}acp/dereferrer.php?url={"http://www.unixgeeks.org/security/newbie/unix/cron-1.html"|rawurlencode}" class="externalURL">Newbie: Intro to cron</a>.]]></item>
+ <item name="wcf.acp.cronjob.lastExec"><![CDATA[Last scheduled execution]]></item>
+ <item name="wcf.acp.cronjob.list"><![CDATA[Cron jobs]]></item>
+ <item name="wcf.acp.cronjob.list.count"><![CDATA[There is a total of {#$items} cronjob{if $items != 1}s{/if}]]></item>
+ <item name="wcf.acp.cronjob.log"><![CDATA[Log of executed cronjobs]]></item>
+ <item name="wcf.acp.cronjob.log.clear"><![CDATA[Delete all]]></item>
+ <item name="wcf.acp.cronjob.log.clear.confirm"><![CDATA[Are you sure that you want to remove all log entries?]]></item>
+ <item name="wcf.acp.cronjob.log.data"><![CDATA[There is a total of {#$items} {if $items == 1}entry{else}entries{/if}]]></item>
+ <item name="wcf.acp.cronjob.log.error"><![CDATA[Error:]]></item>
+ <item name="wcf.acp.cronjob.log.execTime"><![CDATA[Successfully executed]]></item>
+ <item name="wcf.acp.cronjob.log.noEntries"><![CDATA[There are currently no log entries available.]]></item>
+ <item name="wcf.acp.cronjob.log.success"><![CDATA[OK]]></item>
+ <item name="wcf.acp.cronjob.nextExec"><![CDATA[Next scheduled execution]]></item>
+ <item name="wcf.acp.cronjob.noneAvailable"><![CDATA[There are currently no cronjobs available.]]></item>
+ <item name="wcf.acp.cronjob.packageName"><![CDATA[Installed by]]></item>
+ <item name="wcf.acp.cronjob.runNow"><![CDATA[Run now]]></item>
+ <item name="wcf.acp.cronjob.startDom"><![CDATA[Day of month]]></item>
+ <item name="wcf.acp.cronjob.startDom.description"><![CDATA[Day of the month (1 - 31) in which the cron job should be executed.]]></item>
+ <item name="wcf.acp.cronjob.startDomShort"><![CDATA[D]]></item>
+ <item name="wcf.acp.cronjob.startDow"><![CDATA[Weekday]]></item>
+ <item name="wcf.acp.cronjob.startDow.description"><![CDATA[Weekday (0 - 6 with Sunday = 0 or mon - sun) in which the cron job should be executed.]]></item>
+ <item name="wcf.acp.cronjob.startDowShort"><![CDATA[DoW]]></item>
+ <item name="wcf.acp.cronjob.startHour"><![CDATA[Hour]]></item>
+ <item name="wcf.acp.cronjob.startHour.description"><![CDATA[Hours (0 - 23) in which the cron job should be executed.]]></item>
+ <item name="wcf.acp.cronjob.startHourShort"><![CDATA[h]]></item>
+ <item name="wcf.acp.cronjob.startMinute"><![CDATA[Minute]]></item>
+ <item name="wcf.acp.cronjob.startMinute.description"><![CDATA[Minutes (0 - 59) in which the cron job should be executed.]]></item>
+ <item name="wcf.acp.cronjob.startMinuteShort"><![CDATA[m]]></item>
+ <item name="wcf.acp.cronjob.startMonth"><![CDATA[Month]]></item>
+ <item name="wcf.acp.cronjob.startMonth.description"><![CDATA[Month (1 - 12 or jan - dec) in which the cron job should be executed.]]></item>
+ <item name="wcf.acp.cronjob.startMonthShort"><![CDATA[M]]></item>
+ <item name="wcf.acp.cronjob.status"><![CDATA[Status]]></item>
+ <item name="wcf.acp.cronjob.subtitle"><![CDATA[]]></item>
+ </category>
+ <category name="wcf.acp.group">
+ <item name="wcf.acp.group.add"><![CDATA[Add new user group]]></item>
+ <item name="wcf.acp.group.add.permissions"><![CDATA[Permissions]]></item>
+ <item name="wcf.acp.group.add.success"><![CDATA[The user group has been successfully added.]]></item>
+ <item name="wcf.acp.group.administrators"><![CDATA[Administrators]]></item>
+ <item name="wcf.acp.group.data"><![CDATA[General group information]]></item>
+ <item name="wcf.acp.group.delete"><![CDATA[Delete this user group]]></item>
+ <item name="wcf.acp.group.delete.success"><![CDATA[{if $deletedGroups == 1}This user group has{else}{#$deletedGroups} These user groups have{/if} been successfully deleted.]]></item>
+ <item name="wcf.acp.group.delete.sure"><![CDATA[Are you sure you would like to remove this user group?]]></item>
+ <item name="wcf.acp.group.edit"><![CDATA[Edit this user group]]></item>
+ <item name="wcf.acp.group.edit.success"><![CDATA[Your user group changes have been successfully saved.]]></item>
+ <item name="wcf.acp.group.edit.warning.selfIsMember"><![CDATA[You are currently a member of this user group. Changing the permissions of this user group could result in locking yourself out of the Administration Control Panel. Please be careful!]]></item>
+ <item name="wcf.acp.group.everyone"><![CDATA[Everyone]]></item>
+ <item name="wcf.acp.group.groupID"><![CDATA[Group ID]]></item>
+ <item name="wcf.acp.group.groupName"><![CDATA[Name of this user group]]></item>
+ <item name="wcf.acp.group.groupName.description"><![CDATA[Enter here a name for this group.]]></item>
+ <item name="wcf.acp.group.guests"><![CDATA[Guests]]></item>
+ <item name="wcf.acp.group.list"><![CDATA[User groups]]></item>
+ <item name="wcf.acp.group.list.data"><![CDATA[A total of {#$items} user groups]]></item>
+ <item name="wcf.acp.group.members"><![CDATA[Number of members]]></item>
+ <item name="wcf.acp.group.moderators"><![CDATA[Moderators]]></item>
+ <item name="wcf.acp.group.option.admin.general.canUseAcp"><![CDATA[Can enter Administration Control Panel?]]></item>
+ <item name="wcf.acp.group.option.admin.general.canUseAcp.description"><![CDATA[Activating this option will allow members of this user group to enter the Administration Control Panel and, dependent upon their permissions, run certain actions.]]></item>
+ <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions"><![CDATA[Can view private user options]]></item>
+ <item name="wcf.acp.group.option.admin.general.canViewPrivateUserOptions.description"><![CDATA[Members of this user group can view private user options.]]></item>
+ <item name="wcf.acp.group.option.admin.system.canEditOption"><![CDATA[Can change the system options?]]></item>
+ <item name="wcf.acp.group.option.admin.system.canEditOption.description"><![CDATA[Activating this option will allow members of this user group to view and change the system options - e.g. Forum on/offline.]]></item>
+ <item name="wcf.acp.group.option.admin.system.canViewLog"><![CDATA[Can view logs]]></item>
+ <item name="wcf.acp.group.option.admin.system.canViewLog.description"><![CDATA[Members of this user group can view the system logs.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob"><![CDATA[Can add new cronjobs]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canAddCronjob.description"><![CDATA[Members of this user group can add new cronjobs.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob"><![CDATA[Can delete existing cronjobs]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjob.description"><![CDATA[Members of this user group can delete existing cronjobs.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog"><![CDATA[Can delete log files of running cronjobs]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canDeleteCronjobsLog.description"><![CDATA[Members of this user group can delete log files of running cronjobs. The log files are also checked by the associated cronjob if the log file was successfully written.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob"><![CDATA[Can edit existing cronjobs]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEditCronjob.description"><![CDATA[Members of this user group can edit existing cronjobs.]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob"><![CDATA[Can disable existing cronjobs]]></item>
+ <item name="wcf.acp.group.option.admin.system.cronjobs.canEnableDisableCronjob.description"><![CDATA[Members of this user group can disable existing cronjobs. Disabling a cronjob only stops the actual cronjob from running, but does not remove it.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canEditServer"><![CDATA[Can edit existing update servers]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canEditServer.description"><![CDATA[Members of this user group can edit existing update servers and add new update servers.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canInstallPackage"><![CDATA[Can install new packages]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canInstallPackage.description"><![CDATA[Members of this user group can install additional packages.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage"><![CDATA[Can remove existing packages]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUninstallPackage.description"><![CDATA[Members of this user group can remove existing packages.]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage"><![CDATA[Can update existing packages]]></item>
+ <item name="wcf.acp.group.option.admin.system.package.canUpdatePackage.description"><![CDATA[Members of this user group can update existing packages.]]></item>
+ <item name="wcf.acp.group.option.admin.user.accessibleGroups"><![CDATA[Accessible user groups]]></item>
+ <item name="wcf.acp.group.option.admin.user.accessibleGroups.description"><![CDATA[Members of this user group have access to the following groups. For example, here you can set if the user group has permission to edit themselves.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddGroup"><![CDATA[Can add new user groups]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddGroup.description"><![CDATA[Members of this user group can add new user groups.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddUser"><![CDATA[Can add new users]]></item>
+ <item name="wcf.acp.group.option.admin.user.canAddUser.description"><![CDATA[Members of this user group can add new users. If the option for "Accessible User groups" has been enabled, then on creation of the user, the appropriate accessible user groups can also be assigned.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteGroup"><![CDATA[Can delete existing user groups]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteGroup.description"><![CDATA[Members of this user group can remove existing user groups.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteUser"><![CDATA[Can delete existing users]]></item>
+ <item name="wcf.acp.group.option.admin.user.canDeleteUser.description"><![CDATA[Members of this user group can delete existing users.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditGroup"><![CDATA[Can edit existing user groups]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditGroup.description"><![CDATA[Members of this user group can edit existing user groups.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditMailAddress"><![CDATA[Can edit user e-mail addresses]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditMailAddress.description"><![CDATA[Members of this user group can edit user e-mail addresses.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditPassword"><![CDATA[Can edit user passwords]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditPassword.description"><![CDATA[Members of this user group can edit user passwords.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditUser"><![CDATA[Can edit existing users]]></item>
+ <item name="wcf.acp.group.option.admin.user.canEditUser.description"><![CDATA[Members of this user group can edit existing users.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canMailUser"><![CDATA[Can send e-mails to users]]></item>
+ <item name="wcf.acp.group.option.admin.user.canMailUser.description"><![CDATA[Members of this user group can view other members' e-mail addresses and consequently send them e-mails.]]></item>
+ <item name="wcf.acp.group.option.admin.user.canSearchUser"><![CDATA[Can search users]]></item>
+ <item name="wcf.acp.group.option.admin.user.canSearchUser.description"><![CDATA[Members of this user group can search existing users and their profiles.]]></item>
+ <item name="wcf.acp.group.option.category.admin"><![CDATA[Administrator permissions]]></item>
+ <item name="wcf.acp.group.option.category.admin.content"><![CDATA[Content]]></item>
+ <item name="wcf.acp.group.option.category.admin.content.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.display"><![CDATA[Design]]></item>
+ <item name="wcf.acp.group.option.category.admin.display.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.general"><![CDATA[General administrative permissions]]></item>
+ <item name="wcf.acp.group.option.category.admin.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.maintenance"><![CDATA[Maintenance]]></item>
+ <item name="wcf.acp.group.option.category.admin.maintenance.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.system"><![CDATA[System functions]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.cronjobs"><![CDATA[Cronjobs]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.cronjobs.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.package"><![CDATA[Package management]]></item>
+ <item name="wcf.acp.group.option.category.admin.system.package.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.user"><![CDATA[User functions]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.group"><![CDATA[Group management]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.group.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.user"><![CDATA[User management]]></item>
+ <item name="wcf.acp.group.option.category.admin.user.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.mod"><![CDATA[Moderator permissions]]></item>
+ <item name="wcf.acp.group.option.category.mod.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.category.user"><![CDATA[General permissions]]></item>
+ <item name="wcf.acp.group.option.category.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>
+ <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle"><![CDATA[Can view disabled styles]]></item>
+ <item name="wcf.acp.group.option.admin.style.canUseDisabledStyle.description"><![CDATA[Members of this user group can choose to view disabled styles.]]></item>
+ <item name="wcf.acp.group.option.category.admin.style"><![CDATA[Style management]]></item>
+ <item name="wcf.acp.group.option.category.admin.style.description"><![CDATA[]]></item>
+ <item name="wcf.acp.group.showMembers"><![CDATA[Show the members of this user group]]></item>
+ <item name="wcf.acp.group.superModerators"><![CDATA[Super moderators]]></item>
+ <item name="wcf.acp.group.users"><![CDATA[Registered users]]></item>
+ </category>
+ <category name="wcf.acp.login">
+ <item name="wcf.acp.login"><![CDATA[Login]]></item>
+ <item name="wcf.acp.login.data"><![CDATA[Login details]]></item>
+ </category>
+ <category name="wcf.acp.masterPassword">
+ <item name="wcf.acp.masterPassword"><![CDATA[Master password]]></item>
+ <item name="wcf.acp.masterPassword.confirm"><![CDATA[Confirm master password]]></item>
+ <item name="wcf.acp.masterPassword.enter"><![CDATA[Master password required]]></item>
+ <item name="wcf.acp.masterPassword.enter.description"><![CDATA[This page or action requires you to enter the master password due to security reasons. You only need to do so once within a session. If you have forgotten the master password you can reset it by deleting the file <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em>.]]></item>
+ <item name="wcf.acp.masterPassword.error.invalid"><![CDATA[The master password is not correct.If you have forgotten the master password you can reset it by deleting the file <em>{@RELATIVE_WCF_DIR}acp/masterPassword.inc.php</em>.]]></item>
+ <item name="wcf.acp.masterPassword.error.notEqual"><![CDATA[The entered passwords are not identical.]]></item>
+ <item name="wcf.acp.masterPassword.error.notSecure"><![CDATA[The password is not secure. It has to contain at least eight characters, small and capital latin letters as well as numbers and special characters. It must not be identically with passwords of administrators of this page.]]></item>
+ <item name="wcf.acp.masterPassword.example"><![CDATA[Suggestion]]></item>
+ <item name="wcf.acp.masterPassword.example.set"><![CDATA[Use suggestion]]></item>
+ <item name="wcf.acp.masterPassword.init"><![CDATA[Set master password]]></item>
+ <item name="wcf.acp.masterPassword.init.description"><![CDATA[The master password is an additional protection for functions that are relevant to security. You should use a very secure password that must not be identically with your normal administrator password, unknown to others and not used on other websites.]]></item>
+ </category>
+ <category name="wcf.acp.menu">
+ <item name="wcf.acp.menu.link.autoupdate"><![CDATA[Automatic update]]></item>
+ <item name="wcf.acp.menu.link.content"><![CDATA[Content]]></item>
+ <item name="wcf.acp.menu.link.cronjobs.add"><![CDATA[Add new cronjob]]></item>
+ <item name="wcf.acp.menu.link.cronjobs.showLog"><![CDATA[View cronjob logs]]></item>
+ <item name="wcf.acp.menu.link.cronjobs.view"><![CDATA[List cronjobs]]></item>
+ <item name="wcf.acp.menu.link.display"><![CDATA[Design]]></item>
+ <item name="wcf.acp.menu.link.group"><![CDATA[User groups]]></item>
+ <item name="wcf.acp.menu.link.group.add"><![CDATA[Add new group]]></item>
+ <item name="wcf.acp.menu.link.group.mail"><![CDATA[E-mail all group members]]></item>
+ <item name="wcf.acp.menu.link.group.view"><![CDATA[Group overview]]></item>
+ <item name="wcf.acp.menu.link.log"><![CDATA[Log]]></item>
+ <item name="wcf.acp.menu.link.log.cache"><![CDATA[Cache]]></item>
+ <item name="wcf.acp.menu.link.log.session"><![CDATA[Session]]></item>
+ <item name="wcf.acp.menu.link.maintenance"><![CDATA[Maintenance]]></item>
+ <item name="wcf.acp.menu.link.option"><![CDATA[Options]]></item>
+ <item name="wcf.acp.menu.link.option.importAndExport"><![CDATA[Import & export]]></item>
+ <item name="wcf.acp.menu.link.package"><![CDATA[Packages]]></item>
+ <item name="wcf.acp.menu.link.package.database"><![CDATA[Search packages]]></item>
+ <item name="wcf.acp.menu.link.package.install"><![CDATA[Install new package]]></item>
+ <item name="wcf.acp.menu.link.package.server.add"><![CDATA[Add new server]]></item>
+ <item name="wcf.acp.menu.link.package.server.view"><![CDATA[Server overview]]></item>
+ <item name="wcf.acp.menu.link.package.view"><![CDATA[List installed packages]]></item>
+ <item name="wcf.acp.menu.link.system"><![CDATA[System]]></item>
+ <item name="wcf.acp.menu.link.user"><![CDATA[User]]></item>
+ <item name="wcf.acp.menu.link.user.add"><![CDATA[Add user]]></item>
+ <item name="wcf.acp.menu.link.user.list"><![CDATA[List users]]></item>
+ <item name="wcf.acp.menu.link.user.mail"><![CDATA[E-mail all users]]></item>
+ <item name="wcf.acp.menu.link.user.management"><![CDATA[Users]]></item>
+ <item name="wcf.acp.menu.link.user.massProcessing"><![CDATA[Bulk processing of users]]></item>
+ <item name="wcf.acp.menu.link.user.search"><![CDATA[Search for users]]></item>
+ </category>
+ <category name="wcf.acp.option">
+ <item name="wcf.acp.option.blacklist_hostnames"><![CDATA[Exclude hostnames]]></item>
+ <item name="wcf.acp.option.blacklist_hostnames.description"><![CDATA[Enter one hostname each row you want to exclude from this site.]]></item>
+ <item name="wcf.acp.option.blacklist_ip_addresses"><![CDATA[Exclude IP addresses]]></item>
+ <item name="wcf.acp.option.blacklist_ip_addresses.description"><![CDATA[Enter one IP address each row you want to exclude from this site.]]></item>
+ <item name="wcf.acp.option.blacklist_user_agents"><![CDATA[Exclude user agents]]></item>
+ <item name="wcf.acp.option.blacklist_user_agents.description"><![CDATA[Enter one user agent each row you want to exclude from this site.]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_host"><![CDATA[Memcache server]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_host.description"><![CDATA[Enter the address of the memcache server. You can enter one server each row.]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_use_pconnect"><![CDATA[Use persistent connections]]></item>
+ <item name="wcf.acp.option.cache_source_memcache_use_pconnect.description"><![CDATA[By enabling this option a persistent connection to the memcache server will be used.]]></item>
+ <item name="wcf.acp.option.cache_source_type"><![CDATA[Cache type]]></item>
+ <item name="wcf.acp.option.cache_source_type.apc"><![CDATA[Alternative PHP Cache]]></item>
+ <item name="wcf.acp.option.cache_source_type.description"><![CDATA[Please select the type of cache you want to use. Some of the types have special requirements to the server system and cannot be used in your environment.]]></item>
+ <item name="wcf.acp.option.cache_source_type.disk"><![CDATA[File system (default)]]></item>
+ <item name="wcf.acp.option.cache_source_type.memcache"><![CDATA[Memcache (experimental)]]></item>
+ <item name="wcf.acp.option.category.general"><![CDATA[General]]></item>
+ <item name="wcf.acp.option.category.general.cache"><![CDATA[Cache]]></item>
+ <item name="wcf.acp.option.category.general.cache.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.cache.general"><![CDATA[General]]></item>
+ <item name="wcf.acp.option.category.general.cache.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.cache.memcache"><![CDATA[Memcache]]></item>
+ <item name="wcf.acp.option.category.general.cache.memcache.description"><![CDATA[Memcache stores data in the memory that is often accessed. This may reduce the database load dramatically. Read more about the memcache on the following site:
+<ul>
+ <li><a href="http://memcached.org/">memcached.org</a></li>
+</ul>]]></item>
+ <item name="wcf.acp.option.category.general.date"><![CDATA[Date and time]]></item>
+ <item name="wcf.acp.option.category.general.date.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http"><![CDATA[HTTP]]></item>
+ <item name="wcf.acp.option.category.general.http.cookie"><![CDATA[Cookies]]></item>
+ <item name="wcf.acp.option.category.general.http.cookie.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http.http"><![CDATA[HTTP]]></item>
+ <item name="wcf.acp.option.category.general.http.http.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.http.proxy"><![CDATA[Proxy server]]></item>
+ <item name="wcf.acp.option.category.general.http.proxy.description"><![CDATA[You can configure optional proxy servers for connections to external servers.]]></item>
+ <item name="wcf.acp.option.category.general.mail"><![CDATA[E-mails]]></item>
+ <item name="wcf.acp.option.category.general.mail.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.mail.general"><![CDATA[General]]></item>
+ <item name="wcf.acp.option.category.general.mail.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.mail.send"><![CDATA[Transmission]]></item>
+ <item name="wcf.acp.option.category.general.mail.send.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.general.offline"><![CDATA[Disable forum temporarily]]></item>
+ <item name="wcf.acp.option.category.general.offline.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module"><![CDATA[Modules on / off]]></item>
+ <item name="wcf.acp.option.category.module.content"><![CDATA[Content]]></item>
+ <item name="wcf.acp.option.category.module.content.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.display"><![CDATA[Display]]></item>
+ <item name="wcf.acp.option.category.module.display.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.system"><![CDATA[System]]></item>
+ <item name="wcf.acp.option.category.module.system.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.module.user"><![CDATA[User]]></item>
+ <item name="wcf.acp.option.category.module.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security"><![CDATA[Security]]></item>
+ <item name="wcf.acp.option.category.security.antispam"><![CDATA[Captcha]]></item>
+ <item name="wcf.acp.option.category.security.antispam.description"><![CDATA[Internet pages are often attacked by programs and robots. E.g. it is possible to create hundreds of user accounts automatically. You can protect yourself against these spam bots with so called <a href="http://en.wikipedia.org/wiki/Captcha" class="externalURL">Captcha images</a> on every place where web forms can be submitted. Unregistered users then first have to identify the code on the Captcha before they can submit the form. Robots cannot read the code. Please not that Captcha images cannot be read by blind and visually impaired people.]]></item>
+ <item name="wcf.acp.option.category.security.blacklist"><![CDATA[Blacklist]]></item>
+ <item name="wcf.acp.option.category.security.blacklist.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.censorship"><![CDATA[Censorship]]></item>
+ <item name="wcf.acp.option.category.security.censorship.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.general"><![CDATA[General]]></item>
+ <item name="wcf.acp.option.category.security.general.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.security.general.session"><![CDATA[Sessions]]></item>
+ <item name="wcf.acp.option.category.security.general.session.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.category.user"><![CDATA[Users]]></item>
+ <item name="wcf.acp.option.category.user.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.cookie_domain"><![CDATA[Cookie domain]]></item>
+ <item name="wcf.acp.option.cookie_domain.description"><![CDATA[Enter here the domain in which the cookie should be used. This is optional, so in most cases you don't need to specify the cookie domain.]]></item>
+ <item name="wcf.acp.option.cookie_path"><![CDATA[Cookie path]]></item>
+ <item name="wcf.acp.option.cookie_path.description"><![CDATA[The cookie path is concurrent to the document root of your site - e.g. "/forum" for http://www.woltlab.com/forum.]]></item>
+ <item name="wcf.acp.option.cookie_prefix"><![CDATA[Cookie prefix]]></item>
+ <item name="wcf.acp.option.cookie_prefix.description"><![CDATA[Enter a prefix to be used for the cookie name here.]]></item>
+ <item name="wcf.acp.option.enable_daylight_saving_time"><![CDATA[Enable automatic Daylight Savings Time]]></item>
+ <item name="wcf.acp.option.enable_daylight_saving_time.description"><![CDATA[Should the clock automatically change according to the summer/winter time?]]></item>
+ <item name="wcf.acp.option.enable_session_data_cache"><![CDATA[Use cache method for session data]]></item>
+ <item name="wcf.acp.option.enable_session_data_cache.description"><![CDATA[Should the selected cache method be used to save the session data?]]></item>
+ <item name="wcf.acp.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>
+ <item name="wcf.acp.option.export"><![CDATA[Export options]]></item>
+ <item name="wcf.acp.option.export.download"><![CDATA[Download the exported options]]></item>
+ <item name="wcf.acp.option.export.download.description"><![CDATA[Download the exported options as a backup file to your local machine.]]></item>
+ <item name="wcf.acp.option.http_enable_gzip"><![CDATA[Enable Gzip compression]]></item>
+ <item name="wcf.acp.option.http_enable_gzip.description"><![CDATA[Enable this option to send content from the server to clients in a compressed form. This option reduces traffic.]]></item>
+ <item name="wcf.acp.option.http_enable_no_cache_headers"><![CDATA[Disable caching of pages in browsers]]></item>
+ <item name="wcf.acp.option.http_enable_no_cache_headers.description"><![CDATA[Enabling this option will prevent browsers from caching the pages.]]></item>
+ <item name="wcf.acp.option.http_gzip_level"><![CDATA[Compression level]]></item>
+ <item name="wcf.acp.option.http_gzip_level.description"><![CDATA[A value of 1 to 9 is required. For optimum output for compression and server performance, we recommend a value of 1.]]></item>
+ <item name="wcf.acp.option.import"><![CDATA[Import options]]></item>
+ <item name="wcf.acp.option.import.error.importFailed"><![CDATA[The import of the chosen file has failed.]]></item>
+ <item name="wcf.acp.option.import.success"><![CDATA[The options have been imported successfully.]]></item>
+ <item name="wcf.acp.option.import.upload"><![CDATA[Upload the options]]></item>
+ <item name="wcf.acp.option.import.upload.description"><![CDATA[Upload the options to be imported from your local machine.]]></item>
+ <item name="wcf.acp.option.importAndExport"><![CDATA[Import & Export options]]></item>
+ <item name="wcf.acp.option.mail_admin_address"><![CDATA[Administrator's e-mail address]]></item>
+ <item name="wcf.acp.option.mail_admin_address.description"><![CDATA[Enter the administrator's e-mail address here.]]></item>
+ <item name="wcf.acp.option.mail_debug_logfile_path"><![CDATA[Path to the debug log file]]></item>
+ <item name="wcf.acp.option.mail_debug_logfile_path.description"><![CDATA[Enter the path to the log file here]]></item>
+ <item name="wcf.acp.option.mail_from_address"><![CDATA[Sender's e-mail address]]></item>
+ <item name="wcf.acp.option.mail_from_address.description"><![CDATA[Enter the sender's e-mail address that should be used for automated e-mails here.]]></item>
+ <item name="wcf.acp.option.mail_from_name"><![CDATA[Sender's name]]></item>
+ <item name="wcf.acp.option.mail_from_name.description"><![CDATA[Enter the sender's name that should be used for automated e-mails here.]]></item>
+ <item name="wcf.acp.option.mail_send_method"><![CDATA[E-mail method]]></item>
+ <item name="wcf.acp.option.mail_send_method.debug"><![CDATA[Debug]]></item>
+ <item name="wcf.acp.option.mail_send_method.description"><![CDATA[Choose an e-mail transmission method.]]></item>
+ <item name="wcf.acp.option.mail_send_method.php"><![CDATA[PHP]]></item>
+ <item name="wcf.acp.option.mail_send_method.smtp"><![CDATA[SMTP]]></item>
+ <item name="wcf.acp.option.mail_signature"><![CDATA[Sender's signature]]></item>
+ <item name="wcf.acp.option.mail_signature.description"><![CDATA[Enter a signature that should be sent with system e-mails here.]]></item>
+ <item name="wcf.acp.option.mail_smtp_host"><![CDATA[SMTP host]]></item>
+ <item name="wcf.acp.option.mail_smtp_host.description"><![CDATA[Enter the SMTP server name here.]]></item>
+ <item name="wcf.acp.option.mail_smtp_password"><![CDATA[SMTP password]]></item>
+ <item name="wcf.acp.option.mail_smtp_password.description"><![CDATA[Enter the SMTP password here.]]></item>
+ <item name="wcf.acp.option.mail_smtp_port"><![CDATA[SMTP port]]></item>
+ <item name="wcf.acp.option.mail_smtp_port.description"><![CDATA[Enter the SMTP server port here.]]></item>
+ <item name="wcf.acp.option.mail_smtp_user"><![CDATA[SMTP username]]></item>
+ <item name="wcf.acp.option.mail_smtp_user.description"><![CDATA[Enter the SMTP user name here.]]></item>
+ <item name="wcf.acp.option.mail_use_f_param"><![CDATA[Enable the "-f" parameter]]></item>
+ <item name="wcf.acp.option.mail_use_f_param.description"><![CDATA[Some servers may require the "-f" parameter to be used when sending e-mails. If your users experience problems with receiving e-mails, try enabling this option.]]></item>
+ <item name="wcf.acp.option.mail_use_formatted_address"><![CDATA[Use formatted e-mail addresses]]></item>
+ <item name="wcf.acp.option.mail_use_formatted_address.description"><![CDATA[Sender's and receiver's addresses are formatted in "Name <email@domain.tld>". This option is not supported by all mail servers and should be turned off in case of any problems.]]></item>
+ <item name="wcf.acp.option.module_master_password"><![CDATA[Enable master password]]></item>
+ <item name="wcf.acp.option.module_master_password.description"><![CDATA[Pages and forms within the admin panel that are relevant to security can be protected with an additional master password.]]></item>
+ <item name="wcf.acp.option.proxy_server_http"><![CDATA[Proxy-Server (HTTP)]]></item>
+ <item name="wcf.acp.option.proxy_server_http.description"><![CDATA[Proxy-Server for HTTP connections]]></item>
+ <item name="wcf.acp.option.session_timeout"><![CDATA[Session timeout]]></item>
+ <item name="wcf.acp.option.session_timeout.description"><![CDATA[Enter how long a session should remain valid for here [seconds].]]></item>
+ <item name="wcf.acp.option.session_validate_ip_address"><![CDATA[Check IP address of session]]></item>
+ <item name="wcf.acp.option.session_validate_ip_address.description"><![CDATA[The number or block of an IP address that should be checked while reading the session data. A high number can exclude users that use changing IP addresses.]]></item>
+ <item name="wcf.acp.option.session_validate_user_agent"><![CDATA[Check user agent of session]]></item>
+ <item name="wcf.acp.option.session_validate_user_agent.description"><![CDATA[Should the user agent be checked while reading the session data?]]></item>
+ <item name="wcf.acp.option.success"><![CDATA[Your option changes have been successfully saved.]]></item>
+ <item name="wcf.acp.option.timezone"><![CDATA[Time zone offset]]></item>
+ <item name="wcf.acp.option.timezone.description"><![CDATA[Choose your default time zone for your site.]]></item>
+ <item name="wcf.acp.option.user_online_timeout"><![CDATA[Users online timeout]]></item>
+ <item name="wcf.acp.option.user_online_timeout.description"><![CDATA[Enter here how long users should remain marked as online after they are inactive [seconds].]]></item>
+ <item name="wcf.acp.option.category.general.page"><![CDATA[Page]]></item>
+ <item name="wcf.acp.option.category.general.page.description"><![CDATA[]]></item>
+ <item name="wcf.acp.option.meta_description"><![CDATA[Meta description]]></item>
+ <item name="wcf.acp.option.meta_description.description"><![CDATA[Enter a meta description here.]]></item>
+ <item name="wcf.acp.option.meta_keywords"><![CDATA[Meta keywords]]></item>
+ <item name="wcf.acp.option.meta_keywords.description"><![CDATA[Enter some meta keywords here.]]></item>
+ <item name="wcf.acp.option.page_description"><![CDATA[Page description]]></item>
+ <item name="wcf.acp.option.page_description.description"><![CDATA[Enter a short description of the page.]]></item>
+ <item name="wcf.acp.option.page_title"><![CDATA[Page title]]></item>
+ <item name="wcf.acp.option.page_title.description"><![CDATA[Enter the global title of the page here. That title will show up inside the board header, if you have enabled it with the style editor.]]></item>
+ <item name="wcf.acp.option.page_url"><![CDATA[Page URL]]></item>
+ <item name="wcf.acp.option.page_url.description"><![CDATA[Please enter the URL of the page (without trailing slash).]]></item>
+ <item name="wcf.acp.option.page_urls"><![CDATA[Further URLs]]></item>
+ <item name="wcf.acp.option.page_urls.description"><![CDATA[Enter further URLs which are also directed at your site.]]></item>
+ </category>
+ <category name="wcf.acp.package">
+ <item name="wcf.acp.package.cancel"><![CDATA[Cancel package installation]]></item>
+ <item name="wcf.acp.package.description"><![CDATA[Description]]></item>
+ <item name="wcf.acp.package.install"><![CDATA[Package Installation]]></item>
+ <item name="wcf.acp.package.install.cancel"><![CDATA[Cancel the installation]]></item>
+ <item name="wcf.acp.package.install.cancel.sure"><![CDATA[Are you sure you would like to cancel this installation?]]></item>
+ <item name="wcf.acp.package.install.error"><![CDATA[Package dependencies could not be satisfied for this Package.]]></item>
+ <item name="wcf.acp.package.install.error.excludedPackages"><![CDATA[The {if $action == 'install'}package installation{else}package update{/if} of package "{$packageName}" in version {$packageVersion} cannot be executed due to incompatibilities with the following {if $excludedPackages|count == 1}package{else}packages{/if}:]]></item>
+ <item name="wcf.acp.package.install.error.excludedPackages.excludedPackage"><![CDATA[{$excludedPackage.packageName}{if $excludedPackage.instanceNo > 1} (#{@$excludedPackage.instanceNo}){/if} in version {$excludedPackage.packageVersion}]]></item>
+ <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[{if $excludingPackages|count == 1}Following package doesn't{else}Following packages don't{/if} allow the {if $action == 'install'}package installation{else}package update{/if} of package "{$packageName}" in version {$packageVersion} due to incompatibilities:]]></item>
+ <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[{$excludingPackage.packageName}{if $excludingPackage.instanceNo > 1} (#{@$excludingPackage.instanceNo}){/if} in version {$excludingPackage.packageVersion}]]></item>
+ <item name="wcf.acp.package.install.error.excludingPackages.warning"><![CDATA[{if $excludingPackages|count == 1}Following package is{else}Following packages are{/if} incompatible with package "{$packageName}" in version {$packageVersion}. If you proceed installation the {if $excludingPackages|count == 1}package{else}packages{/if} probably won't work anymore.]]></item>
+
+ <item name="wcf.acp.package.install.packageName"><![CDATA[<span{if $package.open == 0} style="color: green"{else}{if !$package.file|isset} style="color: red"{/if}{/if}>{$package.name} ({if $package.open == 0}Installed{else}{if $package.file|isset}is located within this Package{else}Not available{/if}{/if})</span>]]></item>
+ <item name="wcf.acp.package.install.rollback.sure"><![CDATA[Are you sure you would like to cancel the installation of this package?]]></item>
+ <item name="wcf.acp.package.install.updatableInstances"><![CDATA[The following packages can be updated with this package]]></item>
+ <item name="wcf.acp.package.install.updatableInstances.description"><![CDATA[Select one of the following packages, in order to update its version. If you would like to install the package again, please click on "{lang}wcf.global.button.next{/lang}".]]></item>
+ <item name="wcf.acp.package.install.updatableInstances.warning"><![CDATA[A copy of this package is already installed. If you continue, a further copy of this package will be installed. If you would like to update an available copy of this package, please select the copy from the following list.]]></item>
+ <item name="wcf.acp.package.install.version"><![CDATA[Package Version:]]></item>
+ <item name="wcf.acp.package.installDate"><![CDATA[Installation date]]></item>
+ <item name="wcf.acp.package.installation.file.error.unknown"><![CDATA[While unpacking the files of this package the following error occured:]]></item>
+ <item name="wcf.acp.package.installation.file.error.untarFailed"><![CDATA[The following files could not be unpacked successfully. Please check if the destination folder is writable.]]></item>
+ <item name="wcf.acp.package.installation.tables.conflict"><![CDATA[Conflicting Tables]]></item>
+ <item name="wcf.acp.package.installation.tables.dontAskAgainKeep"><![CDATA[Do not overwrite these tables and do not ask me again for this installation.]]></item>
+ <item name="wcf.acp.package.installation.tables.dontAskAgainOverride"><![CDATA[Overwrite the existing tables and do not ask me again for this installation.]]></item>
+ <item name="wcf.acp.package.installation.tables.solution"><![CDATA[Required changes]]></item>
+ <item name="wcf.acp.package.installation.tables.tableName"><![CDATA[Tables affected]]></item>
+ <item name="wcf.acp.package.installation.tables.warning"><![CDATA[Existing database tables conflict with the tables required to be installed by this package. Please choose whether to overwrite these tables.]]></item>
+ <item name="wcf.acp.package.list"><![CDATA[Installed packages]]></item>
+ <item name="wcf.acp.package.list.author"><![CDATA[Author]]></item>
+ <item name="wcf.acp.package.list.count"><![CDATA[A total of {#$items} packages installed]]></item>
+ <item name="wcf.acp.package.list.date"><![CDATA[Date]]></item>
+ <item name="wcf.acp.package.list.id"><![CDATA[ID]]></item>
+ <item name="wcf.acp.package.list.name"><![CDATA[Name]]></item>
+ <item name="wcf.acp.package.list.other"><![CDATA[Package]]></item>
+ <item name="wcf.acp.package.list.plugin"><![CDATA[Plugin]]></item>
+ <item name="wcf.acp.package.list.standalone"><![CDATA[Standalone application]]></item>
+ <item name="wcf.acp.package.list.version"><![CDATA[Version]]></item>
+ <item name="wcf.acp.package.optionals"><![CDATA[Install optional packages]]></item>
+ <item name="wcf.acp.package.optionals.description"><![CDATA[The selected package brings the following options. Please select those you would like to install.]]></item>
+ <item name="wcf.acp.package.optionals.installed"><![CDATA[ (This Package is already installed.)]]></item>
+ <item name="wcf.acp.package.optionals.openRequirements"><![CDATA[ (The requirements of this Package have not been fulfilled.)]]></item>
+ <item name="wcf.acp.package.packageDir"><![CDATA[Installation folder]]></item>
+ <item name="wcf.acp.package.packageDir.description"><![CDATA[]]></item>
+ <item name="wcf.acp.package.packageDir.error.alreadyInstalled"><![CDATA[Another application is already installed in this folder.]]></item>
+ <item name="wcf.acp.package.packageDir.error.invalid"><![CDATA[This folder is not valid.]]></item>
+ <item name="wcf.acp.package.packageDir.error.notWritable"><![CDATA[This folder is not writable.]]></item>
+ <item name="wcf.acp.package.packageDir.error.wcfDirLocked"><![CDATA[This folder is already in use by the WoltLab Community Framework. Please choose a different location.]]></item>
+ <item name="wcf.acp.package.packageDir.input"><![CDATA[Please enter the installation folder name here.]]></item>
+ <item name="wcf.acp.package.packageDir.url"><![CDATA[This application is accessible through the following URL after installation in this folder:]]></item>
+ <item name="wcf.acp.package.requirements"><![CDATA[Select dependencies]]></item>
+ <item name="wcf.acp.package.requirements.description"><![CDATA[The current package requires another package that is already installed several times. Please choose the instance that is required.]]></item>
+ <item name="wcf.acp.package.rollback"><![CDATA[Rollback package installation]]></item>
+ <item name="wcf.acp.package.shortPackageInfo"><![CDATA[Version {$packageVersion} - {@$packageDate|date} - Copyright © {$packageAuthor}]]></item>
+ <item name="wcf.acp.package.startInstall"><![CDATA[Install new package]]></item>
+ <item name="wcf.acp.package.startInstall.error.noValidInstall"><![CDATA[The chosen package has no valid installation routine.]]></item>
+ <item name="wcf.acp.package.startInstall.error.noValidPackage"><![CDATA[The archive you have given is not a valid package.]]></item>
+ <item name="wcf.acp.package.startInstall.error.noValidUpdate"><![CDATA[The package "{$package->getName()}" could not be updated with the supplied archive.]]></item>
+ <item name="wcf.acp.package.startInstall.error.notFound"><![CDATA[No files were found within the specified directory.]]></item>
+ <item name="wcf.acp.package.startInstall.error.uniqueAlreadyInstalled"><![CDATA[The chosen package is already installed. Packages can not be installed more than one time.]]></item>
+ <item name="wcf.acp.package.startInstall.error.uploadFailed"><![CDATA[The upload of the chosen archive has failed.]]></item>
+ <item name="wcf.acp.package.startInstall.source"><![CDATA[Select package source]]></item>
+ <item name="wcf.acp.package.startInstall.source.download"><![CDATA[Enter the path of the package located on your server]]></item>
+ <item name="wcf.acp.package.startInstall.source.download.description"><![CDATA[Enter a direct path to the package-file here. An internet address can be used or alternatively the path to the package file using the server's file system.]]></item>
+ <item name="wcf.acp.package.startInstall.source.upload"><![CDATA[Upload package from your local computer]]></item>
+ <item name="wcf.acp.package.startInstall.source.upload.description"><![CDATA[Enter the package file to be uploaded from your computer here.]]></item>
+ <item name="wcf.acp.package.startUpdate"><![CDATA[Update Package "{$package->getName()}"]]></item>
+ <item name="wcf.acp.package.step.install.ACPMenuPackageInstallationPlugin"><![CDATA[Installing menu entries for the Administration Control Panel ...]]></item>
+ <item name="wcf.acp.package.step.install.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Installing template patches for the Administration Control Panel ...]]></item>
+ <item name="wcf.acp.package.step.install.ACPTemplatesPackageInstallationPlugin"><![CDATA[Installing templates for the Administration Control Panel ...]]></item>
+ <item name="wcf.acp.package.step.install.CronjobsPackageInstallationPlugin"><![CDATA[Installing cronjobs ...]]></item>
+ <item name="wcf.acp.package.step.install.EventListenerPackageInstallationPlugin"><![CDATA[Installing event listener ...]]></item>
+ <item name="wcf.acp.package.step.install.FilesPackageInstallationPlugin"><![CDATA[Unpacking package files ...]]></item>
+ <item name="wcf.acp.package.step.install.GroupOptionsPackageInstallationPlugin"><![CDATA[Installing user group options ...]]></item>
+ <item name="wcf.acp.package.step.install.LanguagesPackageInstallationPlugin"><![CDATA[Installing package languages ...]]></item>
+ <item name="wcf.acp.package.step.install.OptionsPackageInstallationPlugin"><![CDATA[Installing package options ...]]></item>
+ <item name="wcf.acp.package.step.install.ScriptPackageInstallationPlugin"><![CDATA[Executing special scripts ...]]></item>
+ <item name="wcf.acp.package.step.install.SqlPackageInstallationPlugin"><![CDATA[Installing database entries...]]></item>
+ <item name="wcf.acp.package.step.install.TemplatePatchPackageInstallationPlugin"><![CDATA[Installing template patches ...]]></item>
+ <item name="wcf.acp.package.step.install.TemplatesPackageInstallationPlugin"><![CDATA[Installing package templates ...]]></item>
+ <item name="wcf.acp.package.step.install.UserOptionsPackageInstallationPlugin"><![CDATA[Installing user profile fields ...]]></item>
+ <item name="wcf.acp.package.step.install.exclusions"><![CDATA[Checking for possible conflicts ...]]></item>
+ <item name="wcf.acp.package.step.install.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>
+ <item name="wcf.acp.package.step.install.finish"><![CDATA[Installation is complete]]></item>
+ <item name="wcf.acp.package.step.install.optionals"><![CDATA[Installing optional packages ...]]></item>
+ <item name="wcf.acp.package.step.install.package"><![CDATA[Registering package ...]]></item>
+ <item name="wcf.acp.package.step.install.packageInstallationPlugins"><![CDATA[Installing package plugins ...]]></item>
+ <item name="wcf.acp.package.step.install.parent"><![CDATA[Parent package allocation is being done ...]]></item>
+ <item name="wcf.acp.package.step.install.requirements"><![CDATA[Checking dependencies ...]]></item>
+ <item name="wcf.acp.package.step.title"><![CDATA[Package <b>{$packageName|encodeJS}</b>: ]]></item>
+ <item name="wcf.acp.package.step.uninstall.ACPMenuPackageInstallationPlugin"><![CDATA[Removing menu items from the Administration Control Panel ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Removing template patches of the Administration Control Panel ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.ACPTemplatesPackageInstallationPlugin"><![CDATA[Removing templates from the Administration Control Panel ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.CronjobsPackageInstallationPlugin"><![CDATA[Uninstalling cronjobs ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.EventListenerPackageInstallationPlugin"><![CDATA[Removing event listener ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.FilesPackageInstallationPlugin"><![CDATA[Removing package files ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.GroupOptionsPackageInstallationPlugin"><![CDATA[Removing user group options ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.LanguagesPackageInstallationPlugin"><![CDATA[Removing package languages ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.OptionsPackageInstallationPlugin"><![CDATA[Removing package options ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.SqlPackageInstallationPlugin"><![CDATA[Removing database entries...]]></item>
+ <item name="wcf.acp.package.step.uninstall.TemplatePatchPackageInstallationPlugin"><![CDATA[Removing template patches ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.TemplatesPackageInstallationPlugin"><![CDATA[Removing package templates ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.UserOptionsPackageInstallationPlugin"><![CDATA[Removing user profile fields ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.finish"><![CDATA[Package removal finished]]></item>
+ <item name="wcf.acp.package.step.uninstall.optionals"><![CDATA[Removing optional packages ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.packageInstallationPlugins"><![CDATA[Removing package plugins ...]]></item>
+ <item name="wcf.acp.package.step.uninstall.requirements"><![CDATA[Removing package requirements ...]]></item>
+ <item name="wcf.acp.package.step.update.ACPMenuPackageInstallationPlugin"><![CDATA[Updating menu items in the Administration Control Panel ...]]></item>
+ <item name="wcf.acp.package.step.update.ACPTemplatePatchPackageInstallationPlugin"><![CDATA[Updating template patches in the Administration Control Panel ...]]></item>
+ <item name="wcf.acp.package.step.update.ACPTemplatesPackageInstallationPlugin"><![CDATA[Updating templates in the Administration Control Panel ...]]></item>
+ <item name="wcf.acp.package.step.update.CronjobsPackageInstallationPlugin"><![CDATA[Updating cronjobs ...]]></item>
+ <item name="wcf.acp.package.step.update.EventListenerPackageInstallationPlugin"><![CDATA[Updating event listener ...]]></item>
+ <item name="wcf.acp.package.step.update.FilesPackageInstallationPlugin"><![CDATA[Unpacking package files ...]]></item>
+ <item name="wcf.acp.package.step.update.GroupOptionsPackageInstallationPlugin"><![CDATA[Updating user group options ...]]></item>
+ <item name="wcf.acp.package.step.update.LanguagesPackageInstallationPlugin"><![CDATA[Updating package languages ...]]></item>
+ <item name="wcf.acp.package.step.update.OptionsPackageInstallationPlugin"><![CDATA[Updating package options ...]]></item>
+ <item name="wcf.acp.package.step.update.ScriptPackageInstallationPlugin"><![CDATA[Executing special scripts ...]]></item>
+ <item name="wcf.acp.package.step.update.SqlPackageInstallationPlugin"><![CDATA[Updating database entries ...]]></item>
+ <item name="wcf.acp.package.step.update.TemplatePatchPackageInstallationPlugin"><![CDATA[Updating template patches ...]]></item>
+ <item name="wcf.acp.package.step.update.TemplatesPackageInstallationPlugin"><![CDATA[Updating package templates ...]]></item>
+ <item name="wcf.acp.package.step.update.UserOptionsPackageInstallationPlugin"><![CDATA[Updating user profile fields ...]]></item>
+ <item name="wcf.acp.package.step.update.execPackageInstallationPlugins"><![CDATA[Executing package plugins ...]]></item>
+ <item name="wcf.acp.package.step.update.exclusions"><![CDATA[Checking for possible conflicts ...]]></item>
+ <item name="wcf.acp.package.step.update.finish"><![CDATA[Package update finished]]></item>
+ <item name="wcf.acp.package.step.update.optionals"><![CDATA[Updating optional packages ...]]></item>
+ <item name="wcf.acp.package.step.update.package"><![CDATA[Updating package ...]]></item>
+ <item name="wcf.acp.package.step.update.packageInstallationPlugins"><![CDATA[Updating package plugins ...]]></item>
+ <item name="wcf.acp.package.step.update.parent"><![CDATA[Parent package allocation is being done ...]]></item>
+ <item name="wcf.acp.package.step.update.requirements"><![CDATA[Checking dependencies ...]]></item>
+ <item name="wcf.acp.package.templatePatch.install.failed"><![CDATA[The patch that this package is trying to apply has failed because this patch is not compliant to its target file. Therefore this package cannot be installed. Please click the "{lang}wcf.acp.package.install.cancel{/lang}" button.]]></item>
+ <item name="wcf.acp.package.templatePatch.repatch.failed"><![CDATA[Re-patching of the following templates has failed:<br />{foreach from=$failures item=$failure}{$failure.templateName} (Originally patched by: {$failure.packageName})<br />{/foreach}The original patch package that was previously applied may no longer function. You should still continue with this update by clicking on the "{lang}wcf.global.button.next{/lang}" button.]]></item>
+ <item name="wcf.acp.package.templatePatch.uninstall.failed"><![CDATA[The patch that this package is trying to remove has failed because its target file has been externally amended. Therefore this package cannot be removed. Please click the "{lang}wcf.acp.package.uninstall.cancel{/lang}" button.]]></item>
+ <item name="wcf.acp.package.uninstall"><![CDATA[Package removal]]></item>
+ <item name="wcf.acp.package.uninstall.cancel"><![CDATA[Cancel package-removal]]></item>
+ <item name="wcf.acp.package.uninstall.dependentPackages.error"><![CDATA[It is not possible to uninstall these packages, because there is at least one dependent package, that cannot be uninstalled.]]></item>
+ <item name="wcf.acp.package.uninstall.dependentPackages.warning"><![CDATA[Upon final confirmation {if $dependentPackages|count == 1}this package{else}these packages{/if} will be removed without any further promting.]]></item>
+ <item name="wcf.acp.package.update"><![CDATA[Package update]]></item>
+ <item name="wcf.acp.package.updateDate"><![CDATA[Date of update]]></item>
+ <item name="wcf.acp.package.view.author"><![CDATA[Author:]]></item>
+ <item name="wcf.acp.package.view.button.makeActive"><![CDATA[Go to the Administration Control Panel]]></item>
+ <item name="wcf.acp.package.view.button.uninstall"><![CDATA[Remove package]]></item>
+ <item name="wcf.acp.package.view.button.uninstall.all"><![CDATA[Remove all packages]]></item>
+ <item name="wcf.acp.package.view.button.uninstall.sure"><![CDATA[Are you sure that you would like to remove this package?]]></item>
+ <item name="wcf.acp.package.view.button.update"><![CDATA[Update package]]></item>
+ <item name="wcf.acp.package.view.date"><![CDATA[Date:]]></item>
+ <item name="wcf.acp.package.view.dependentPackages"><![CDATA[Dependent packages]]></item>
+ <item name="wcf.acp.package.view.dependentPackages.description"><![CDATA[This package has a requirement from {if $dependentPackages|count == 1}one other package.{else}{#$dependentPackages|count} other packages.{/if}]]></item>
+ <item name="wcf.acp.package.view.dependentPackages.uninstall.description"><![CDATA[{if $dependentPackages|count == 1}This package is required by one other Package{else}{#$dependentPackages|count} Packages are directly or indirectly dependent upon this package{/if}.]]></item>
+ <item name="wcf.acp.package.view.dir"><![CDATA[Installation folder:]]></item>
+ <item name="wcf.acp.package.view.identifier"><![CDATA[Identifier:]]></item>
+ <item name="wcf.acp.package.view.instanceNo"><![CDATA[Installed instance:]]></item>
+ <item name="wcf.acp.package.view.parent"><![CDATA[Parent package:]]></item>
+ <item name="wcf.acp.package.view.properties"><![CDATA[Properties]]></item>
+ <item name="wcf.acp.package.view.requiredPackages"><![CDATA[Required packages]]></item>
+ <item name="wcf.acp.package.view.requiredPackages.description"><![CDATA[This package has a requirement of {if $requiredPackages|count == 1}one other package.{else}{#$requiredPackages|count} other packages.{/if}]]></item>
+ <item name="wcf.acp.package.view.url"><![CDATA[Homepage:]]></item>
+ <item name="wcf.acp.package.view.version"><![CDATA[Installed version:]]></item>
+ </category>
+ <category name="wcf.acp.packageUpdate">
+ <item name="wcf.acp.packageUpdate"><![CDATA[Update packages]]></item>
+ <item name="wcf.acp.packageUpdate.auth"><![CDATA[Authentication with update server]]></item>
+ <item name="wcf.acp.packageUpdate.auth.data"><![CDATA[Connection data]]></item>
+ <item name="wcf.acp.packageUpdate.auth.error"><![CDATA[Username and password have not been accepted.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htPassword"><![CDATA[Password]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htPassword.description"><![CDATA[Please enter a valid password.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htUsername"><![CDATA[Username]]></item>
+ <item name="wcf.acp.packageUpdate.auth.htUsername.description"><![CDATA[Please enter a valid username.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.input"><![CDATA[User login]]></item>
+ <item name="wcf.acp.packageUpdate.auth.message"><![CDATA[Server message]]></item>
+ <item name="wcf.acp.packageUpdate.auth.realm"><![CDATA[Server name]]></item>
+ <item name="wcf.acp.packageUpdate.auth.save"><![CDATA[Save user data permanantly]]></item>
+ <item name="wcf.acp.packageUpdate.auth.save.description"><![CDATA[The entered user data will be saved permanently, so you do not have to input them again.]]></item>
+ <item name="wcf.acp.packageUpdate.auth.url"><![CDATA[Address]]></item>
+ <item name="wcf.acp.packageUpdate.currentVersion"><![CDATA[Installed version]]></item>
+ <item name="wcf.acp.packageUpdate.error"><![CDATA[An error occured: ]]></item>
+ <item name="wcf.acp.packageUpdate.error.downloadFailed"><![CDATA[The download of the package {$package} has been failed.]]></item>
+ <item name="wcf.acp.packageUpdate.error.listNotFound"><![CDATA[An error occured while trying to download the package list.]]></item>
+ <item name="wcf.acp.packageUpdate.excludedPackages"><![CDATA[The following {if $excludedPackages|count == 1}conflict{else}conflicts{/if} occured:]]></item>
+ <item name="wcf.acp.packageUpdate.excludedPackages.existingPackageExcludesNewPackage"><![CDATA[The installed package "{$excludedPackage.existingPackageName}" is incompatible with the package "{$excludedPackage.packageName}" in version {$excludedPackage.packageVersion}.]]></item>
+ <item name="wcf.acp.packageUpdate.excludedPackages.newPackageExcludesExistingPackage"><![CDATA[The package "{$excludedPackage.packageName}" in version {$excludedPackage.packageVersion} is not compatible with the installed package "{$excludedPackage.existingPackageName}".]]></item>
+ <item name="wcf.acp.packageUpdate.install"><![CDATA[{$package.packageName} {$package.packageVersion} will be installed]]></item>
+ <item name="wcf.acp.packageUpdate.noneAvailable"><![CDATA[There are currently no updates available.]]></item>
+ <item name="wcf.acp.packageUpdate.noneSelected"><![CDATA[You have not selected any update.]]></item>
+ <item name="wcf.acp.packageUpdate.options"><![CDATA[Options]]></item>
+ <item name="wcf.acp.packageUpdate.options.alreadyInstalledUnique"><![CDATA[This package is already installed and unique. Therefore it cannot be installed another time.]]></item>
+ <item name="wcf.acp.packageUpdate.options.install"><![CDATA[Install package]]></item>
+ <item name="wcf.acp.packageUpdate.options.installAlreadyInstalled"><![CDATA[Install another package instance (packages is already installed {#$package.instances} time{if $package.instances > 1}s{/if})]]></item>
+ <item name="wcf.acp.packageUpdate.options.update"><![CDATA[Update installed package {$updatableInstance.packageName}{if $updatableInstance.instanceNo > 1} (#{$updatableInstance.instanceNo}){/if} version {$updatableInstance.packageVersion}]]></item>
+ <item name="wcf.acp.packageUpdate.search"><![CDATA[Search packages]]></item>
+ <item name="wcf.acp.packageUpdate.search.author"><![CDATA[Author]]></item>
+ <item name="wcf.acp.packageUpdate.search.conditions"><![CDATA[Search for ...]]></item>
+ <item name="wcf.acp.packageUpdate.search.ignoreUniques"><![CDATA[Hide already installed unique packages]]></item>
+ <item name="wcf.acp.packageUpdate.search.packageName"><![CDATA[Package name]]></item>
+ <item name="wcf.acp.packageUpdate.search.searchDescription"><![CDATA[Package name and description]]></item>
+ <item name="wcf.acp.packageUpdate.search.server"><![CDATA[Update server]]></item>
+ <item name="wcf.acp.packageUpdate.search.server.all"><![CDATA[Search all update server]]></item>
+ <item name="wcf.acp.packageUpdate.search.type"><![CDATA[Type of package]]></item>
+ <item name="wcf.acp.packageUpdate.search.type.other"><![CDATA[Other packages]]></item>
+ <item name="wcf.acp.packageUpdate.search.type.plugin"><![CDATA[Plugin for already installed packages]]></item>
+ <item name="wcf.acp.packageUpdate.search.type.standalone"><![CDATA[Standalone application]]></item>
+ <item name="wcf.acp.packageUpdate.selectAll"><![CDATA[Select all packages]]></item>
+ <item name="wcf.acp.packageUpdate.update"><![CDATA[{$package.packageName}{if $package.instanceNo > 1} (#{#$package.instanceNo}){/if} {$package.fromversion} is updated to {$package.toVersion}]]></item>
+ <item name="wcf.acp.packageUpdate.updates"><![CDATA[The following package updates and installations will be processed:]]></item>
+ <item name="wcf.acp.packageUpdate.updateVersion"><![CDATA[New version]]></item>
+ </category>
+ <category name="wcf.acp.sessionLog">
+ <item name="wcf.acp.sessionLog.access.view"><![CDATA[Actions of the logged session of "{$sessionLog->username}"]]></item>
+ <item name="wcf.acp.sessionLog.access.view.count"><![CDATA[There is a total of {#$items} logged action{if $items != 1}s{/if}]]></item>
+ <item name="wcf.acp.sessionLog.accesses"><![CDATA[Actions]]></item>
+ <item name="wcf.acp.sessionLog.className"><![CDATA[Class name]]></item>
+ <item name="wcf.acp.sessionLog.ipAddress"><![CDATA[IP address]]></item>
+ <item name="wcf.acp.sessionLog.lastActivityTime"><![CDATA[Last action]]></item>
+ <item name="wcf.acp.sessionLog.packageName"><![CDATA[Package]]></item>
+ <item name="wcf.acp.sessionLog.requestMethod"><![CDATA[Method]]></item>
+ <item name="wcf.acp.sessionLog.requestURI"><![CDATA[URI]]></item>
+ <item name="wcf.acp.sessionLog.sessionAccessLogID"><![CDATA[ID]]></item>
+ <item name="wcf.acp.sessionLog.sessionLogID"><![CDATA[ID]]></item>
+ <item name="wcf.acp.sessionLog.time"><![CDATA[Date]]></item>
+ <item name="wcf.acp.sessionLog.userAgent"><![CDATA[User agent]]></item>
+ <item name="wcf.acp.sessionLog.view"><![CDATA[Logged sessions]]></item>
+ <item name="wcf.acp.sessionLog.view.count"><![CDATA[There is a total of {#$items} logged session{if $items != 1}s{/if}]]></item>
+ </category>
+ <category name="wcf.acp.updateServer">
+ <item name="wcf.acp.updateServer.add"><![CDATA[Add server]]></item>
+ <item name="wcf.acp.updateServer.add.success"><![CDATA[The server has been successfully added.]]></item>
+ <item name="wcf.acp.updateServer.data"><![CDATA[Server data]]></item>
+ <item name="wcf.acp.updateServer.delete"><![CDATA[Delete server]]></item>
+ <item name="wcf.acp.updateServer.delete.success"><![CDATA[The server has been successfully deleted.]]></item>
+ <item name="wcf.acp.updateServer.delete.sure"><![CDATA[Do you really want to delete this server?]]></item>
+ <item name="wcf.acp.updateServer.disable"><![CDATA[Disable]]></item>
+ <item name="wcf.acp.updateServer.edit"><![CDATA[Edit server]]></item>
+ <item name="wcf.acp.updateServer.edit.success"><![CDATA[Your changes have been successfully saved.]]></item>
+ <item name="wcf.acp.updateServer.enable"><![CDATA[Enable]]></item>
+ <item name="wcf.acp.updateServer.errorText"><![CDATA[Error messages]]></item>
+ <item name="wcf.acp.updateServer.htPassword"><![CDATA[Password]]></item>
+ <item name="wcf.acp.updateServer.htPassword.description"><![CDATA[Please enter a valid password (optional).]]></item>
+ <item name="wcf.acp.updateServer.htUsername"><![CDATA[Username]]></item>
+ <item name="wcf.acp.updateServer.htUsername.description"><![CDATA[Please enter a valid user name (optional).]]></item>
+ <item name="wcf.acp.updateServer.lastErrorText"><![CDATA[The following error occured while trying to connect:]]></item>
+ <item name="wcf.acp.updateServer.list.available"><![CDATA[{#$items} server available]]></item>
+ <item name="wcf.acp.updateServer.packageUpdateServerID"><![CDATA[Server id]]></item>
+ <item name="wcf.acp.updateServer.packages"><![CDATA[Packages]]></item>
+ <item name="wcf.acp.updateServer.server"><![CDATA[Address]]></item>
+ <item name="wcf.acp.updateServer.server.description"><![CDATA[Please enter the URL to a package server.]]></item>
+ <item name="wcf.acp.updateServer.server.error.notValid"><![CDATA[The entered address is invalid.]]></item>
+ <item name="wcf.acp.updateServer.status"><![CDATA[Status]]></item>
+ <item name="wcf.acp.updateServer.timestamp"><![CDATA[Last access]]></item>
+ <item name="wcf.acp.updateServer.view"><![CDATA[Available update server]]></item>
+ <item name="wcf.acp.updateServer.view.noneAvailable"><![CDATA[There are no update server available.]]></item>
+ </category>
+ <category name="wcf.acp.user">
+ <item name="wcf.acp.user.add"><![CDATA[Add new user]]></item>
+ <item name="wcf.acp.user.add.data"><![CDATA[User details]]></item>
+ <item name="wcf.acp.user.add.success"><![CDATA[The new user has been successfully saved.]]></item>
+ <item name="wcf.acp.user.assignToGroup"><![CDATA[Group assignment]]></item>
+ <item name="wcf.acp.user.assignToGroup.markedUsers"><![CDATA[Assign the following users to the selected group(s)]]></item>
+ <item name="wcf.acp.user.assignToGroup.success"><![CDATA[The users have been successfully assigned to your chosen groups.]]></item>
+ <item name="wcf.acp.user.button.assignGroup"><![CDATA[Group assignment]]></item>
+ <item name="wcf.acp.user.button.exportMail"><![CDATA[Export e-mail addresses]]></item>
+ <item name="wcf.acp.user.button.sendMail"><![CDATA[Send an e-mail]]></item>
+ <item name="wcf.acp.user.delete"><![CDATA[Delete user(s)]]></item>
+ <item name="wcf.acp.user.delete.error"><![CDATA[No user could be deleted.]]></item>
+ <item name="wcf.acp.user.delete.success"><![CDATA[{if $deletedUsers == 1}The user has {else}{#$deletedUsers} users have{/if} been successfully deleted.]]></item>
+ <item name="wcf.acp.user.delete.sure"><![CDATA[Are you sure that you would like to delete this user?]]></item>
+ <item name="wcf.acp.user.deleteMarked.sure"><![CDATA[Are you sure that you would like to delete the selected User(s)?]]></item>
+ <item name="wcf.acp.user.edit"><![CDATA[Edit user]]></item>
+ <item name="wcf.acp.user.edit.success"><![CDATA[The changes for this user have been successfully saved.]]></item>
+ <item name="wcf.acp.user.edit.warning.selfEdit"><![CDATA[You are currently editing your own user account. Changing the permissions of this user group might lead to locking yourself out of the Administration Control Panel. Please be careful!]]></item>
+ <item name="wcf.acp.user.exportEmailAddress"><![CDATA[Export e-mail addresses]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.fileType"><![CDATA[Export file format]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.fileType.csv"><![CDATA[CSV (<em>Character Separated Values</em>)]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.fileType.xml"><![CDATA[XML (<em>Extensible Markup Language</em>)]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.format"><![CDATA[Export options]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.markedUsers"><![CDATA[Export the e-mail addresses from the following users]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.separator"><![CDATA[Separate the addresses with a ]]></item>
+ <item name="wcf.acp.user.exportEmailAddress.textSeparator"><![CDATA[Enclose the addresses with ]]></item>
+ <item name="wcf.acp.user.groups"><![CDATA[Group memberships]]></item>
+ <item name="wcf.acp.user.groups.invertSearch"><![CDATA[Find users that are not members of the chosen user groups.]]></item>
+ <item name="wcf.acp.user.list"><![CDATA[Users]]></item>
+ <item name="wcf.acp.user.list.all"><![CDATA[All users]]></item>
+ <item name="wcf.acp.user.list.count"><![CDATA[A total of {#$items} user{if $items > 1}s{/if}]]></item>
+ <item name="wcf.acp.user.markedUsers"><![CDATA[this.count == 1 ? "1 user selected" : this.count+" users selected"]]></item>
+ <item name="wcf.acp.user.massProcessing"><![CDATA[Bulk processing of users]]></item>
+ <item name="wcf.acp.user.massProcessing.action"><![CDATA[Action]]></item>
+ <item name="wcf.acp.user.massProcessing.conditions"><![CDATA[Conditions]]></item>
+ <item name="wcf.acp.user.massProcessing.success"><![CDATA[The chosen action has been executed successfully on {#$affectedUsers} users.]]></item>
+ <item name="wcf.acp.user.massProcessing.warning"><![CDATA[The bulk processor will perform the following tasks <strong>without additional security notification</strong>, on all users matching the set conditions. Bulk processing can be very performance intensive, so it should only be executed when the forum is offline. To have a correct display of your content you should update the counters. The processing can not be reversed, so please be attentive when using this function.]]></item>
+ <item name="wcf.acp.user.search"><![CDATA[Search for users]]></item>
+ <item name="wcf.acp.user.search.conditions"><![CDATA[Search criteria]]></item>
+ <item name="wcf.acp.user.search.conditions.general"><![CDATA[General search criteria]]></item>
+ <item name="wcf.acp.user.search.conditions.profile"><![CDATA[Profile search criteria]]></item>
+ <item name="wcf.acp.user.search.display"><![CDATA[Display]]></item>
+ <item name="wcf.acp.user.search.display.columns"><![CDATA[Columns]]></item>
+ <item name="wcf.acp.user.search.display.columns.other"><![CDATA[Other]]></item>
+ <item name="wcf.acp.user.search.display.columns.profile"><![CDATA[Profile]]></item>
+ <item name="wcf.acp.user.search.display.general"><![CDATA[General]]></item>
+ <item name="wcf.acp.user.search.display.itemsPerPage"><![CDATA[Users per page]]></item>
+ <item name="wcf.acp.user.search.display.sort"><![CDATA[Sorting]]></item>
+ <item name="wcf.acp.user.search.error.noMatches"><![CDATA[No users have been found.]]></item>
+ <item name="wcf.acp.user.search.matches"><![CDATA[Your search produced {if $items == 1}one result{else}{#$items} results{/if}]]></item>
+ <item name="wcf.acp.user.search.withinResults"><![CDATA[Search within results]]></item>
+ <item name="wcf.acp.user.sendMail"><![CDATA[Send an e-mail]]></item>
+ <item name="wcf.acp.user.sendMail.all"><![CDATA[E-Mail all Users]]></item>
+ <item name="wcf.acp.user.sendMail.enableHTML"><![CDATA[Send e-mail as HTML]]></item>
+ <item name="wcf.acp.user.sendMail.from"><![CDATA[Sender]]></item>
+ <item name="wcf.acp.user.sendMail.from.description"><![CDATA[<p>Here you can enter the sender's e-mail address in the following format:</p>
+<p style="text-align: center; line-height: 2em;"><code>{if MAIL_USE_FORMATTED_ADDRESS}Senders name <email@sender.tld>{else}email@sender.tld{/if}</code></p>
+<p>If you have completely filled in the section under System -> Options -> E-mail, then this field will automatically be filled in. If you are sending e-mails using SMTP, then the sender's e-mail-Address must also be accepted by the server.</p>]]></item>
+ <item name="wcf.acp.user.sendMail.group"><![CDATA[E-mail all group members]]></item>
+ <item name="wcf.acp.user.sendMail.groups"><![CDATA[Send an e-mail to the members of the following user groups:]]></item>
+ <item name="wcf.acp.user.sendMail.mail"><![CDATA[E-mail]]></item>
+ <item name="wcf.acp.user.sendMail.markedUsers"><![CDATA[Send an e-mail to the following users]]></item>
+ <item name="wcf.acp.user.sendMail.subject"><![CDATA[Subject]]></item>
+ <item name="wcf.acp.user.sendMail.subject.description"><![CDATA[Enter here the e-mail subject.]]></item>
+ <item name="wcf.acp.user.sendMail.text"><![CDATA[Message]]></item>
+ <item name="wcf.acp.user.sendMail.text.description"><![CDATA[Enter here the message you want to send to users.]]></item>
+ <item name="wcf.acp.user.userNote"><![CDATA[Welcome {$this->user->username}.]]></item>
+ </category>
+ <category name="wcf.acp.worker">
+ <item name="wcf.acp.worker.currentStep"><![CDATA[Current process]]></item>
+ <item name="wcf.acp.worker.description"><![CDATA[Please leave this browser window open until the process has successfully completed. Do NOT try to login to your administrations area using a separate browser window, as doing so may damage the current process.]]></item>
+ <item name="wcf.acp.worker.progress.finish"><![CDATA[Process completed successfully]]></item>
+ <item name="wcf.acp.worker.progress.working"><![CDATA[Processing ...]]></item>
+ <item name="wcf.acp.worker.progressBar"><![CDATA[{@$progress}% complete]]></item>
+ <item name="wcf.acp.worker.title"><![CDATA[Processing ...]]></item>
+ </category>
+ <category name="wcf.global">
+ <item name="wcf.global.button.back"><![CDATA[« Back]]></item>
+ <item name="wcf.global.button.close"><![CDATA[Close]]></item>
+ <item name="wcf.global.button.collapse"><![CDATA[Collapse]]></item>
+ <item name="wcf.global.button.collapsible"><![CDATA[Expand or collapse]]></item>
+ <item name="wcf.global.button.delete"><![CDATA[Delete]]></item>
+ <item name="wcf.global.button.delete.confirm"><![CDATA[Do you really want to delete this item?]]></item>
+ <item name="wcf.global.button.deleteCompletely"><![CDATA[Delete completely]]></item>
+ <item name="wcf.global.button.edit"><![CDATA[Edit]]></item>
+ <item name="wcf.global.button.editor.jump"><![CDATA[Use full editor]]></item>
+ <item name="wcf.global.button.expand"><![CDATA[Expand]]></item>
+ <item name="wcf.global.button.mark"><![CDATA[Select]]></item>
+ <item name="wcf.global.button.next"><![CDATA[Next »]]></item>
+ <item name="wcf.global.button.preview"><![CDATA[Preview]]></item>
+ <item name="wcf.global.button.reset"><![CDATA[Reset]]></item>
+ <item name="wcf.global.button.submit"><![CDATA[Submit]]></item>
+ <item name="wcf.global.button.unmark"><![CDATA[Unselect]]></item>
+ <item name="wcf.global.date.day"><![CDATA[Day]]></item>
+ <item name="wcf.global.date.days"><![CDATA[Days]]></item>
+ <item name="wcf.global.date.hour"><![CDATA[Hour]]></item>
+ <item name="wcf.global.date.hours"><![CDATA[Hours]]></item>
+ <item name="wcf.global.date.minute"><![CDATA[Minute]]></item>
+ <item name="wcf.global.date.minutes"><![CDATA[Minutes]]></item>
+ <item name="wcf.global.date.month"><![CDATA[Month]]></item>
+ <item name="wcf.global.date.months"><![CDATA[Months]]></item>
+ <item name="wcf.global.date.second"><![CDATA[Second]]></item>
+ <item name="wcf.global.date.seconds"><![CDATA[Seconds]]></item>
+ <item name="wcf.global.date.week"><![CDATA[Week]]></item>
+ <item name="wcf.global.date.weeks"><![CDATA[Weeks]]></item>
+ <item name="wcf.global.date.year"><![CDATA[Year]]></item>
+ <item name="wcf.global.date.year.notRequired"><![CDATA[Specifying the year is optional.]]></item>
+ <item name="wcf.global.date.years"><![CDATA[Years]]></item>
+ <item name="wcf.global.dateFormat"><![CDATA[M jS Y]]></item>
+ <item name="wcf.global.dateFormatToday"><![CDATA[<b>\T\o\d\a\y</b>, g:ia]]></item>
+ <item name="wcf.global.dateFormatYesterday"><![CDATA[\Y\e\s\t\e\r\d\a\y, g:ia]]></item>
+ <item name="wcf.global.dateInputOrder"><![CDATA[month-day-year]]></item> <!-- system variable; do not translate -->
+ <item name="wcf.global.dateMethod"><![CDATA[date]]></item> <!-- system variable; do not translate -->
+ <item name="wcf.global.decimalPoint"><![CDATA[.]]></item>
+ <item name="wcf.global.defaultValue"><![CDATA[Default]]></item>
+ <item name="wcf.global.error.backward"><![CDATA[Back to last page]]></item>
+ <item name="wcf.global.error.empty"><![CDATA[Please enter the required information for this field.]]></item>
+ <item name="wcf.global.error.file.notFound"><![CDATA[The file could not be found.]]></item>
+ <item name="wcf.global.error.illegalLink"><![CDATA[The link you are trying to reach is no longer available or is invalid.]]></item>
+ <item name="wcf.global.error.permissionDenied"><![CDATA[You are not allowed to enter this page. You do not have the required permissions to enter this page.]]></item>
+ <item name="wcf.global.error.permissionDenied.title"><![CDATA[You are not allowed to enter this page.]]></item>
+ <item name="wcf.global.error.title"><![CDATA[Error message]]></item>
+ <item name="wcf.global.form.error"><![CDATA[The data you have entered are invalid. Please check the information you have given in the marked fields.]]></item>
+ <item name="wcf.global.language.ar"><![CDATA[Arabic]]></item>
+ <item name="wcf.global.language.bs"><![CDATA[Bosnian]]></item>
+ <item name="wcf.global.language.cs"><![CDATA[Czech]]></item>
+ <item name="wcf.global.language.da"><![CDATA[Danish]]></item>
+ <item name="wcf.global.language.de"><![CDATA[German]]></item>
+ <item name="wcf.global.language.de-informal"><![CDATA[German (Informal)]]></item>
+ <item name="wcf.global.language.el"><![CDATA[Greek]]></item>
+ <item name="wcf.global.language.en"><![CDATA[English]]></item>
+ <item name="wcf.global.language.es"><![CDATA[Spanish]]></item>
+ <item name="wcf.global.language.fa"><![CDATA[Persian (Farsi)]]></item>
+ <item name="wcf.global.language.fi"><![CDATA[Finnish]]></item>
+ <item name="wcf.global.language.fr"><![CDATA[French]]></item>
+ <item name="wcf.global.language.he"><![CDATA[Hebrew]]></item>
+ <item name="wcf.global.language.hr"><![CDATA[Croatian]]></item>
+ <item name="wcf.global.language.hu"><![CDATA[Hungarian]]></item>
+ <item name="wcf.global.language.it"><![CDATA[Italian]]></item>
+ <item name="wcf.global.language.ja"><![CDATA[Japanese]]></item>
+ <item name="wcf.global.language.ko"><![CDATA[Korean]]></item>
+ <item name="wcf.global.language.nl"><![CDATA[Dutch]]></item>
+ <item name="wcf.global.language.no"><![CDATA[Norwegian]]></item>
+ <item name="wcf.global.language.pl"><![CDATA[Polish]]></item>
+ <item name="wcf.global.language.pt"><![CDATA[Portuguese]]></item>
+ <item name="wcf.global.language.pt-BR"><![CDATA[Portuguese (Brazil)]]></item>
+ <item name="wcf.global.language.ro"><![CDATA[Romanian]]></item>
+ <item name="wcf.global.language.ru"><![CDATA[Russian]]></item>
+ <item name="wcf.global.language.sk"><![CDATA[Slovak]]></item>
+ <item name="wcf.global.language.sr"><![CDATA[Serbian]]></item>
+ <item name="wcf.global.language.sv"><![CDATA[Swedish]]></item>
+ <item name="wcf.global.language.th"><![CDATA[Thai]]></item>
+ <item name="wcf.global.language.tr"><![CDATA[Turkish]]></item>
+ <item name="wcf.global.language.zh-CN"><![CDATA[Chinese (Simplified)]]></item>
+ <item name="wcf.global.language.zh-TW"><![CDATA[Chinese (Traditional)]]></item>
+ <item name="wcf.global.locale.unix"><![CDATA[en_US]]></item> <!-- system variable; do not translate -->
+ <item name="wcf.global.locale.win"><![CDATA[english]]></item> <!-- system variable; do not translate -->
+ <item name="wcf.global.multiSelect"><![CDATA[Multiple items can be selected by holding the "Ctrl/Shift" key (Windows) or "Command" (Mac OS) key and clicking the items required.]]></item>
+ <item name="wcf.global.page.input"><![CDATA[Go to next page]]></item>
+ <item name="wcf.global.page.next"><![CDATA[Next page]]></item>
+ <item name="wcf.global.page.previous"><![CDATA[Previous page]]></item>
+ <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item> <!-- system variable; do not translate -->
+ <item name="wcf.global.pageTitle"><![CDATA[WoltLab® Community Framework™]]></item>
+ <item name="wcf.global.redirect.title"><![CDATA[Redirection]]></item>
+ <item name="wcf.global.redirect.url"><![CDATA[Please click here if the automatic redirection does not work!]]></item>
+ <item name="wcf.global.scrollDown"><![CDATA[Go to page bottom]]></item>
+ <item name="wcf.global.scrollUp"><![CDATA[Go to page end]]></item>
+ <item name="wcf.global.search.matchesExactly"><![CDATA[Exact match]]></item>
+ <item name="wcf.global.shortTimeFormat"><![CDATA[M jS Y, g:ia]]></item>
+ <item name="wcf.global.skipToContent"><![CDATA[Skip navigation]]></item>
+ <item name="wcf.global.sortOrder.ascending"><![CDATA[ascending]]></item>
+ <item name="wcf.global.sortOrder.descending"><![CDATA[descending]]></item>
+ <item name="wcf.global.thousandsSeparator"><![CDATA[,]]></item>
+ <item name="wcf.global.timeFormat"><![CDATA[l, F jS Y, g:ia]]></item>
+ </category>
+ <category name="wcf.imageViewer">
+ <item name="wcf.imageViewer.caption"><![CDATA[this.links.length > 1 ? "Image " + (this.currentIndex + 1) + " of " + this.links.length + (this.currentLink.title ? (" - " + this.currentLink.title) : "") : (this.currentLink.title ? this.currentLink.title : "")]]></item>
+ <item name="wcf.imageViewer.close"><![CDATA[Close]]></item>
+ <item name="wcf.imageViewer.enlarge"><![CDATA[Show only this image (quits the image viewer)]]></item>
+ <item name="wcf.imageViewer.next"><![CDATA[Next image]]></item>
+ <item name="wcf.imageViewer.pause"><![CDATA[Stop slideshow]]></item>
+ <item name="wcf.imageViewer.play"><![CDATA[Start slideshow (changes the image every 5 seconds)]]></item>
+ <item name="wcf.imageViewer.previous"><![CDATA[Previous image]]></item>
+ </category>
+ <category name="wcf.option">
+ <item name="wcf.option.timezone.utc"><![CDATA[(UTC) Belfast, Casablanca, Dublin, Edinburgh, Canary Islands, Lisbon, London, Monrovia, Ouagadougou, Reykjavík]]></item>
+ <item name="wcf.option.timezone.utc+01:00"><![CDATA[(UTC+01:00) Amsterdam, Berlin, Bern, Brussels, Copenhagen, Madrid, Paris, Prague, Rome, Sarajevo, Stockholm, Tunis, Warsaw, Vienna]]></item>
+ <item name="wcf.option.timezone.utc+02:00"><![CDATA[(UTC+02:00) Athens, Beirut, Bucharest, Helsinki, Istanbul, Jerusalem, Cairo, Cape Town, Khartoum, Kiev, Minsk, Sofia]]></item>
+ <item name="wcf.option.timezone.utc+03:00"><![CDATA[(UTC+03:00) Addis Ababa, Antananarivo, Baghdad, Dodoma, Kampala, Kuwait City, Mogadishu, Moscow, Nairobi, Riyadh]]></item>
+ <item name="wcf.option.timezone.utc+03:30"><![CDATA[(UTC+03:30) Tehran]]></item>
+ <item name="wcf.option.timezone.utc+04:00"><![CDATA[(UTC+04:00) Abu Dhabi, Baku, Dubai, Yerevan, Muscat, Réunion, Tbilisi]]></item>
+ <item name="wcf.option.timezone.utc+04:30"><![CDATA[(UTC+04:30) Kabul]]></item>
+ <item name="wcf.option.timezone.utc+05:00"><![CDATA[(UTC+05:00) Ashgabat, Bishkek, Dushanbe, Islamabad, Yekaterinburg, Karachi, Maldive Islands, Tashkent]]></item>
+ <item name="wcf.option.timezone.utc+05:30"><![CDATA[(UTC+05:30) Chennai, Colombo, Kolkata, Mumbai, New Delhi]]></item>
+ <item name="wcf.option.timezone.utc+05:45"><![CDATA[(UTC+05:45) Kathmandu]]></item>
+ <item name="wcf.option.timezone.utc+06:00"><![CDATA[(UTC+06:00) Almaty, Astana, Dhaka, Novosibirsk]]></item>
+ <item name="wcf.option.timezone.utc+06:30"><![CDATA[(UTC+06:30) Cocos (Keeling) Islands, Yangon]]></item>
+ <item name="wcf.option.timezone.utc+07:00"><![CDATA[(UTC+07:00) Bangkok, Hanoi, Jakarta, Phnom Penh, Krasnoyarsk, Vientiane]]></item>
+ <item name="wcf.option.timezone.utc+08:00"><![CDATA[(UTC+08:00) Hong Kong, Irkutsk, Kuala Lumpur, Manila, Beijing, Perth, Singapore, Taipei, Ulaanbaatar]]></item>
+ <item name="wcf.option.timezone.utc+08:45"><![CDATA[(UTC+08:45) Eucla (Western Australia)]]></item>
+ <item name="wcf.option.timezone.utc+09:00"><![CDATA[(UTC+09:00) Dili, Yakutsk, Osaka, Pyongyang, Sapporo, Seoul, Tokyo]]></item>
+ <item name="wcf.option.timezone.utc+09:30"><![CDATA[(UTC+09:30) Adelaide, Darwin]]></item>
+ <item name="wcf.option.timezone.utc+10:00"><![CDATA[(UTC+10:00) Brisbane, Canberra, Guam, Hobart, Melbourne, Port Moresby, Sydney, Vladivostok]]></item>
+ <item name="wcf.option.timezone.utc+10:30"><![CDATA[(UTC+10:30) Lord Howe Island (Australia)]]></item>
+ <item name="wcf.option.timezone.utc+11:00"><![CDATA[(UTC+11:00) Magadan, New Caledonia, Solomon Islands]]></item>
+ <item name="wcf.option.timezone.utc+11:30"><![CDATA[(UTC+11:30) Norfolk Island]]></item>
+ <item name="wcf.option.timezone.utc+12:00"><![CDATA[(UTC+12:00) Auckland, South Tarawa, Fiji, Kamchatka, Marshall Islands, Wellington]]></item>
+ <item name="wcf.option.timezone.utc+12:45"><![CDATA[(UTC+12:45) Chatham Islands (New Zealand)]]></item>
+ <item name="wcf.option.timezone.utc+13:00"><![CDATA[(UTC+13:00) Nuku'alofa, Phoenix Islands]]></item>
+ <item name="wcf.option.timezone.utc+14:00"><![CDATA[(UTC+14:00) Line Islands, Christmas Island]]></item>
+ <item name="wcf.option.timezone.utc-01:00"><![CDATA[(UTC-01:00) Azores, Cape Verde Islands]]></item>
+ <item name="wcf.option.timezone.utc-02:00"><![CDATA[(UTC-02:00) Mid-Atlantic]]></item>
+ <item name="wcf.option.timezone.utc-03:00"><![CDATA[(UTC-03:00) Brasília, Buenos Aires, Cayenne, Georgetown, Greenland, Montevideo]]></item>
+ <item name="wcf.option.timezone.utc-03:30"><![CDATA[(UTC-03:30) Newfoundland]]></item>
+ <item name="wcf.option.timezone.utc-04:00"><![CDATA[(UTC-04:00) Atlantic Time (Canada), Asunción, La Paz, Port-of-Spain, Santiago]]></item>
+ <item name="wcf.option.timezone.utc-04:30"><![CDATA[(UTC-04:30) Caracas]]></item>
+ <item name="wcf.option.timezone.utc-05:00"><![CDATA[(UTC-05:00) Eastern Time (US & Canada), Bogotá, Lima, San Francisco de Quito]]></item>
+ <item name="wcf.option.timezone.utc-06:00"><![CDATA[(UTC-06:00) Central Time (US & Canada), Central America, Mexico City]]></item>
+ <item name="wcf.option.timezone.utc-07:00"><![CDATA[(UTC-07:00) Mountain Time (US & Canada), Chihuahua, Mazatlan]]></item>
+ <item name="wcf.option.timezone.utc-08:00"><![CDATA[(UTC-08:00) Pacific Time (US & Canada), Tijuana]]></item>
+ <item name="wcf.option.timezone.utc-09:00"><![CDATA[(UTC-09:00) Anchorage (Alaska)]]></item>
+ <item name="wcf.option.timezone.utc-09:30"><![CDATA[(UTC-09:30) French Polynesia]]></item>
+ <item name="wcf.option.timezone.utc-10:00"><![CDATA[(UTC-10:00) Cook Islands, Hawaii]]></item>
+ <item name="wcf.option.timezone.utc-11:00"><![CDATA[(UTC-11:00) Midway Islands, Samoa]]></item>
+ <item name="wcf.option.timezone.utc-12:00"><![CDATA[(UTC-12:00) Enewetak, Kwajalein]]></item>
+ </category>
+ <category name="wcf.page">
+ <item name="wcf.page.pageNo"><![CDATA[Page {#$pageNo}]]></item>
+ </category>
+ <category name="wcf.user">
+ <item name="wcf.user.confirmEmail"><![CDATA[Confirm E-mail Address]]></item>
+ <item name="wcf.user.confirmPassword"><![CDATA[Confirm password]]></item>
+ <item name="wcf.user.email"><![CDATA[E-mail Address]]></item>
+ <item name="wcf.user.error.confirmEmail.notEqual"><![CDATA[The given e-mail address and confirmation e-mail address are not identical.]]></item>
+ <item name="wcf.user.error.confirmPassword.notEqual"><![CDATA[The given password and confirmation password are not identical.]]></item>
+ <item name="wcf.user.error.email.notUnique"><![CDATA[The e-mail address you have entered has already been used by another user.]]></item>
+ <item name="wcf.user.error.email.notValid"><![CDATA[The e-mail address you have entered is not valid.]]></item>
+ <item name="wcf.user.error.password.false"><![CDATA[The password is not correct.]]></item>
+ <item name="wcf.user.error.username.notFound"><![CDATA[The user name "{$username}" could not be found.]]></item>
+ <item name="wcf.user.error.username.notUnique"><![CDATA[The user name you have entered is already in use.]]></item>
+ <item name="wcf.user.error.username.notValid"><![CDATA[The username you have entered is not valid.]]></item>
+ <item name="wcf.user.language"><![CDATA[Language]]></item>
+ <item name="wcf.user.language.description"><![CDATA[Please select the user interface language to be shown in!]]></item>
+ <item name="wcf.user.logout"><![CDATA[Logout]]></item>
+ <item name="wcf.user.password"><![CDATA[Password]]></item>
+ <item name="wcf.user.registrationDate"><![CDATA[Date of registration]]></item>
+ <item name="wcf.user.userID"><![CDATA[User ID]]></item>
+ <item name="wcf.user.username"><![CDATA[Username]]></item>
+ <item name="wcf.user.visibleLanguages"><![CDATA[Show content in the following languages]]></item>
+ <item name="wcf.user.visibleLanguages.description"><![CDATA[Select the content languages that should be shown here.]]></item>
+ </category>
+ <category name="wcf.user.option">
+ <item name="wcf.user.option.error.validationFailed"><![CDATA[The information you have entered is not valid.]]></item>
+ </category>
+</language>
-/**** tables ****/\r
-DROP TABLE IF EXISTS wcf1_acp_menu_item;\r
-CREATE TABLE wcf1_acp_menu_item (\r
- menuItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- menuItem VARCHAR(255) NOT NULL DEFAULT '',\r
- parentMenuItem VARCHAR(255) NOT NULL DEFAULT '',\r
- menuItemLink VARCHAR(255) NOT NULL DEFAULT '',\r
- showOrder INT(10) NOT NULL DEFAULT 0,\r
- permissions TEXT,\r
- options TEXT,\r
- UNIQUE KEY menuItem (menuItem, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_session;\r
-CREATE TABLE wcf1_acp_session (\r
- sessionID CHAR(40) NOT NULL PRIMARY KEY,\r
- packageID INT(10),\r
- userID INT(10),\r
- ipAddress VARCHAR(39) NOT NULL DEFAULT '',\r
- userAgent VARCHAR(255) NOT NULL DEFAULT '',\r
- lastActivityTime INT(10) NOT NULL DEFAULT 0,\r
- requestURI VARCHAR(255) NOT NULL DEFAULT '',\r
- requestMethod VARCHAR(4) NOT NULL DEFAULT '',\r
- username VARCHAR(255) NOT NULL DEFAULT '',\r
- KEY sessionID (sessionID, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_session_data;\r
-CREATE TABLE wcf1_acp_session_data (\r
- sessionID CHAR(40) NOT NULL PRIMARY KEY,\r
- sessionVariables MEDIUMTEXT\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_session_access_log;\r
-CREATE TABLE wcf1_acp_session_access_log (\r
- sessionAccessLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- sessionLogID INT(10) NOT NULL,\r
- packageID INT(10),\r
- ipAddress VARCHAR(39) NOT NULL DEFAULT '',\r
- time INT(10) NOT NULL DEFAULT 0,\r
- requestURI VARCHAR(255) NOT NULL DEFAULT '',\r
- requestMethod VARCHAR(4) NOT NULL DEFAULT '',\r
- className VARCHAR(255) NOT NULL DEFAULT '',\r
- KEY sessionLogID (sessionLogID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_session_log;\r
-CREATE TABLE wcf1_acp_session_log (\r
- sessionLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- sessionID CHAR(40) NOT NULL DEFAULT '',\r
- userID INT(10),\r
- ipAddress VARCHAR(39) NOT NULL DEFAULT '',\r
- hostname VARCHAR(255) NOT NULL DEFAULT '',\r
- userAgent VARCHAR(255) NOT NULL DEFAULT '',\r
- time INT(10) NOT NULL DEFAULT 0,\r
- lastActivityTime INT(10) NOT NULL DEFAULT 0,\r
- KEY sessionID (sessionID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_acp_template;\r
-CREATE TABLE wcf1_acp_template (\r
- templateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10),\r
- templateName VARCHAR(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY (packageID, templateName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_application;\r
-CREATE TABLE wcf1_application (\r
- packageID INT(10) NOT NULL PRIMARY KEY,\r
- domainName VARCHAR(255) NOT NULL,\r
- domainPath VARCHAR(255) NOT NULL DEFAULT '/',\r
- groupID INT(10),\r
- isPrimary TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_application_group;\r
-CREATE TABLE wcf1_application_group (\r
- groupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- groupName VARCHAR(255) NOT NULL\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cache_resource;\r
-CREATE TABLE wcf1_cache_resource (\r
- cacheResource VARCHAR(255) NOT NULL PRIMARY KEY\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cleanup_listener;\r
-CREATE TABLE wcf1_cleanup_listener (\r
- listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- className VARCHAR(255) NOT NULL DEFAULT '',\r
- objectType VARCHAR(255) NOT NULL DEFAULT '',\r
- lastUpdateTime INT(10) NOT NULL DEFAULT 0,\r
- UNIQUE KEY (className, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cleanup_log;\r
-CREATE TABLE wcf1_cleanup_log (\r
- packageID INT(10) NOT NULL DEFAULT 0,\r
- objectType VARCHAR(255) NOT NULL DEFAULT '',\r
- objectID INT(10) NOT NULL DEFAULT 0,\r
- deleteTime INT(10) NOT NULL DEFAULT 0,\r
- KEY objectType (objectType)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_core_object;\r
-CREATE TABLE wcf1_core_object (\r
- objectID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- objectName VARCHAR(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY object (packageID, objectName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cronjob;\r
-CREATE TABLE wcf1_cronjob (\r
- cronjobID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- className varchar(255) NOT NULL DEFAULT '',\r
- packageID INT(10) NOT NULL,\r
- description varchar(255) NOT NULL DEFAULT '',\r
- startMinute varchar(255) NOT NULL DEFAULT '*',\r
- startHour varchar(255) NOT NULL DEFAULT '*',\r
- startDom varchar(255) NOT NULL DEFAULT '*',\r
- startMonth varchar(255) NOT NULL DEFAULT '*',\r
- startDow varchar(255) NOT NULL DEFAULT '*',\r
- lastExec INT(10) NOT NULL DEFAULT 0,\r
- nextExec INT(10) NOT NULL DEFAULT 0,\r
- afterNextExec INT(10) NOT NULL DEFAULT 0,\r
- active TINYINT NOT NULL DEFAULT 1,\r
- canBeEdited TINYINT NOT NULL DEFAULT 1,\r
- canBeDisabled TINYINT NOT NULL DEFAULT 1,\r
- state TINYINT(1) NOT NULL DEFAULT 1,\r
- failCount TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_cronjob_log;\r
-CREATE TABLE wcf1_cronjob_log (\r
- cronjobLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- cronjobID INT(10) NOT NULL,\r
- execTime INT(10) NOT NULL DEFAULT 0,\r
- success TINYINT NOT NULL DEFAULT 0,\r
- error TEXT\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_event_listener;\r
-CREATE TABLE wcf1_event_listener (\r
- listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- eventClassName VARCHAR(80) NOT NULL DEFAULT '',\r
- eventName VARCHAR(50) NOT NULL DEFAULT '',\r
- listenerClassName VARCHAR(200) NOT NULL DEFAULT '',\r
- inherit TINYINT(1) NOT NULL DEFAULT 0,\r
- niceValue TINYINT(3) NOT NULL DEFAULT 0,\r
- UNIQUE KEY packageID (packageID, eventClassName, eventName, listenerClassName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language;\r
-CREATE TABLE wcf1_language (\r
- languageID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- languageCode VARCHAR(20) NOT NULL DEFAULT '',\r
- isDefault TINYINT(1) NOT NULL DEFAULT 0,\r
- hasContent TINYINT(1) NOT NULL DEFAULT 0,\r
- UNIQUE KEY languageCode (languageCode)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language_category;\r
-CREATE TABLE wcf1_language_category (\r
- languageCategoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- languageCategory VARCHAR(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY languageCategory (languageCategory)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language_item;\r
-CREATE TABLE wcf1_language_item (\r
- languageItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- languageID INT(10) NOT NULL,\r
- languageItem VARCHAR(255) NOT NULL DEFAULT '',\r
- languageItemValue MEDIUMTEXT NOT NULL,\r
- languageCustomItemValue MEDIUMTEXT,\r
- languageUseCustomValue TINYINT(1) NOT NULL DEFAULT 0,\r
- languageItemOriginIsSystem TINYINT(1) NOT NULL DEFAULT 1,\r
- languageCategoryID INT(10) NOT NULL,\r
- packageID INT(10),\r
- UNIQUE KEY languageItem (languageItem, packageID, languageID),\r
- KEY languageItemOriginIsSystem (languageItemOriginIsSystem)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language_server;\r
-CREATE TABLE wcf1_language_server (\r
- languageServerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- serverURL VARCHAR(255) NOT NULL DEFAULT '',\r
- disabled TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_language_to_package;\r
-CREATE TABLE wcf1_language_to_package (\r
- languageID INT(10) NOT NULL,\r
- packageID INT(10),\r
- UNIQUE KEY languageID (languageID, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_option;\r
-CREATE TABLE wcf1_option (\r
- optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- optionName VARCHAR(255) NOT NULL DEFAULT '',\r
- categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
- optionType VARCHAR(255) NOT NULL DEFAULT '',\r
- optionValue MEDIUMTEXT,\r
- validationPattern TEXT,\r
- selectOptions MEDIUMTEXT,\r
- enableOptions MEDIUMTEXT,\r
- showOrder INT(10) NOT NULL DEFAULT 0,\r
- hidden TINYINT(1) NOT NULL DEFAULT 0,\r
- permissions TEXT,\r
- options TEXT,\r
- additionalData MEDIUMTEXT,\r
- UNIQUE KEY optionName (optionName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_option_category;\r
-CREATE TABLE wcf1_option_category (\r
- categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
- parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',\r
- showOrder INT(10) NOT NULL DEFAULT 0,\r
- permissions TEXT,\r
- options TEXT,\r
- UNIQUE KEY categoryName (categoryName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package;\r
-CREATE TABLE wcf1_package (\r
- packageID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- package VARCHAR(255) NOT NULL DEFAULT '',\r
- packageDir VARCHAR(255) NOT NULL DEFAULT '',\r
- packageName VARCHAR(255) NOT NULL DEFAULT '',\r
- instanceName VARCHAR(255) NOT NULL DEFAULT '',\r
- instanceNo INT(10) NOT NULL DEFAULT 1,\r
- packageDescription VARCHAR(255) NOT NULL DEFAULT '',\r
- packageVersion VARCHAR(255) NOT NULL DEFAULT '',\r
- packageDate INT(10) NOT NULL DEFAULT 0,\r
- installDate INT(10) NOT NULL DEFAULT 0,\r
- updateDate INT(10) NOT NULL DEFAULT 0,\r
- packageURL VARCHAR(255) NOT NULL DEFAULT '',\r
- parentPackageID INT(10) NOT NULL DEFAULT 0,\r
- isUnique TINYINT(1) NOT NULL DEFAULT 0,\r
- standalone TINYINT(1) NOT NULL DEFAULT 0,\r
- author VARCHAR(255) NOT NULL DEFAULT '',\r
- authorURL VARCHAR(255) NOT NULL DEFAULT '',\r
- KEY package (package)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_dependency;\r
-CREATE TABLE wcf1_package_dependency (\r
- packageID INT(10) NOT NULL,\r
- dependency INT(10) NOT NULL,\r
- priority INT(10) NOT NULL DEFAULT 0,\r
- UNIQUE KEY packageID (packageID, dependency)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_exclusion;\r
-CREATE TABLE wcf1_package_exclusion (\r
- packageID INT(10) NOT NULL,\r
- excludedPackage VARCHAR(255) NOT NULL DEFAULT '',\r
- excludedPackageVersion VARCHAR(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY packageID (packageID, excludedPackage)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_file_log;\r
-CREATE TABLE wcf1_package_installation_file_log (\r
- packageID INT(10),\r
- filename VARCHAR(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY packageID (packageID, filename)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_form;\r
-CREATE TABLE wcf1_package_installation_form (\r
- queueID INT(10) NOT NULL,\r
- formName VARCHAR(80) NOT NULL DEFAULT '',\r
- document TEXT NOT NULL,\r
- UNIQUE KEY formDocument (queueID, formName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_node;\r
-CREATE TABLE wcf1_package_installation_node (\r
- queueID INT(10) NOT NULL,\r
- processNo INT(10) NOT NULL DEFAULT 0,\r
- sequenceNo SMALLINT(4) NOT NULL DEFAULT 0,\r
- node CHAR(8) NOT NULL DEFAULT '',\r
- parentNode CHAR(8) NOT NULL DEFAULT '',\r
- nodeType ENUM('package', 'pip') NOT NULL DEFAULT 'package',\r
- nodeData TEXT NOT NULL,\r
- done TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_plugin;\r
-CREATE TABLE wcf1_package_installation_plugin (\r
- pluginName VARCHAR(255) NOT NULL PRIMARY KEY,\r
- packageID INT(10),\r
- priority TINYINT(1) NOT NULL DEFAULT 0,\r
- className VARCHAR(255) NOT NULL\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_queue;\r
-CREATE TABLE wcf1_package_installation_queue (\r
- queueID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- parentQueueID INT(10) NOT NULL DEFAULT 0,\r
- processNo INT(10) NOT NULL DEFAULT 0,\r
- userID INT(10) NOT NULL,\r
- package VARCHAR(255) NOT NULL DEFAULT '',\r
- packageName VARCHAR(255) NOT NULL DEFAULT '',\r
- packageID INT(10),\r
- archive VARCHAR(255) NOT NULL DEFAULT '',\r
- action ENUM('install', 'update', 'uninstall', 'rollback') NOT NULL DEFAULT 'install',\r
- cancelable TINYINT(1) NOT NULL DEFAULT 1,\r
- done TINYINT(1) NOT NULL DEFAULT 0,\r
- confirmInstallation TINYINT(1) NOT NULL DEFAULT 0,\r
- packageType ENUM('default', 'requirement', 'optional') NOT NULL DEFAULT 'default'\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_installation_sql_log;\r
-CREATE TABLE wcf1_package_installation_sql_log ( \r
- packageID INT(10), \r
- sqlTable VARCHAR(100) NOT NULL DEFAULT '', \r
- sqlColumn VARCHAR(100) NOT NULL DEFAULT '', \r
- sqlIndex VARCHAR(100) NOT NULL DEFAULT '',\r
- UNIQUE KEY packageID (packageID, sqlTable, sqlColumn, sqlIndex) \r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_requirement;\r
-CREATE TABLE wcf1_package_requirement (\r
- packageID INT(10) NOT NULL,\r
- requirement INT(10) NOT NULL,\r
- UNIQUE KEY packageID (packageID, requirement)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_requirement_map;\r
-CREATE TABLE wcf1_package_requirement_map (\r
- packageID INT(10) NOT NULL,\r
- requirement INT(10) NOT NULL,\r
- level INT(10) NOT NULL DEFAULT 0,\r
- UNIQUE KEY packageID (packageID, requirement)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update;\r
-CREATE TABLE wcf1_package_update (\r
- packageUpdateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageUpdateServerID INT(10) NOT NULL,\r
- package VARCHAR(255) NOT NULL DEFAULT '',\r
- packageName VARCHAR(255) NOT NULL DEFAULT '',\r
- packageDescription VARCHAR(255) NOT NULL DEFAULT '',\r
- author VARCHAR(255) NOT NULL DEFAULT '',\r
- authorURL VARCHAR(255) NOT NULL DEFAULT '',\r
- standalone TINYINT(1) NOT NULL DEFAULT 0,\r
- plugin VARCHAR(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY packageUpdateServerID (packageUpdateServerID, package)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_exclusion;\r
-CREATE TABLE wcf1_package_update_exclusion (\r
- packageUpdateVersionID INT(10) NOT NULL,\r
- excludedPackage VARCHAR(255) NOT NULL DEFAULT '',\r
- excludedPackageVersion VARCHAR(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, excludedPackage)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_fromversion;\r
-CREATE TABLE wcf1_package_update_fromversion (\r
- packageUpdateVersionID INT(10) NOT NULL DEFAULT 0,\r
- fromversion VARCHAR(50) NOT NULL DEFAULT '',\r
- UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, fromversion)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_requirement;\r
-CREATE TABLE wcf1_package_update_requirement (\r
- packageUpdateVersionID INT(10) NOT NULL,\r
- package VARCHAR(255) NOT NULL DEFAULT '',\r
- minversion VARCHAR(50) NOT NULL DEFAULT '',\r
- UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, package)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_server;\r
-CREATE TABLE wcf1_package_update_server (\r
- packageUpdateServerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- serverURL VARCHAR(255) NOT NULL DEFAULT '',\r
- loginUsername VARCHAR(255) NOT NULL DEFAULT '',\r
- loginPassword VARCHAR(255) NOT NULL DEFAULT '',\r
- disabled TINYINT(1) NOT NULL DEFAULT 0,\r
- lastUpdateTime INT(10) NOT NULL DEFAULT 0,\r
- status ENUM('online', 'offline') NOT NULL DEFAULT 'online',\r
- errorMessage TEXT\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_package_update_version;\r
-CREATE TABLE wcf1_package_update_version (\r
- packageUpdateVersionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageUpdateID INT(10) NOT NULL,\r
- packageVersion VARCHAR(50) NOT NULL DEFAULT '',\r
- updateType VARCHAR(10) NOT NULL DEFAULT '',\r
- packageDate INT(10) NOT NULL DEFAULT 0,\r
- filename VARCHAR(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY packageUpdateID (packageUpdateID, packageVersion)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_page_location;\r
-CREATE TABLE wcf1_page_location (\r
- locationID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- locationPattern VARCHAR(255) NOT NULL DEFAULT '',\r
- locationName VARCHAR(255) NOT NULL DEFAULT '',\r
- packageID INT(10) NOT NULL,\r
- className varchar(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY (packageID, locationName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_page_menu_item;\r
-CREATE TABLE wcf1_page_menu_item (\r
- menuItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- menuItem VARCHAR(255) NOT NULL DEFAULT '',\r
- parentMenuItem VARCHAR(255) NOT NULL DEFAULT '',\r
- menuItemLink VARCHAR(255) NOT NULL DEFAULT '',\r
- menuPosition ENUM('header', 'footer') NOT NULL DEFAULT 'header',\r
- showOrder INT(10) NOT NULL DEFAULT 0,\r
- permissions TEXT NULL,\r
- options TEXT NULL,\r
- isDisabled TINYINT(1) NOT NULL DEFAULT 0,\r
- className VARCHAR(255) NOT NULL DEFAULT '',\r
- UNIQUE KEY (packageID, menuItem)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_search;\r
-CREATE TABLE wcf1_search (\r
- searchID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- userID INT(10),\r
- searchData MEDIUMTEXT NOT NULL,\r
- searchTime INT(10) NOT NULL DEFAULT 0,\r
- searchType VARCHAR(255) NOT NULL DEFAULT '',\r
- searchHash CHAR(40) NOT NULL DEFAULT '',\r
- KEY searchHash (searchHash)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_session;\r
-CREATE TABLE wcf1_session (\r
- sessionID CHAR(40) NOT NULL PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- userID INT(10),\r
- ipAddress VARCHAR(39) NOT NULL DEFAULT '',\r
- userAgent VARCHAR(255) NOT NULL DEFAULT '',\r
- lastActivityTime INT(10) NOT NULL DEFAULT 0,\r
- requestURI VARCHAR(255) NOT NULL DEFAULT '',\r
- requestMethod VARCHAR(4) NOT NULL DEFAULT '',\r
- username VARCHAR(255) NOT NULL DEFAULT '',\r
- spiderID INT(10) NOT NULL DEFAULT 0,\r
- KEY packageID (packageID, lastActivityTime, spiderID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_session_data;\r
-CREATE TABLE wcf1_session_data (\r
- sessionID CHAR(40) NOT NULL PRIMARY KEY,\r
- sessionVariables MEDIUMTEXT\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_spider;\r
-CREATE TABLE wcf1_spider (\r
- spiderID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- spiderIdentifier VARCHAR(255) DEFAULT '',\r
- spiderName VARCHAR(255) DEFAULT '',\r
- spiderURL VARCHAR(255) DEFAULT '',\r
- UNIQUE KEY spiderIdentifier (spiderIdentifier)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_style;\r
-CREATE TABLE wcf1_style (\r
- styleID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- styleName VARCHAR(255) NOT NULL DEFAULT '',\r
- templateGroupID INT(10) NOT NULL DEFAULT 0,\r
- isDefault TINYINT(1) NOT NULL DEFAULT 0,\r
- disabled TINYINT(1) NOT NULL DEFAULT 0,\r
- styleDescription TEXT,\r
- styleVersion VARCHAR(255) NOT NULL DEFAULT '',\r
- styleDate CHAR(10) NOT NULL DEFAULT '0000-00-00',\r
- image VARCHAR(255) NOT NULL DEFAULT '',\r
- copyright VARCHAR(255) NOT NULL DEFAULT '',\r
- license VARCHAR(255) NOT NULL DEFAULT '',\r
- authorName VARCHAR(255) NOT NULL DEFAULT '',\r
- authorURL VARCHAR(255) NOT NULL DEFAULT ''\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_style_to_package;\r
-CREATE TABLE wcf1_style_to_package (\r
- styleID INT(10) NOT NULL,\r
- packageID INT(10) NOT NULL,\r
- isDefault TINYINT(1) NOT NULL DEFAULT 0,\r
- disabled TINYINT(1) NOT NULL DEFAULT 0,\r
- UNIQUE KEY (styleID, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_style_variable;\r
-CREATE TABLE wcf1_style_variable (\r
- styleID INT(10) NOT NULL,\r
- variableName VARCHAR(50) NOT NULL DEFAULT '',\r
- variableValue MEDIUMTEXT,\r
- UNIQUE KEY (styleID, variableName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_style_variable_to_attribute;\r
-CREATE TABLE wcf1_style_variable_to_attribute (\r
- packageID INT(10) NOT NULL,\r
- cssSelector VARCHAR(200) NOT NULL DEFAULT '',\r
- attributeName VARCHAR(50) NOT NULL DEFAULT '',\r
- variableName VARCHAR(50) NOT NULL DEFAULT '',\r
- UNIQUE KEY (packageID, cssSelector, attributeName, variableName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_template;\r
-CREATE TABLE wcf1_template (\r
- templateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- templateName VARCHAR(255) NOT NULL DEFAULT '',\r
- templateGroupID INT(10),\r
- obsolete TINYINT(1) NOT NULL DEFAULT 0,\r
- KEY packageID (packageID, templateName),\r
- KEY templateGroupID (packageID, templateGroupID, templateName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_template_group;\r
-CREATE TABLE wcf1_template_group (\r
- templateGroupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- parentTemplateGroupID INT(10) NOT NULL DEFAULT 0,\r
- templateGroupName VARCHAR(255) NOT NULL DEFAULT '',\r
- templateGroupFolderName VARCHAR(255) NOT NULL DEFAULT ''\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user;\r
-CREATE TABLE wcf1_user (\r
- userID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- username VARCHAR(255) NOT NULL DEFAULT '',\r
- email VARCHAR(255) NOT NULL DEFAULT '',\r
- password VARCHAR(40) NOT NULL DEFAULT '',\r
- salt VARCHAR(40) NOT NULL DEFAULT '',\r
- languageID INT(10) NOT NULL DEFAULT 0,\r
- registrationDate INT(10) NOT NULL DEFAULT 0,\r
- styleID INT(10) NOT NULL DEFAULT 0,\r
- \r
- KEY username (username),\r
- KEY registrationDate (registrationDate),\r
- KEY styleID (styleID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_group;\r
-CREATE TABLE wcf1_user_group (\r
- groupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- groupName VARCHAR(255) NOT NULL DEFAULT '',\r
- groupType TINYINT(1) NOT NULL DEFAULT 0\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_group_option;\r
-CREATE TABLE wcf1_user_group_option (\r
- optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10),\r
- optionName VARCHAR(255) NOT NULL DEFAULT '',\r
- categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
- optionType VARCHAR(255) NOT NULL DEFAULT '',\r
- defaultValue MEDIUMTEXT,\r
- adminDefaultValue MEDIUMTEXT,\r
- validationPattern TEXT,\r
- enableOptions MEDIUMTEXT,\r
- showOrder INT(10) NOT NULL DEFAULT 0,\r
- permissions TEXT,\r
- options TEXT,\r
- additionalData MEDIUMTEXT,\r
- UNIQUE KEY optionName (optionName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_group_option_category;\r
-CREATE TABLE wcf1_user_group_option_category (\r
- categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
- parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',\r
- showOrder INT(10) NOT NULL DEFAULT 0,\r
- permissions TEXT,\r
- options TEXT,\r
- UNIQUE KEY categoryName (categoryName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_group_option_value;\r
-CREATE TABLE wcf1_user_group_option_value (\r
- groupID INT(10) NOT NULL,\r
- optionID INT(10) NOT NULL,\r
- optionValue MEDIUMTEXT NOT NULL,\r
- UNIQUE KEY groupID (groupID, optionID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_option;\r
-CREATE TABLE wcf1_user_option (\r
- optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- optionName VARCHAR(255) NOT NULL DEFAULT '',\r
- categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
- optionType VARCHAR(255) NOT NULL DEFAULT '',\r
- defaultValue MEDIUMTEXT,\r
- validationPattern TEXT,\r
- selectOptions MEDIUMTEXT,\r
- enableOptions MEDIUMTEXT,\r
- required TINYINT(1) NOT NULL DEFAULT 0,\r
- askDuringRegistration TINYINT(1) NOT NULL DEFAULT 0,\r
- editable TINYINT(1) NOT NULL DEFAULT 0, \r
- visible TINYINT(1) NOT NULL DEFAULT 0, \r
- outputClass VARCHAR(255) NOT NULL DEFAULT '',\r
- searchable TINYINT(1) NOT NULL DEFAULT 0,\r
- showOrder INT(10) NOT NULL DEFAULT 0,\r
- disabled TINYINT(1) NOT NULL DEFAULT 0,\r
- permissions TEXT,\r
- options TEXT,\r
- additionalData MEDIUMTEXT,\r
- UNIQUE KEY optionName (optionName, packageID),\r
- KEY categoryName (categoryName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_option_category;\r
-CREATE TABLE wcf1_user_option_category (\r
- categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- categoryName VARCHAR(255) NOT NULL DEFAULT '',\r
- categoryIconS VARCHAR(255) NOT NULL DEFAULT '',\r
- categoryIconM VARCHAR(255) NOT NULL DEFAULT '',\r
- parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',\r
- showOrder INT(10) NOT NULL DEFAULT 0,\r
- permissions TEXT,\r
- options TEXT,\r
- UNIQUE KEY categoryName (categoryName, packageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_option_value;\r
-CREATE TABLE wcf1_user_option_value (\r
- userID INT(10) NOT NULL PRIMARY KEY\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_to_group;\r
-CREATE TABLE wcf1_user_to_group (\r
- userID INT(10) NOT NULL,\r
- groupID INT(10) NOT NULL,\r
- UNIQUE KEY userID (userID, groupID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_user_to_language;\r
-CREATE TABLE wcf1_user_to_language (\r
- userID INT(10) NOT NULL,\r
- languageID INT(10) NOT NULL,\r
- UNIQUE KEY userID (userID, languageID)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_template_listener;\r
-CREATE TABLE wcf1_template_listener (\r
- listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,\r
- packageID INT(10) NOT NULL,\r
- name VARCHAR(80) NOT NULL DEFAULT '',\r
- environment ENUM('user','admin') NOT NULL DEFAULT 'user',\r
- templateName VARCHAR(80) NOT NULL DEFAULT '',\r
- eventName VARCHAR(50) NOT NULL DEFAULT '',\r
- templateCode TEXT NOT NULL,\r
- KEY templateName (environment, templateName)\r
-);\r
-\r
-DROP TABLE IF EXISTS wcf1_storage;\r
-CREATE TABLE wcf1_storage (\r
- userID INT(10) NOT NULL,\r
- field VARCHAR(80) NOT NULL DEFAULT '',\r
- fieldValue TEXT,\r
- packageID INT(10),\r
- UNIQUE KEY storageData (userID, field, packageID)\r
-);\r
-\r
-/**** foreign keys ****/\r
-ALTER TABLE wcf1_acp_menu_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_acp_session ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_acp_session ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_acp_session_access_log ADD FOREIGN KEY (sessionLogID) REFERENCES wcf1_acp_session_log (sessionLogID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_acp_session_access_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE SET NULL;\r
-\r
-ALTER TABLE wcf1_acp_session_data ADD FOREIGN KEY (sessionID) REFERENCES wcf1_acp_session (sessionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_acp_session_log ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE SET NULL;\r
-\r
-ALTER TABLE wcf1_acp_template ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_application ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_application ADD FOREIGN KEY (groupID) REFERENCES wcf1_application_group (groupID) ON DELETE SET NULL;\r
-\r
-ALTER TABLE wcf1_cleanup_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_cleanup_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_core_object ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_cronjob ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_cronjob_log ADD FOREIGN KEY (cronjobID) REFERENCES wcf1_cronjob (cronjobID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_event_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_language_item ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_language_item ADD FOREIGN KEY (languageCategoryID) REFERENCES wcf1_language_category (languageCategoryID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_language_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_language_to_package ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_language_to_package ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_dependency ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_package_dependency ADD FOREIGN KEY (dependency) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_exclusion ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_file_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_form ADD FOREIGN KEY (queueID) REFERENCES wcf1_package_installation_queue (queueID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_node ADD FOREIGN KEY (queueID) REFERENCES wcf1_package_installation_queue (queueID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_plugin ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_installation_queue ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_package_installation_queue ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE SET NULL;\r
-\r
-ALTER TABLE wcf1_package_installation_sql_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_requirement ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_package_requirement ADD FOREIGN KEY (requirement) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_requirement_map ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_package_requirement_map ADD FOREIGN KEY (requirement) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update ADD FOREIGN KEY (packageUpdateServerID) REFERENCES wcf1_package_update_server (packageUpdateServerID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update_exclusion ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update_fromversion ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update_requirement ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_package_update_version ADD FOREIGN KEY (packageUpdateID) REFERENCES wcf1_package_update (packageUpdateID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_page_location ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_page_menu_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_search ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_session ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_session ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_session_data ADD FOREIGN KEY (sessionID) REFERENCES wcf1_session (sessionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_storage ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_storage ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_style ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_style_to_package ADD FOREIGN KEY (styleID) REFERENCES wcf1_style (styleID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_style_to_package ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_style_variable ADD FOREIGN KEY (styleID) REFERENCES wcf1_style (styleID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_style_variable_to_attribute ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_template ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_template ADD FOREIGN KEY (templateGroupID) REFERENCES wcf1_template_group (templateGroupID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_template_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_group_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_group_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_group_option_value ADD FOREIGN KEY (groupID) REFERENCES wcf1_user_group (groupID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_user_group_option_value ADD FOREIGN KEY (optionID) REFERENCES wcf1_user_group_option (optionID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_option_value ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_to_group ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_user_to_group ADD FOREIGN KEY (groupID) REFERENCES wcf1_user_group (groupID) ON DELETE CASCADE;\r
-\r
-ALTER TABLE wcf1_user_to_language ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;\r
-ALTER TABLE wcf1_user_to_language ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;\r
-\r
-/**** default inserts ****/\r
--- default user groups\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Everyone', 1);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Guests', 2);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Users', 3);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Administrators', 4);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Moderators', 4);\r
-INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Super Moderators', 4);\r
- \r
--- default user group options\r
-INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.general.canUseAcp', 'admin.general', 'boolean', '0', '1', 1);\r
-INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.system.package.canInstallPackage', 'admin.system.package', 'boolean', '0', '1', 1);\r
-INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.user.canEditGroup', 'admin.user.group', 'boolean', '0', '1', 1);\r
-\r
--- default user group option values\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 1, '0'); -- Everyone\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 2, '0'); -- Everyone\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 3, '0'); -- Everyone\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 1, '1'); -- Administrators\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 2, '1'); -- Administrators\r
-INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 3, '1'); -- Administrators\r
- \r
--- default update servers\r
-INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://update.woltlab.com/tempest/', 'online', 0, NULL, 0, '', '');\r
-INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://update.woltlab.com/maelstrom/', 'online', 0, NULL, 0, '', '');\r
-INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://store.woltlab.com/tempest/', 'online', 0, NULL, 0, '', '');\r
-INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://store.woltlab.com/maelstrom/', 'online', 0, NULL, 0, '', '');\r
+/**** tables ****/
+DROP TABLE IF EXISTS wcf1_acp_menu_item;
+CREATE TABLE wcf1_acp_menu_item (
+ menuItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ menuItem VARCHAR(255) NOT NULL DEFAULT '',
+ parentMenuItem VARCHAR(255) NOT NULL DEFAULT '',
+ menuItemLink VARCHAR(255) NOT NULL DEFAULT '',
+ showOrder INT(10) NOT NULL DEFAULT 0,
+ permissions TEXT,
+ options TEXT,
+ UNIQUE KEY menuItem (menuItem, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_acp_session;
+CREATE TABLE wcf1_acp_session (
+ sessionID CHAR(40) NOT NULL PRIMARY KEY,
+ packageID INT(10),
+ userID INT(10),
+ ipAddress VARCHAR(39) NOT NULL DEFAULT '',
+ userAgent VARCHAR(255) NOT NULL DEFAULT '',
+ lastActivityTime INT(10) NOT NULL DEFAULT 0,
+ requestURI VARCHAR(255) NOT NULL DEFAULT '',
+ requestMethod VARCHAR(4) NOT NULL DEFAULT '',
+ username VARCHAR(255) NOT NULL DEFAULT '',
+ KEY sessionID (sessionID, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_acp_session_data;
+CREATE TABLE wcf1_acp_session_data (
+ sessionID CHAR(40) NOT NULL PRIMARY KEY,
+ sessionVariables MEDIUMTEXT
+);
+
+DROP TABLE IF EXISTS wcf1_acp_session_access_log;
+CREATE TABLE wcf1_acp_session_access_log (
+ sessionAccessLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ sessionLogID INT(10) NOT NULL,
+ packageID INT(10),
+ ipAddress VARCHAR(39) NOT NULL DEFAULT '',
+ time INT(10) NOT NULL DEFAULT 0,
+ requestURI VARCHAR(255) NOT NULL DEFAULT '',
+ requestMethod VARCHAR(4) NOT NULL DEFAULT '',
+ className VARCHAR(255) NOT NULL DEFAULT '',
+ KEY sessionLogID (sessionLogID)
+);
+
+DROP TABLE IF EXISTS wcf1_acp_session_log;
+CREATE TABLE wcf1_acp_session_log (
+ sessionLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ sessionID CHAR(40) NOT NULL DEFAULT '',
+ userID INT(10),
+ ipAddress VARCHAR(39) NOT NULL DEFAULT '',
+ hostname VARCHAR(255) NOT NULL DEFAULT '',
+ userAgent VARCHAR(255) NOT NULL DEFAULT '',
+ time INT(10) NOT NULL DEFAULT 0,
+ lastActivityTime INT(10) NOT NULL DEFAULT 0,
+ KEY sessionID (sessionID)
+);
+
+DROP TABLE IF EXISTS wcf1_acp_template;
+CREATE TABLE wcf1_acp_template (
+ templateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10),
+ templateName VARCHAR(255) NOT NULL DEFAULT '',
+ UNIQUE KEY (packageID, templateName)
+);
+
+DROP TABLE IF EXISTS wcf1_application;
+CREATE TABLE wcf1_application (
+ packageID INT(10) NOT NULL PRIMARY KEY,
+ domainName VARCHAR(255) NOT NULL,
+ domainPath VARCHAR(255) NOT NULL DEFAULT '/',
+ groupID INT(10),
+ isPrimary TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_application_group;
+CREATE TABLE wcf1_application_group (
+ groupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ groupName VARCHAR(255) NOT NULL
+);
+
+DROP TABLE IF EXISTS wcf1_cache_resource;
+CREATE TABLE wcf1_cache_resource (
+ cacheResource VARCHAR(255) NOT NULL PRIMARY KEY
+);
+
+DROP TABLE IF EXISTS wcf1_cleanup_listener;
+CREATE TABLE wcf1_cleanup_listener (
+ listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ className VARCHAR(255) NOT NULL DEFAULT '',
+ objectType VARCHAR(255) NOT NULL DEFAULT '',
+ lastUpdateTime INT(10) NOT NULL DEFAULT 0,
+ UNIQUE KEY (className, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_cleanup_log;
+CREATE TABLE wcf1_cleanup_log (
+ packageID INT(10) NOT NULL DEFAULT 0,
+ objectType VARCHAR(255) NOT NULL DEFAULT '',
+ objectID INT(10) NOT NULL DEFAULT 0,
+ deleteTime INT(10) NOT NULL DEFAULT 0,
+ KEY objectType (objectType)
+);
+
+DROP TABLE IF EXISTS wcf1_core_object;
+CREATE TABLE wcf1_core_object (
+ objectID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ objectName VARCHAR(255) NOT NULL DEFAULT '',
+ UNIQUE KEY object (packageID, objectName)
+);
+
+DROP TABLE IF EXISTS wcf1_cronjob;
+CREATE TABLE wcf1_cronjob (
+ cronjobID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ className varchar(255) NOT NULL DEFAULT '',
+ packageID INT(10) NOT NULL,
+ description varchar(255) NOT NULL DEFAULT '',
+ startMinute varchar(255) NOT NULL DEFAULT '*',
+ startHour varchar(255) NOT NULL DEFAULT '*',
+ startDom varchar(255) NOT NULL DEFAULT '*',
+ startMonth varchar(255) NOT NULL DEFAULT '*',
+ startDow varchar(255) NOT NULL DEFAULT '*',
+ lastExec INT(10) NOT NULL DEFAULT 0,
+ nextExec INT(10) NOT NULL DEFAULT 0,
+ afterNextExec INT(10) NOT NULL DEFAULT 0,
+ active TINYINT NOT NULL DEFAULT 1,
+ canBeEdited TINYINT NOT NULL DEFAULT 1,
+ canBeDisabled TINYINT NOT NULL DEFAULT 1,
+ state TINYINT(1) NOT NULL DEFAULT 1,
+ failCount TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_cronjob_log;
+CREATE TABLE wcf1_cronjob_log (
+ cronjobLogID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ cronjobID INT(10) NOT NULL,
+ execTime INT(10) NOT NULL DEFAULT 0,
+ success TINYINT NOT NULL DEFAULT 0,
+ error TEXT
+);
+
+DROP TABLE IF EXISTS wcf1_event_listener;
+CREATE TABLE wcf1_event_listener (
+ listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ eventClassName VARCHAR(80) NOT NULL DEFAULT '',
+ eventName VARCHAR(50) NOT NULL DEFAULT '',
+ listenerClassName VARCHAR(200) NOT NULL DEFAULT '',
+ inherit TINYINT(1) NOT NULL DEFAULT 0,
+ niceValue TINYINT(3) NOT NULL DEFAULT 0,
+ UNIQUE KEY packageID (packageID, eventClassName, eventName, listenerClassName)
+);
+
+DROP TABLE IF EXISTS wcf1_language;
+CREATE TABLE wcf1_language (
+ languageID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ languageCode VARCHAR(20) NOT NULL DEFAULT '',
+ isDefault TINYINT(1) NOT NULL DEFAULT 0,
+ hasContent TINYINT(1) NOT NULL DEFAULT 0,
+ UNIQUE KEY languageCode (languageCode)
+);
+
+DROP TABLE IF EXISTS wcf1_language_category;
+CREATE TABLE wcf1_language_category (
+ languageCategoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ languageCategory VARCHAR(255) NOT NULL DEFAULT '',
+ UNIQUE KEY languageCategory (languageCategory)
+);
+
+DROP TABLE IF EXISTS wcf1_language_item;
+CREATE TABLE wcf1_language_item (
+ languageItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ languageID INT(10) NOT NULL,
+ languageItem VARCHAR(255) NOT NULL DEFAULT '',
+ languageItemValue MEDIUMTEXT NOT NULL,
+ languageCustomItemValue MEDIUMTEXT,
+ languageUseCustomValue TINYINT(1) NOT NULL DEFAULT 0,
+ languageItemOriginIsSystem TINYINT(1) NOT NULL DEFAULT 1,
+ languageCategoryID INT(10) NOT NULL,
+ packageID INT(10),
+ UNIQUE KEY languageItem (languageItem, packageID, languageID),
+ KEY languageItemOriginIsSystem (languageItemOriginIsSystem)
+);
+
+DROP TABLE IF EXISTS wcf1_language_server;
+CREATE TABLE wcf1_language_server (
+ languageServerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ serverURL VARCHAR(255) NOT NULL DEFAULT '',
+ disabled TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_language_to_package;
+CREATE TABLE wcf1_language_to_package (
+ languageID INT(10) NOT NULL,
+ packageID INT(10),
+ UNIQUE KEY languageID (languageID, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_option;
+CREATE TABLE wcf1_option (
+ optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ optionName VARCHAR(255) NOT NULL DEFAULT '',
+ categoryName VARCHAR(255) NOT NULL DEFAULT '',
+ optionType VARCHAR(255) NOT NULL DEFAULT '',
+ optionValue MEDIUMTEXT,
+ validationPattern TEXT,
+ selectOptions MEDIUMTEXT,
+ enableOptions MEDIUMTEXT,
+ showOrder INT(10) NOT NULL DEFAULT 0,
+ hidden TINYINT(1) NOT NULL DEFAULT 0,
+ permissions TEXT,
+ options TEXT,
+ additionalData MEDIUMTEXT,
+ UNIQUE KEY optionName (optionName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_option_category;
+CREATE TABLE wcf1_option_category (
+ categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ categoryName VARCHAR(255) NOT NULL DEFAULT '',
+ parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',
+ showOrder INT(10) NOT NULL DEFAULT 0,
+ permissions TEXT,
+ options TEXT,
+ UNIQUE KEY categoryName (categoryName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_package;
+CREATE TABLE wcf1_package (
+ packageID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ package VARCHAR(255) NOT NULL DEFAULT '',
+ packageDir VARCHAR(255) NOT NULL DEFAULT '',
+ packageName VARCHAR(255) NOT NULL DEFAULT '',
+ instanceName VARCHAR(255) NOT NULL DEFAULT '',
+ instanceNo INT(10) NOT NULL DEFAULT 1,
+ packageDescription VARCHAR(255) NOT NULL DEFAULT '',
+ packageVersion VARCHAR(255) NOT NULL DEFAULT '',
+ packageDate INT(10) NOT NULL DEFAULT 0,
+ installDate INT(10) NOT NULL DEFAULT 0,
+ updateDate INT(10) NOT NULL DEFAULT 0,
+ packageURL VARCHAR(255) NOT NULL DEFAULT '',
+ parentPackageID INT(10) NOT NULL DEFAULT 0,
+ isUnique TINYINT(1) NOT NULL DEFAULT 0,
+ standalone TINYINT(1) NOT NULL DEFAULT 0,
+ author VARCHAR(255) NOT NULL DEFAULT '',
+ authorURL VARCHAR(255) NOT NULL DEFAULT '',
+ KEY package (package)
+);
+
+DROP TABLE IF EXISTS wcf1_package_dependency;
+CREATE TABLE wcf1_package_dependency (
+ packageID INT(10) NOT NULL,
+ dependency INT(10) NOT NULL,
+ priority INT(10) NOT NULL DEFAULT 0,
+ UNIQUE KEY packageID (packageID, dependency)
+);
+
+DROP TABLE IF EXISTS wcf1_package_exclusion;
+CREATE TABLE wcf1_package_exclusion (
+ packageID INT(10) NOT NULL,
+ excludedPackage VARCHAR(255) NOT NULL DEFAULT '',
+ excludedPackageVersion VARCHAR(255) NOT NULL DEFAULT '',
+ UNIQUE KEY packageID (packageID, excludedPackage)
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_file_log;
+CREATE TABLE wcf1_package_installation_file_log (
+ packageID INT(10),
+ filename VARCHAR(255) NOT NULL DEFAULT '',
+ UNIQUE KEY packageID (packageID, filename)
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_form;
+CREATE TABLE wcf1_package_installation_form (
+ queueID INT(10) NOT NULL,
+ formName VARCHAR(80) NOT NULL DEFAULT '',
+ document TEXT NOT NULL,
+ UNIQUE KEY formDocument (queueID, formName)
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_node;
+CREATE TABLE wcf1_package_installation_node (
+ queueID INT(10) NOT NULL,
+ processNo INT(10) NOT NULL DEFAULT 0,
+ sequenceNo SMALLINT(4) NOT NULL DEFAULT 0,
+ node CHAR(8) NOT NULL DEFAULT '',
+ parentNode CHAR(8) NOT NULL DEFAULT '',
+ nodeType ENUM('package', 'pip') NOT NULL DEFAULT 'package',
+ nodeData TEXT NOT NULL,
+ done TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_plugin;
+CREATE TABLE wcf1_package_installation_plugin (
+ pluginName VARCHAR(255) NOT NULL PRIMARY KEY,
+ packageID INT(10),
+ priority TINYINT(1) NOT NULL DEFAULT 0,
+ className VARCHAR(255) NOT NULL
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_queue;
+CREATE TABLE wcf1_package_installation_queue (
+ queueID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ parentQueueID INT(10) NOT NULL DEFAULT 0,
+ processNo INT(10) NOT NULL DEFAULT 0,
+ userID INT(10) NOT NULL,
+ package VARCHAR(255) NOT NULL DEFAULT '',
+ packageName VARCHAR(255) NOT NULL DEFAULT '',
+ packageID INT(10),
+ archive VARCHAR(255) NOT NULL DEFAULT '',
+ action ENUM('install', 'update', 'uninstall', 'rollback') NOT NULL DEFAULT 'install',
+ cancelable TINYINT(1) NOT NULL DEFAULT 1,
+ done TINYINT(1) NOT NULL DEFAULT 0,
+ confirmInstallation TINYINT(1) NOT NULL DEFAULT 0,
+ packageType ENUM('default', 'requirement', 'optional') NOT NULL DEFAULT 'default'
+);
+
+DROP TABLE IF EXISTS wcf1_package_installation_sql_log;
+CREATE TABLE wcf1_package_installation_sql_log (
+ packageID INT(10),
+ sqlTable VARCHAR(100) NOT NULL DEFAULT '',
+ sqlColumn VARCHAR(100) NOT NULL DEFAULT '',
+ sqlIndex VARCHAR(100) NOT NULL DEFAULT '',
+ UNIQUE KEY packageID (packageID, sqlTable, sqlColumn, sqlIndex)
+);
+
+DROP TABLE IF EXISTS wcf1_package_requirement;
+CREATE TABLE wcf1_package_requirement (
+ packageID INT(10) NOT NULL,
+ requirement INT(10) NOT NULL,
+ UNIQUE KEY packageID (packageID, requirement)
+);
+
+DROP TABLE IF EXISTS wcf1_package_requirement_map;
+CREATE TABLE wcf1_package_requirement_map (
+ packageID INT(10) NOT NULL,
+ requirement INT(10) NOT NULL,
+ level INT(10) NOT NULL DEFAULT 0,
+ UNIQUE KEY packageID (packageID, requirement)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update;
+CREATE TABLE wcf1_package_update (
+ packageUpdateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageUpdateServerID INT(10) NOT NULL,
+ package VARCHAR(255) NOT NULL DEFAULT '',
+ packageName VARCHAR(255) NOT NULL DEFAULT '',
+ packageDescription VARCHAR(255) NOT NULL DEFAULT '',
+ author VARCHAR(255) NOT NULL DEFAULT '',
+ authorURL VARCHAR(255) NOT NULL DEFAULT '',
+ standalone TINYINT(1) NOT NULL DEFAULT 0,
+ plugin VARCHAR(255) NOT NULL DEFAULT '',
+ UNIQUE KEY packageUpdateServerID (packageUpdateServerID, package)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_exclusion;
+CREATE TABLE wcf1_package_update_exclusion (
+ packageUpdateVersionID INT(10) NOT NULL,
+ excludedPackage VARCHAR(255) NOT NULL DEFAULT '',
+ excludedPackageVersion VARCHAR(255) NOT NULL DEFAULT '',
+ UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, excludedPackage)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_fromversion;
+CREATE TABLE wcf1_package_update_fromversion (
+ packageUpdateVersionID INT(10) NOT NULL DEFAULT 0,
+ fromversion VARCHAR(50) NOT NULL DEFAULT '',
+ UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, fromversion)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_requirement;
+CREATE TABLE wcf1_package_update_requirement (
+ packageUpdateVersionID INT(10) NOT NULL,
+ package VARCHAR(255) NOT NULL DEFAULT '',
+ minversion VARCHAR(50) NOT NULL DEFAULT '',
+ UNIQUE KEY packageUpdateVersionID (packageUpdateVersionID, package)
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_server;
+CREATE TABLE wcf1_package_update_server (
+ packageUpdateServerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ serverURL VARCHAR(255) NOT NULL DEFAULT '',
+ loginUsername VARCHAR(255) NOT NULL DEFAULT '',
+ loginPassword VARCHAR(255) NOT NULL DEFAULT '',
+ disabled TINYINT(1) NOT NULL DEFAULT 0,
+ lastUpdateTime INT(10) NOT NULL DEFAULT 0,
+ status ENUM('online', 'offline') NOT NULL DEFAULT 'online',
+ errorMessage TEXT
+);
+
+DROP TABLE IF EXISTS wcf1_package_update_version;
+CREATE TABLE wcf1_package_update_version (
+ packageUpdateVersionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageUpdateID INT(10) NOT NULL,
+ packageVersion VARCHAR(50) NOT NULL DEFAULT '',
+ updateType VARCHAR(10) NOT NULL DEFAULT '',
+ packageDate INT(10) NOT NULL DEFAULT 0,
+ filename VARCHAR(255) NOT NULL DEFAULT '',
+ UNIQUE KEY packageUpdateID (packageUpdateID, packageVersion)
+);
+
+DROP TABLE IF EXISTS wcf1_page_location;
+CREATE TABLE wcf1_page_location (
+ locationID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ locationPattern VARCHAR(255) NOT NULL DEFAULT '',
+ locationName VARCHAR(255) NOT NULL DEFAULT '',
+ packageID INT(10) NOT NULL,
+ className varchar(255) NOT NULL DEFAULT '',
+ UNIQUE KEY (packageID, locationName)
+);
+
+DROP TABLE IF EXISTS wcf1_page_menu_item;
+CREATE TABLE wcf1_page_menu_item (
+ menuItemID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ menuItem VARCHAR(255) NOT NULL DEFAULT '',
+ parentMenuItem VARCHAR(255) NOT NULL DEFAULT '',
+ menuItemLink VARCHAR(255) NOT NULL DEFAULT '',
+ menuPosition ENUM('header', 'footer') NOT NULL DEFAULT 'header',
+ showOrder INT(10) NOT NULL DEFAULT 0,
+ permissions TEXT NULL,
+ options TEXT NULL,
+ isDisabled TINYINT(1) NOT NULL DEFAULT 0,
+ className VARCHAR(255) NOT NULL DEFAULT '',
+ UNIQUE KEY (packageID, menuItem)
+);
+
+DROP TABLE IF EXISTS wcf1_search;
+CREATE TABLE wcf1_search (
+ searchID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ userID INT(10),
+ searchData MEDIUMTEXT NOT NULL,
+ searchTime INT(10) NOT NULL DEFAULT 0,
+ searchType VARCHAR(255) NOT NULL DEFAULT '',
+ searchHash CHAR(40) NOT NULL DEFAULT '',
+ KEY searchHash (searchHash)
+);
+
+DROP TABLE IF EXISTS wcf1_session;
+CREATE TABLE wcf1_session (
+ sessionID CHAR(40) NOT NULL PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ userID INT(10),
+ ipAddress VARCHAR(39) NOT NULL DEFAULT '',
+ userAgent VARCHAR(255) NOT NULL DEFAULT '',
+ lastActivityTime INT(10) NOT NULL DEFAULT 0,
+ requestURI VARCHAR(255) NOT NULL DEFAULT '',
+ requestMethod VARCHAR(4) NOT NULL DEFAULT '',
+ username VARCHAR(255) NOT NULL DEFAULT '',
+ spiderID INT(10) NOT NULL DEFAULT 0,
+ KEY packageID (packageID, lastActivityTime, spiderID)
+);
+
+DROP TABLE IF EXISTS wcf1_session_data;
+CREATE TABLE wcf1_session_data (
+ sessionID CHAR(40) NOT NULL PRIMARY KEY,
+ sessionVariables MEDIUMTEXT
+);
+
+DROP TABLE IF EXISTS wcf1_spider;
+CREATE TABLE wcf1_spider (
+ spiderID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ spiderIdentifier VARCHAR(255) DEFAULT '',
+ spiderName VARCHAR(255) DEFAULT '',
+ spiderURL VARCHAR(255) DEFAULT '',
+ UNIQUE KEY spiderIdentifier (spiderIdentifier)
+);
+
+DROP TABLE IF EXISTS wcf1_style;
+CREATE TABLE wcf1_style (
+ styleID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ styleName VARCHAR(255) NOT NULL DEFAULT '',
+ templateGroupID INT(10) NOT NULL DEFAULT 0,
+ isDefault TINYINT(1) NOT NULL DEFAULT 0,
+ disabled TINYINT(1) NOT NULL DEFAULT 0,
+ styleDescription TEXT,
+ styleVersion VARCHAR(255) NOT NULL DEFAULT '',
+ styleDate CHAR(10) NOT NULL DEFAULT '0000-00-00',
+ image VARCHAR(255) NOT NULL DEFAULT '',
+ copyright VARCHAR(255) NOT NULL DEFAULT '',
+ license VARCHAR(255) NOT NULL DEFAULT '',
+ authorName VARCHAR(255) NOT NULL DEFAULT '',
+ authorURL VARCHAR(255) NOT NULL DEFAULT ''
+);
+
+DROP TABLE IF EXISTS wcf1_style_to_package;
+CREATE TABLE wcf1_style_to_package (
+ styleID INT(10) NOT NULL,
+ packageID INT(10) NOT NULL,
+ isDefault TINYINT(1) NOT NULL DEFAULT 0,
+ disabled TINYINT(1) NOT NULL DEFAULT 0,
+ UNIQUE KEY (styleID, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_style_variable;
+CREATE TABLE wcf1_style_variable (
+ styleID INT(10) NOT NULL,
+ variableName VARCHAR(50) NOT NULL DEFAULT '',
+ variableValue MEDIUMTEXT,
+ UNIQUE KEY (styleID, variableName)
+);
+
+DROP TABLE IF EXISTS wcf1_style_variable_to_attribute;
+CREATE TABLE wcf1_style_variable_to_attribute (
+ packageID INT(10) NOT NULL,
+ cssSelector VARCHAR(200) NOT NULL DEFAULT '',
+ attributeName VARCHAR(50) NOT NULL DEFAULT '',
+ variableName VARCHAR(50) NOT NULL DEFAULT '',
+ UNIQUE KEY (packageID, cssSelector, attributeName, variableName)
+);
+
+DROP TABLE IF EXISTS wcf1_template;
+CREATE TABLE wcf1_template (
+ templateID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ templateName VARCHAR(255) NOT NULL DEFAULT '',
+ templateGroupID INT(10),
+ obsolete TINYINT(1) NOT NULL DEFAULT 0,
+ KEY packageID (packageID, templateName),
+ KEY templateGroupID (packageID, templateGroupID, templateName)
+);
+
+DROP TABLE IF EXISTS wcf1_template_group;
+CREATE TABLE wcf1_template_group (
+ templateGroupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ parentTemplateGroupID INT(10) NOT NULL DEFAULT 0,
+ templateGroupName VARCHAR(255) NOT NULL DEFAULT '',
+ templateGroupFolderName VARCHAR(255) NOT NULL DEFAULT ''
+);
+
+DROP TABLE IF EXISTS wcf1_user;
+CREATE TABLE wcf1_user (
+ userID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ username VARCHAR(255) NOT NULL DEFAULT '',
+ email VARCHAR(255) NOT NULL DEFAULT '',
+ password VARCHAR(40) NOT NULL DEFAULT '',
+ salt VARCHAR(40) NOT NULL DEFAULT '',
+ languageID INT(10) NOT NULL DEFAULT 0,
+ registrationDate INT(10) NOT NULL DEFAULT 0,
+ styleID INT(10) NOT NULL DEFAULT 0,
+
+ KEY username (username),
+ KEY registrationDate (registrationDate),
+ KEY styleID (styleID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_group;
+CREATE TABLE wcf1_user_group (
+ groupID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ groupName VARCHAR(255) NOT NULL DEFAULT '',
+ groupType TINYINT(1) NOT NULL DEFAULT 0
+);
+
+DROP TABLE IF EXISTS wcf1_user_group_option;
+CREATE TABLE wcf1_user_group_option (
+ optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10),
+ optionName VARCHAR(255) NOT NULL DEFAULT '',
+ categoryName VARCHAR(255) NOT NULL DEFAULT '',
+ optionType VARCHAR(255) NOT NULL DEFAULT '',
+ defaultValue MEDIUMTEXT,
+ adminDefaultValue MEDIUMTEXT,
+ validationPattern TEXT,
+ enableOptions MEDIUMTEXT,
+ showOrder INT(10) NOT NULL DEFAULT 0,
+ permissions TEXT,
+ options TEXT,
+ additionalData MEDIUMTEXT,
+ UNIQUE KEY optionName (optionName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_group_option_category;
+CREATE TABLE wcf1_user_group_option_category (
+ categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ categoryName VARCHAR(255) NOT NULL DEFAULT '',
+ parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',
+ showOrder INT(10) NOT NULL DEFAULT 0,
+ permissions TEXT,
+ options TEXT,
+ UNIQUE KEY categoryName (categoryName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_group_option_value;
+CREATE TABLE wcf1_user_group_option_value (
+ groupID INT(10) NOT NULL,
+ optionID INT(10) NOT NULL,
+ optionValue MEDIUMTEXT NOT NULL,
+ UNIQUE KEY groupID (groupID, optionID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_option;
+CREATE TABLE wcf1_user_option (
+ optionID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ optionName VARCHAR(255) NOT NULL DEFAULT '',
+ categoryName VARCHAR(255) NOT NULL DEFAULT '',
+ optionType VARCHAR(255) NOT NULL DEFAULT '',
+ defaultValue MEDIUMTEXT,
+ validationPattern TEXT,
+ selectOptions MEDIUMTEXT,
+ enableOptions MEDIUMTEXT,
+ required TINYINT(1) NOT NULL DEFAULT 0,
+ askDuringRegistration TINYINT(1) NOT NULL DEFAULT 0,
+ editable TINYINT(1) NOT NULL DEFAULT 0,
+ visible TINYINT(1) NOT NULL DEFAULT 0,
+ outputClass VARCHAR(255) NOT NULL DEFAULT '',
+ searchable TINYINT(1) NOT NULL DEFAULT 0,
+ showOrder INT(10) NOT NULL DEFAULT 0,
+ disabled TINYINT(1) NOT NULL DEFAULT 0,
+ permissions TEXT,
+ options TEXT,
+ additionalData MEDIUMTEXT,
+ UNIQUE KEY optionName (optionName, packageID),
+ KEY categoryName (categoryName)
+);
+
+DROP TABLE IF EXISTS wcf1_user_option_category;
+CREATE TABLE wcf1_user_option_category (
+ categoryID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ categoryName VARCHAR(255) NOT NULL DEFAULT '',
+ categoryIconS VARCHAR(255) NOT NULL DEFAULT '',
+ categoryIconM VARCHAR(255) NOT NULL DEFAULT '',
+ parentCategoryName VARCHAR(255) NOT NULL DEFAULT '',
+ showOrder INT(10) NOT NULL DEFAULT 0,
+ permissions TEXT,
+ options TEXT,
+ UNIQUE KEY categoryName (categoryName, packageID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_option_value;
+CREATE TABLE wcf1_user_option_value (
+ userID INT(10) NOT NULL PRIMARY KEY
+);
+
+DROP TABLE IF EXISTS wcf1_user_to_group;
+CREATE TABLE wcf1_user_to_group (
+ userID INT(10) NOT NULL,
+ groupID INT(10) NOT NULL,
+ UNIQUE KEY userID (userID, groupID)
+);
+
+DROP TABLE IF EXISTS wcf1_user_to_language;
+CREATE TABLE wcf1_user_to_language (
+ userID INT(10) NOT NULL,
+ languageID INT(10) NOT NULL,
+ UNIQUE KEY userID (userID, languageID)
+);
+
+DROP TABLE IF EXISTS wcf1_template_listener;
+CREATE TABLE wcf1_template_listener (
+ listenerID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ packageID INT(10) NOT NULL,
+ name VARCHAR(80) NOT NULL DEFAULT '',
+ environment ENUM('user','admin') NOT NULL DEFAULT 'user',
+ templateName VARCHAR(80) NOT NULL DEFAULT '',
+ eventName VARCHAR(50) NOT NULL DEFAULT '',
+ templateCode TEXT NOT NULL,
+ KEY templateName (environment, templateName)
+);
+
+DROP TABLE IF EXISTS wcf1_storage;
+CREATE TABLE wcf1_storage (
+ userID INT(10) NOT NULL,
+ field VARCHAR(80) NOT NULL DEFAULT '',
+ fieldValue TEXT,
+ packageID INT(10),
+ UNIQUE KEY storageData (userID, field, packageID)
+);
+
+/**** foreign keys ****/
+ALTER TABLE wcf1_acp_menu_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_acp_session ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_acp_session ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_acp_session_access_log ADD FOREIGN KEY (sessionLogID) REFERENCES wcf1_acp_session_log (sessionLogID) ON DELETE CASCADE;
+ALTER TABLE wcf1_acp_session_access_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE SET NULL;
+
+ALTER TABLE wcf1_acp_session_data ADD FOREIGN KEY (sessionID) REFERENCES wcf1_acp_session (sessionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_acp_session_log ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE SET NULL;
+
+ALTER TABLE wcf1_acp_template ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_application ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_application ADD FOREIGN KEY (groupID) REFERENCES wcf1_application_group (groupID) ON DELETE SET NULL;
+
+ALTER TABLE wcf1_cleanup_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_cleanup_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_core_object ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_cronjob ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_cronjob_log ADD FOREIGN KEY (cronjobID) REFERENCES wcf1_cronjob (cronjobID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_event_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_language_item ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_language_item ADD FOREIGN KEY (languageCategoryID) REFERENCES wcf1_language_category (languageCategoryID) ON DELETE CASCADE;
+ALTER TABLE wcf1_language_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_language_to_package ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_language_to_package ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_dependency ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_package_dependency ADD FOREIGN KEY (dependency) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_exclusion ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_file_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_form ADD FOREIGN KEY (queueID) REFERENCES wcf1_package_installation_queue (queueID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_node ADD FOREIGN KEY (queueID) REFERENCES wcf1_package_installation_queue (queueID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_plugin ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_installation_queue ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_package_installation_queue ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE SET NULL;
+
+ALTER TABLE wcf1_package_installation_sql_log ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_requirement ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_package_requirement ADD FOREIGN KEY (requirement) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_requirement_map ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_package_requirement_map ADD FOREIGN KEY (requirement) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update ADD FOREIGN KEY (packageUpdateServerID) REFERENCES wcf1_package_update_server (packageUpdateServerID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update_exclusion ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update_fromversion ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update_requirement ADD FOREIGN KEY (packageUpdateVersionID) REFERENCES wcf1_package_update_version (packageUpdateVersionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_package_update_version ADD FOREIGN KEY (packageUpdateID) REFERENCES wcf1_package_update (packageUpdateID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_page_location ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_page_menu_item ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_search ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_session ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_session ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_session_data ADD FOREIGN KEY (sessionID) REFERENCES wcf1_session (sessionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_storage ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_storage ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_style ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_style_to_package ADD FOREIGN KEY (styleID) REFERENCES wcf1_style (styleID) ON DELETE CASCADE;
+ALTER TABLE wcf1_style_to_package ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_style_variable ADD FOREIGN KEY (styleID) REFERENCES wcf1_style (styleID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_style_variable_to_attribute ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_template ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+ALTER TABLE wcf1_template ADD FOREIGN KEY (templateGroupID) REFERENCES wcf1_template_group (templateGroupID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_template_listener ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_group_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_group_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_group_option_value ADD FOREIGN KEY (groupID) REFERENCES wcf1_user_group (groupID) ON DELETE CASCADE;
+ALTER TABLE wcf1_user_group_option_value ADD FOREIGN KEY (optionID) REFERENCES wcf1_user_group_option (optionID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_option ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_option_category ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_option_value ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_to_group ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_user_to_group ADD FOREIGN KEY (groupID) REFERENCES wcf1_user_group (groupID) ON DELETE CASCADE;
+
+ALTER TABLE wcf1_user_to_language ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE;
+ALTER TABLE wcf1_user_to_language ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE;
+
+/**** default inserts ****/
+-- default user groups
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Everyone', 1);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Guests', 2);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Users', 3);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Administrators', 4);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Moderators', 4);
+INSERT INTO wcf1_user_group (groupName, groupType) VALUES ('Super Moderators', 4);
+
+-- default user group options
+INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.general.canUseAcp', 'admin.general', 'boolean', '0', '1', 1);
+INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.system.package.canInstallPackage', 'admin.system.package', 'boolean', '0', '1', 1);
+INSERT INTO wcf1_user_group_option (optionName, categoryName, optionType, defaultValue, adminDefaultValue, showOrder) VALUES ('admin.user.canEditGroup', 'admin.user.group', 'boolean', '0', '1', 1);
+
+-- default user group option values
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 1, '0'); -- Everyone
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 2, '0'); -- Everyone
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (1, 3, '0'); -- Everyone
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 1, '1'); -- Administrators
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 2, '1'); -- Administrators
+INSERT INTO wcf1_user_group_option_value (groupID, optionID, optionValue) VALUES (4, 3, '1'); -- Administrators
+
+-- default update servers
+INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://update.woltlab.com/tempest/', 'online', 0, NULL, 0, '', '');
+INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://update.woltlab.com/maelstrom/', 'online', 0, NULL, 0, '', '');
+INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://store.woltlab.com/tempest/', 'online', 0, NULL, 0, '', '');
+INSERT INTO wcf1_package_update_server (serverURL, status, disabled, errorMessage, lastUpdateTime, loginUsername, loginPassword) VALUES ('http://store.woltlab.com/maelstrom/', 'online', 0, NULL, 0, '', '');
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de">\r
- <category name="wcf.global">\r
- <item name="wcf.global.pageTitle"><![CDATA[{$setupPackageName} Installation]]></item>\r
- <item name="wcf.global.title"><![CDATA[<b>{$setupPackageName}</b><br />Installation]]></item>\r
- <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>\r
- <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>\r
- <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>\r
- <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>\r
- <item name="wcf.global.thousandsSeparator"><![CDATA[ ]]></item>\r
- <item name="wcf.global.button.next"><![CDATA[Weiter »]]></item>\r
- <item name="wcf.global.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>\r
- <item name="wcf.global.dateMethod"><![CDATA[strftime]]></item>\r
- <item name="wcf.global.dateFormat"><![CDATA[%d.%m.%Y]]></item>\r
- <item name="wcf.global.timeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>\r
- <item name="wcf.global.dateFormatLocalized"><![CDATA[%e. %B %Y]]></item>\r
- <item name="wcf.global.timeFormatLocalized"><![CDATA[%A, %e. %B %Y, %H:%M]]></item>\r
- <item name="wcf.global.dateFormatToday"><![CDATA[<b>Heute</b>, %H:%M]]></item>\r
- <item name="wcf.global.dateFormatYesterday"><![CDATA[Gestern, %H:%M]]></item>\r
- <item name="wcf.global.welcome"><![CDATA[Vielen Dank, dass Sie sich für {$setupPackageName} entschieden haben]]></item>\r
- <item name="wcf.global.welcome.description"><![CDATA[Dieser Installationsassistent hilft Ihnen bei der Einrichtung von <br /><b>WoltLab Community Framework</b>{if $setupPackageName != 'WoltLab Community Framework'} und von <b>{$setupPackageName}</b>{/if}.]]></item>\r
- <item name="wcf.global.welcome.language"><![CDATA[Sprache]]></item>\r
- <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>\r
- <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>\r
- <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede »Du«)]]></item>\r
- <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>\r
- <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>\r
- <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>\r
- <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>\r
- <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
- <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>\r
- <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>\r
- <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>\r
- <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>\r
- <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>\r
- <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>\r
- <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>\r
- <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>\r
- <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>\r
- <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>\r
- <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>\r
- <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>\r
- <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>\r
- <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>\r
- <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>\r
- <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>\r
- <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>\r
- <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>\r
- <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>\r
- <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>\r
- <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>\r
- <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>\r
- <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>\r
- <item name="wcf.global.welcome.language.description"><![CDATA[Die Sprache dieses Assistenten ist zur Zeit Deutsch.]]></item>\r
- <item name="wcf.global.welcome.language.change"><![CDATA[Sprache wechseln]]></item>\r
- <item name="wcf.global.license"><![CDATA[Lizenzbestimmungen]]></item>\r
- <item name="wcf.global.license.description"><![CDATA[Bitte lesen Sie die folgenden Lizenzbestimmungen. Verwenden Sie die Bildlaufleiste, um das gesamte Dokument anzuzeigen.]]></item>\r
- <item name="wcf.global.license.accept.description"><![CDATA[Akzeptieren Sie sämtliche Bedingungen der Lizenzbestimmungen? Sie können die Software nur installieren, wenn Sie die Lizenzbestimmungen akzeptieren.]]></item>\r
- <item name="wcf.global.license.missingAcception"><![CDATA[Um mit der Installation fortfahren zu können, müssen Sie die Lizenzbestimmungen akzeptieren.]]></item>\r
- <item name="wcf.global.systemRequirements"><![CDATA[Überprüfung der Systemvoraussetzungen]]></item>\r
- <item name="wcf.global.systemRequirements.description"><![CDATA[Dies sind die Systemvoraussetzungen:]]></item>\r
- <item name="wcf.global.systemRequirements.required"><![CDATA[Benötigte Systemvoraussetzungen]]></item>\r
- <item name="wcf.global.systemRequirements.recommended"><![CDATA[Empfohlene Systemvoraussetzungen]]></item>\r
- <item name="wcf.global.systemRequirements.element.required"><![CDATA[Benötigt:]]></item>\r
- <item name="wcf.global.systemRequirements.element.yours"><![CDATA[Gefunden:]]></item>\r
- <item name="wcf.global.systemRequirements.element.recommended"><![CDATA[Empfohlen:]]></item>\r
- <item name="wcf.global.systemRequirements.php"><![CDATA[Installierte Version der Skriptsprache »PHP«]]></item>\r
- <item name="wcf.global.systemRequirements.php.description"><![CDATA[Die installierte Version der Skriptsprache »PHP« ist für einen stabilen Betrieb dieser Software zu alt. Bitte veranlassen Sie eine Aktualisierung der installierten Version bevor Sie mit der Installation fortfahren.]]></item>\r
- <item name="wcf.global.systemRequirements.php.description2"><![CDATA[Ihre PHP Version ist stark veraltet. Für einen einwandfreien Betrieb empfehlen wir PHP Version 5.0.5 oder höher.]]></item>\r
- <item name="wcf.global.systemRequirements.sql"><![CDATA[Datenbank-Unterstützung]]></item>\r
- <item name="wcf.global.systemRequirements.sql.notFound"><![CDATA[nicht gefunden]]></item>\r
- <item name="wcf.global.systemRequirements.sql.description"><![CDATA[Ohne die Unterstützung einer kompatiblen Datenbank kann diese Software nicht installiert werden.]]></item>\r
- <item name="wcf.global.systemRequirements.uploadMaxFilesize"><![CDATA[Maximale Größe für das Hochladen von Dateien]]></item>\r
- <item name="wcf.global.systemRequirements.uploadMaxFilesize.description"><![CDATA[Die derzeitige Konfiguration der Skriptsprache »PHP« macht das Hochladen von Dateien unmöglich. Einige Funktionalitäten werden durch diese Konfiguration nur eingeschränkt funktionieren.]]></item>\r
- <item name="wcf.global.systemRequirements.gdLib"><![CDATA[Installierte Version der Grafikbearbeitungs-Bibliothek »gdlib«]]></item>\r
- <item name="wcf.global.systemRequirements.gdLib.description"><![CDATA[Grafikbearbeitungs-Bibliothek »gdlib« ist für die dynamische Generierung von Bildern zuständig. Ohne sie werden einige Funktionalitäten der Software nicht funktionieren.]]></item>\r
- <item name="wcf.global.systemRequirements.mbString"><![CDATA[Bibliothek für Zeichen mit mehreren Bytes (»multibyte string«)]]></item>\r
- <item name="wcf.global.systemRequirements.mbString.description"><![CDATA[Ohne diese Bibliothek ist auschließlich der Betrieb von westeuropäischen Sprachen möglich.]]></item>\r
- <item name="wcf.global.systemRequirements.safeMode"><![CDATA[Sicherheitseinstellung »safe mode« in Skriptsprache »PHP«]]></item>\r
- <item name="wcf.global.systemRequirements.safeMode.description"><![CDATA[Es wird empfohlen diese Einstellung zu deaktivieren, da ansonsten ein einwandfreier Betrieb der Software nicht garantiert werden kann.]]></item>\r
- <item name="wcf.global.systemRequirements.ftp"><![CDATA[Bibliothek für Datenübertragungen per FTP]]></item>\r
- <item name="wcf.global.systemRequirements.ftp.description"><![CDATA[Bei der aktivierten Sicherheitseinstellung »safe mode« wird diese Bibliothek für einen Großteil der Dateioperationen der Software benutzt. Es wird dringend empfohlen, diese Bibliothek zu aktivieren.]]></item>\r
- <item name="wcf.global.systemRequirements.active"><![CDATA[aktiviert]]></item>\r
- <item name="wcf.global.systemRequirements.notActive"><![CDATA[nicht aktiviert]]></item>\r
- <item name="wcf.global.wcfDir"><![CDATA[Installationsverzeichnis wählen]]></item>\r
- <item name="wcf.global.wcfDir.description"><![CDATA[In das Installationsverzeichnis werden alle Dateien von <b>WoltLab Community Framework</b> entpackt.]]></item>\r
- <item name="wcf.global.wcfDir.foundDirectory"><![CDATA[Die Installation vermutet eine bereits vorhandene Installation von <b>WoltLab Community Framework</b> im Ordner "{$foundDirectory}".<br />Bitte überprüfen Sie diese Angabe bzw. definieren Sie ein anderes Installationsverzeichnis, wenn Sie eine neue Kopie von <b>WoltLab Community Framework</b> installieren möchten.]]></item>\r
- <item name="wcf.global.wcfDir.dir"><![CDATA[Installationsverzeichnis]]></item>\r
- <item name="wcf.global.wcfDir.dir.description"><![CDATA[Bitte geben Sie hier das Installationsverzeichnis für <b>WoltLab Community Framework</b> an.]]></item>\r
- <item name="wcf.global.wcfDir.url.description"><![CDATA[Nach einer Installation in das angegebene Installationsverzeichnis ist <b>WoltLab Community Framework</b> über folgende Adresse (URL) erreichbar:]]></item>\r
- <item name="wcf.global.wcfDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>\r
- <item name="wcf.global.ftp"><![CDATA[Eingabe der Zugangsdaten für FTP]]></item>\r
- <item name="wcf.global.ftp.description"><![CDATA[Da auf Ihrem Server der PHP-SafeMode aktiviert ist, muss WoltLab Community Framework über die FTP-Funktionen installiert werden. Bitte geben Sie Benutzernamen und Kennwort für den FTP-Zugang zu diesem Server an. Die Daten werden nicht gespeichert oder weitergeleitet, sondern lediglich zur Installation dieses Paketes verwendet. Möglicherweise müssen Sie diese FTP-Zugangsdaten während dieser Installation mehrfach angeben.]]></item>\r
- <item name="wcf.global.ftp.accessData"><![CDATA[Zugangsdaten für FTP]]></item>\r
- <item name="wcf.global.ftp.host"><![CDATA[Hostname]]></item>\r
- <item name="wcf.global.ftp.user"><![CDATA[Benutzername]]></item>\r
- <item name="wcf.global.ftp.password"><![CDATA[Kennwort]]></item>\r
- <item name="wcf.global.ftp.error"><![CDATA[Mit den angegebenen Zugangsdaten konnte keine Verbindung zu einem FTP-Server hergestellt werden.]]></item>\r
- <item name="wcf.global.next"><![CDATA[Lade nächsten Schritt ...]]></item>\r
- <item name="wcf.global.next.description"><![CDATA[Die Installation lädt im Moment den nächsten Schritt. Bitte haben Sie einen Augenblick Geduld.]]></item>\r
- <item name="wcf.global.languages"><![CDATA[Sprachen wählen]]></item>\r
- <item name="wcf.global.languages.description"><![CDATA[Sie können diese Software mehrsprachig betreiben. Bitte wählen Sie aus, welche Sprachen Sie installieren möchten.]]></item>\r
- <item name="wcf.global.languages.charset"><![CDATA[Zeichenkodierung]]></item>\r
- <item name="wcf.global.languages.charset.description"><![CDATA[Über die Zeichenkodierung wird die technische Speicherung und Darstellung von Sprachen beeinflusst. Bitte beachten Sie, dass die Zeichenkodierung zu einem späteren Zeitpunkt nicht mehr gewechselt werden kann.]]></item>\r
- \r
- <!-- <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Die Verwendung von ISO-8859-1 wird empfohlen, wenn Sie ausschließlich westeuropäische Sprachen installieren möchten.]]></item>\r
- <item name="wcf.global.languages.charset.UTF-8"><![CDATA[UTF-8 wird für den Betrieb von nicht westeuropäischen Sprachen benötigt. Wenn Sie jetzt oder zu einem späteren Zeitpunkt eine nicht westeuropäischen Sprache installieren möchten, müssen Sie hier UTF-8 auswählen.]]></item>-->\r
- \r
- <item name="wcf.global.languages.charset.UTF-8"><![CDATA[Unicode]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Westeuropäisch]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-2"><![CDATA[Mitteleuropäisch]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-7"><![CDATA[Griechisch]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-8"><![CDATA[Hebräisch]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-9"><![CDATA[Türkisch]]></item>\r
- <item name="wcf.global.languages.charset.EUC-JP"><![CDATA[Japanisch]]></item>\r
- <item name="wcf.global.languages.charset.SJIS"><![CDATA[Japanisch]]></item>\r
- <item name="wcf.global.languages.charset.BIG-5"><![CDATA[Chinesisch (traditionell)]]></item>\r
- <item name="wcf.global.languages.charset.CP936"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
- <item name="wcf.global.languages.charset.EUC-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>\r
- <item name="wcf.global.languages.charset.KOI8-R"><![CDATA[Kyrillisch]]></item>\r
- <item name="wcf.global.languages.charset.Windows-1251"><![CDATA[Kyrillisch]]></item>\r
- <item name="wcf.global.languages.charset.EUC-KR"><![CDATA[Koreanisch]]></item>\r
- \r
- <item name="wcf.global.languages.languages"><![CDATA[Sprachen]]></item>\r
- <item name="wcf.global.languages.error.empty"><![CDATA[Bitte wählen Sie mindestens eine Sprache aus!]]></item>\r
- <item name="wcf.global.languages.error.notAvailable"><![CDATA[Sie haben Sprachen ausgewählt, die in der gleichzeitig ausgewählten Zeichencodierung nicht zur Verfügung stehen. Bitte korrigieren Sie Ihre Auswahl.]]></item>\r
- <item name="wcf.global.configureDB"><![CDATA[Datenbankzugang konfigurieren]]></item>\r
- <item name="wcf.global.configureDB.description"><![CDATA[Die Daten der Software werden in einer SQL Datenbank gespeichert. Bitte geben Sie die Zugangsdaten für diese Datenbank an!]]></item>\r
- <item name="wcf.global.configureDB.accessData"><![CDATA[Datenbankzugangsdaten]]></item>\r
- <item name="wcf.global.configureDB.host"><![CDATA[Hostname]]></item>\r
- <item name="wcf.global.configureDB.user"><![CDATA[Benutzername]]></item>\r
- <item name="wcf.global.configureDB.password"><![CDATA[Kennwort]]></item>\r
- <item name="wcf.global.configureDB.database"><![CDATA[Datenbankname]]></item>\r
- <item name="wcf.global.configureDB.number"><![CDATA[Installationsnummer]]></item>\r
- <item name="wcf.global.configureDB.error"><![CDATA[Beim Verbindungsversuch mit der Datenbank ist folgender Fehler aufgetreten:\r
- <br /><b>{$exception->getMessage()}{if $exception|get_class == 'DatabaseException'}<br />{$exception->getErrorDesc()}{/if}</b>\r
- <br />Weitere Informationen zu diesem Problem erhalten Sie im Nachschlagewerk von WoltLab:\r
- <br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>\r
- <item name="wcf.global.configureDB.conflictedTables"><![CDATA[Folgende Tabelle{if $conflictedTables|count > 1}n{/if} existier{if $conflictedTables|count > 1}en{else}t{/if} schon in der Datenbank »{$dbName}«:<br />{implode from=$conflictedTables item="table"}{$table}{/implode}.<br /><br />Um dieses Problem zu beheben, können Sie:<br />1. diese Tabelle{if $conflictedTables|count > 1}n{/if} überschreiben, indem Sie die »Überschreiben« Option aktivieren und die »Weiter« Schaltfläche betätigen, oder<br />2. Sie geben die Daten einer anderen Datenbank ein und betätigen die »Weiter« Schaltfläche, oder<br />3. Sie geben eine von »{$dbNumber}« unterschiedliche Installationsnummer an und betätigen die »Weiter« Schaltfläche.]]></item>\r
- <item name="wcf.global.configureDB.conflictedTables.overwrite"><![CDATA[Oben genannte Tabelle{if $conflictedTables|count > 1}n{/if} überschreiben]]></item>\r
- <item name="wcf.global.configureDB.class"><![CDATA[Datenbank-Typ]]></item>\r
- <item name="wcf.global.configureDB.class.MSSQLDatabase"><![CDATA[Microsoft SQL Server 2008+]]></item>\r
- <item name="wcf.global.configureDB.class.MySQLDatabase"><![CDATA[MySQL 5.1+]]></item>\r
- <item name="wcf.global.configureDB.class.PostgreSQLDatabase"><![CDATA[PostgreSQL 8.2+]]></item>\r
- <item name="wcf.global.createUser"><![CDATA[Administrator erstellen]]></item>\r
- <item name="wcf.global.createUser.description"><![CDATA[Der Installationsassistent erstellt nun ein Administrator-Konto für Sie. Bitte geben Sie dazu einen Benutzernamen, eine E-Mail-Adresse und ein Kennwort ein.]]></item>\r
- <item name="wcf.global.createUser.data"><![CDATA[Benutzerdaten]]></item>\r
- <item name="wcf.global.createUser.username"><![CDATA[Benutzername]]></item>\r
- <item name="wcf.global.createUser.email"><![CDATA[E-Mail-Adresse]]></item>\r
- <item name="wcf.global.createUser.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>\r
- <item name="wcf.global.createUser.password"><![CDATA[Kennwort]]></item>\r
- <item name="wcf.global.createUser.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>\r
- <item name="wcf.global.createUser.error"><![CDATA[Es sind Fehler bei Ihrer Registrierung aufgetreten. Bitte überprüfen Sie die markierten Felder.]]></item>\r
- <item name="wcf.global.createUser.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>\r
- <item name="wcf.global.createUser.error.username.notValid"><![CDATA[Der eingegebene Benutzername ist ungültig. Ein gültiger Benutzername muss mindestens 3 und maximal 20 Zeichen lang sein.]]></item>\r
- <item name="wcf.global.createUser.error.email.notValid"><![CDATA[Die eingegebene E-Mail-Adresse ist ungültig. Eine gültige E-Mail-Adresse muss dem Format name@domain.tld entsprechen.]]></item>\r
- <item name="wcf.global.createUser.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch. Bitte tragen Sie zur Sicherheit in beide Eingabefelder die selbe E-Mail-Adresse ein.]]></item>\r
- <item name="wcf.global.createUser.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch. Bitte tragen Sie zur Sicherheit in beide Eingabefelder das selbe Kennwort ein.]]></item>\r
- <item name="wcf.global.wcfDir.error"><![CDATA[Beim Versuch die Dateien zu entpacken, ist folgender Fehler aufgetreten:\r
- <br /><b>{$exception->getMessage()}</b><br />\r
- Bitte kontrollieren Sie, ob das Zielverzeichnis existiert und beschreibbar ist.\r
- <br /><br />Weitere Informationen zu diesem Problem erhalten Sie im Nachschlagewerk von WoltLab:<br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>\r
- </category>\r
-</language>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="de">
+ <category name="wcf.global">
+ <item name="wcf.global.pageTitle"><![CDATA[{$setupPackageName} Installation]]></item>
+ <item name="wcf.global.title"><![CDATA[<b>{$setupPackageName}</b><br />Installation]]></item>
+ <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item>
+ <item name="wcf.global.locale.unix"><![CDATA[de_DE]]></item>
+ <item name="wcf.global.locale.win"><![CDATA[deu_deu]]></item>
+ <item name="wcf.global.decimalPoint"><![CDATA[,]]></item>
+ <item name="wcf.global.thousandsSeparator"><![CDATA[ ]]></item>
+ <item name="wcf.global.button.next"><![CDATA[Weiter »]]></item>
+ <item name="wcf.global.progressBar"><![CDATA[{@$progress}% fertiggestellt]]></item>
+ <item name="wcf.global.dateMethod"><![CDATA[strftime]]></item>
+ <item name="wcf.global.dateFormat"><![CDATA[%d.%m.%Y]]></item>
+ <item name="wcf.global.timeFormat"><![CDATA[%d.%m.%Y, %H:%M]]></item>
+ <item name="wcf.global.dateFormatLocalized"><![CDATA[%e. %B %Y]]></item>
+ <item name="wcf.global.timeFormatLocalized"><![CDATA[%A, %e. %B %Y, %H:%M]]></item>
+ <item name="wcf.global.dateFormatToday"><![CDATA[<b>Heute</b>, %H:%M]]></item>
+ <item name="wcf.global.dateFormatYesterday"><![CDATA[Gestern, %H:%M]]></item>
+ <item name="wcf.global.welcome"><![CDATA[Vielen Dank, dass Sie sich für {$setupPackageName} entschieden haben]]></item>
+ <item name="wcf.global.welcome.description"><![CDATA[Dieser Installationsassistent hilft Ihnen bei der Einrichtung von <br /><b>WoltLab Community Framework</b>{if $setupPackageName != 'WoltLab Community Framework'} und von <b>{$setupPackageName}</b>{/if}.]]></item>
+ <item name="wcf.global.welcome.language"><![CDATA[Sprache]]></item>
+ <item name="wcf.global.language.en"><![CDATA[Englisch]]></item>
+ <item name="wcf.global.language.de"><![CDATA[Deutsch]]></item>
+ <item name="wcf.global.language.de-informal"><![CDATA[Deutsch (Anrede »Du«)]]></item>
+ <item name="wcf.global.language.fr"><![CDATA[Französisch]]></item>
+ <item name="wcf.global.language.ja"><![CDATA[Japanisch]]></item>
+ <item name="wcf.global.language.es"><![CDATA[Spanisch]]></item>
+ <item name="wcf.global.language.zh-TW"><![CDATA[Chinesisch (traditionell)]]></item>
+ <item name="wcf.global.language.zh-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>
+ <item name="wcf.global.language.it"><![CDATA[Italienisch]]></item>
+ <item name="wcf.global.language.nl"><![CDATA[Niederländisch]]></item>
+ <item name="wcf.global.language.ru"><![CDATA[Russisch]]></item>
+ <item name="wcf.global.language.ko"><![CDATA[Koreanisch]]></item>
+ <item name="wcf.global.language.pt"><![CDATA[Portugiesisch]]></item>
+ <item name="wcf.global.language.pt-BR"><![CDATA[Portugiesisch (Brasilien)]]></item>
+ <item name="wcf.global.language.sv"><![CDATA[Schwedisch]]></item>
+ <item name="wcf.global.language.pl"><![CDATA[Polnisch]]></item>
+ <item name="wcf.global.language.da"><![CDATA[Dänisch]]></item>
+ <item name="wcf.global.language.cs"><![CDATA[Tschechisch]]></item>
+ <item name="wcf.global.language.tr"><![CDATA[Türkisch]]></item>
+ <item name="wcf.global.language.hu"><![CDATA[Ungarisch]]></item>
+ <item name="wcf.global.language.ar"><![CDATA[Arabisch]]></item>
+ <item name="wcf.global.language.he"><![CDATA[Hebräisch]]></item>
+ <item name="wcf.global.language.fa"><![CDATA[Persisch]]></item>
+ <item name="wcf.global.language.no"><![CDATA[Norwegisch]]></item>
+ <item name="wcf.global.language.fi"><![CDATA[Finnisch]]></item>
+ <item name="wcf.global.language.ro"><![CDATA[Rumänisch]]></item>
+ <item name="wcf.global.language.bs"><![CDATA[Bosnisch]]></item>
+ <item name="wcf.global.language.hr"><![CDATA[Kroatisch]]></item>
+ <item name="wcf.global.language.sr"><![CDATA[Serbisch]]></item>
+ <item name="wcf.global.language.sk"><![CDATA[Slowakisch]]></item>
+ <item name="wcf.global.language.el"><![CDATA[Griechisch]]></item>
+ <item name="wcf.global.welcome.language.description"><![CDATA[Die Sprache dieses Assistenten ist zur Zeit Deutsch.]]></item>
+ <item name="wcf.global.welcome.language.change"><![CDATA[Sprache wechseln]]></item>
+ <item name="wcf.global.license"><![CDATA[Lizenzbestimmungen]]></item>
+ <item name="wcf.global.license.description"><![CDATA[Bitte lesen Sie die folgenden Lizenzbestimmungen. Verwenden Sie die Bildlaufleiste, um das gesamte Dokument anzuzeigen.]]></item>
+ <item name="wcf.global.license.accept.description"><![CDATA[Akzeptieren Sie sämtliche Bedingungen der Lizenzbestimmungen? Sie können die Software nur installieren, wenn Sie die Lizenzbestimmungen akzeptieren.]]></item>
+ <item name="wcf.global.license.missingAcception"><![CDATA[Um mit der Installation fortfahren zu können, müssen Sie die Lizenzbestimmungen akzeptieren.]]></item>
+ <item name="wcf.global.systemRequirements"><![CDATA[Überprüfung der Systemvoraussetzungen]]></item>
+ <item name="wcf.global.systemRequirements.description"><![CDATA[Dies sind die Systemvoraussetzungen:]]></item>
+ <item name="wcf.global.systemRequirements.required"><![CDATA[Benötigte Systemvoraussetzungen]]></item>
+ <item name="wcf.global.systemRequirements.recommended"><![CDATA[Empfohlene Systemvoraussetzungen]]></item>
+ <item name="wcf.global.systemRequirements.element.required"><![CDATA[Benötigt:]]></item>
+ <item name="wcf.global.systemRequirements.element.yours"><![CDATA[Gefunden:]]></item>
+ <item name="wcf.global.systemRequirements.element.recommended"><![CDATA[Empfohlen:]]></item>
+ <item name="wcf.global.systemRequirements.php"><![CDATA[Installierte Version der Skriptsprache »PHP«]]></item>
+ <item name="wcf.global.systemRequirements.php.description"><![CDATA[Die installierte Version der Skriptsprache »PHP« ist für einen stabilen Betrieb dieser Software zu alt. Bitte veranlassen Sie eine Aktualisierung der installierten Version bevor Sie mit der Installation fortfahren.]]></item>
+ <item name="wcf.global.systemRequirements.php.description2"><![CDATA[Ihre PHP Version ist stark veraltet. Für einen einwandfreien Betrieb empfehlen wir PHP Version 5.0.5 oder höher.]]></item>
+ <item name="wcf.global.systemRequirements.sql"><![CDATA[Datenbank-Unterstützung]]></item>
+ <item name="wcf.global.systemRequirements.sql.notFound"><![CDATA[nicht gefunden]]></item>
+ <item name="wcf.global.systemRequirements.sql.description"><![CDATA[Ohne die Unterstützung einer kompatiblen Datenbank kann diese Software nicht installiert werden.]]></item>
+ <item name="wcf.global.systemRequirements.uploadMaxFilesize"><![CDATA[Maximale Größe für das Hochladen von Dateien]]></item>
+ <item name="wcf.global.systemRequirements.uploadMaxFilesize.description"><![CDATA[Die derzeitige Konfiguration der Skriptsprache »PHP« macht das Hochladen von Dateien unmöglich. Einige Funktionalitäten werden durch diese Konfiguration nur eingeschränkt funktionieren.]]></item>
+ <item name="wcf.global.systemRequirements.gdLib"><![CDATA[Installierte Version der Grafikbearbeitungs-Bibliothek »gdlib«]]></item>
+ <item name="wcf.global.systemRequirements.gdLib.description"><![CDATA[Grafikbearbeitungs-Bibliothek »gdlib« ist für die dynamische Generierung von Bildern zuständig. Ohne sie werden einige Funktionalitäten der Software nicht funktionieren.]]></item>
+ <item name="wcf.global.systemRequirements.mbString"><![CDATA[Bibliothek für Zeichen mit mehreren Bytes (»multibyte string«)]]></item>
+ <item name="wcf.global.systemRequirements.mbString.description"><![CDATA[Ohne diese Bibliothek ist auschließlich der Betrieb von westeuropäischen Sprachen möglich.]]></item>
+ <item name="wcf.global.systemRequirements.safeMode"><![CDATA[Sicherheitseinstellung »safe mode« in Skriptsprache »PHP«]]></item>
+ <item name="wcf.global.systemRequirements.safeMode.description"><![CDATA[Es wird empfohlen diese Einstellung zu deaktivieren, da ansonsten ein einwandfreier Betrieb der Software nicht garantiert werden kann.]]></item>
+ <item name="wcf.global.systemRequirements.ftp"><![CDATA[Bibliothek für Datenübertragungen per FTP]]></item>
+ <item name="wcf.global.systemRequirements.ftp.description"><![CDATA[Bei der aktivierten Sicherheitseinstellung »safe mode« wird diese Bibliothek für einen Großteil der Dateioperationen der Software benutzt. Es wird dringend empfohlen, diese Bibliothek zu aktivieren.]]></item>
+ <item name="wcf.global.systemRequirements.active"><![CDATA[aktiviert]]></item>
+ <item name="wcf.global.systemRequirements.notActive"><![CDATA[nicht aktiviert]]></item>
+ <item name="wcf.global.wcfDir"><![CDATA[Installationsverzeichnis wählen]]></item>
+ <item name="wcf.global.wcfDir.description"><![CDATA[In das Installationsverzeichnis werden alle Dateien von <b>WoltLab Community Framework</b> entpackt.]]></item>
+ <item name="wcf.global.wcfDir.foundDirectory"><![CDATA[Die Installation vermutet eine bereits vorhandene Installation von <b>WoltLab Community Framework</b> im Ordner "{$foundDirectory}".<br />Bitte überprüfen Sie diese Angabe bzw. definieren Sie ein anderes Installationsverzeichnis, wenn Sie eine neue Kopie von <b>WoltLab Community Framework</b> installieren möchten.]]></item>
+ <item name="wcf.global.wcfDir.dir"><![CDATA[Installationsverzeichnis]]></item>
+ <item name="wcf.global.wcfDir.dir.description"><![CDATA[Bitte geben Sie hier das Installationsverzeichnis für <b>WoltLab Community Framework</b> an.]]></item>
+ <item name="wcf.global.wcfDir.url.description"><![CDATA[Nach einer Installation in das angegebene Installationsverzeichnis ist <b>WoltLab Community Framework</b> über folgende Adresse (URL) erreichbar:]]></item>
+ <item name="wcf.global.wcfDir.error.invalid"><![CDATA[Das eingegebene Verzeichnis ist ungültig.]]></item>
+ <item name="wcf.global.ftp"><![CDATA[Eingabe der Zugangsdaten für FTP]]></item>
+ <item name="wcf.global.ftp.description"><![CDATA[Da auf Ihrem Server der PHP-SafeMode aktiviert ist, muss WoltLab Community Framework über die FTP-Funktionen installiert werden. Bitte geben Sie Benutzernamen und Kennwort für den FTP-Zugang zu diesem Server an. Die Daten werden nicht gespeichert oder weitergeleitet, sondern lediglich zur Installation dieses Paketes verwendet. Möglicherweise müssen Sie diese FTP-Zugangsdaten während dieser Installation mehrfach angeben.]]></item>
+ <item name="wcf.global.ftp.accessData"><![CDATA[Zugangsdaten für FTP]]></item>
+ <item name="wcf.global.ftp.host"><![CDATA[Hostname]]></item>
+ <item name="wcf.global.ftp.user"><![CDATA[Benutzername]]></item>
+ <item name="wcf.global.ftp.password"><![CDATA[Kennwort]]></item>
+ <item name="wcf.global.ftp.error"><![CDATA[Mit den angegebenen Zugangsdaten konnte keine Verbindung zu einem FTP-Server hergestellt werden.]]></item>
+ <item name="wcf.global.next"><![CDATA[Lade nächsten Schritt ...]]></item>
+ <item name="wcf.global.next.description"><![CDATA[Die Installation lädt im Moment den nächsten Schritt. Bitte haben Sie einen Augenblick Geduld.]]></item>
+ <item name="wcf.global.languages"><![CDATA[Sprachen wählen]]></item>
+ <item name="wcf.global.languages.description"><![CDATA[Sie können diese Software mehrsprachig betreiben. Bitte wählen Sie aus, welche Sprachen Sie installieren möchten.]]></item>
+ <item name="wcf.global.languages.charset"><![CDATA[Zeichenkodierung]]></item>
+ <item name="wcf.global.languages.charset.description"><![CDATA[Über die Zeichenkodierung wird die technische Speicherung und Darstellung von Sprachen beeinflusst. Bitte beachten Sie, dass die Zeichenkodierung zu einem späteren Zeitpunkt nicht mehr gewechselt werden kann.]]></item>
+
+ <!-- <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Die Verwendung von ISO-8859-1 wird empfohlen, wenn Sie ausschließlich westeuropäische Sprachen installieren möchten.]]></item>
+ <item name="wcf.global.languages.charset.UTF-8"><![CDATA[UTF-8 wird für den Betrieb von nicht westeuropäischen Sprachen benötigt. Wenn Sie jetzt oder zu einem späteren Zeitpunkt eine nicht westeuropäischen Sprache installieren möchten, müssen Sie hier UTF-8 auswählen.]]></item>-->
+
+ <item name="wcf.global.languages.charset.UTF-8"><![CDATA[Unicode]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Westeuropäisch]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-2"><![CDATA[Mitteleuropäisch]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-7"><![CDATA[Griechisch]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-8"><![CDATA[Hebräisch]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-9"><![CDATA[Türkisch]]></item>
+ <item name="wcf.global.languages.charset.EUC-JP"><![CDATA[Japanisch]]></item>
+ <item name="wcf.global.languages.charset.SJIS"><![CDATA[Japanisch]]></item>
+ <item name="wcf.global.languages.charset.BIG-5"><![CDATA[Chinesisch (traditionell)]]></item>
+ <item name="wcf.global.languages.charset.CP936"><![CDATA[Chinesisch (vereinfacht)]]></item>
+ <item name="wcf.global.languages.charset.EUC-CN"><![CDATA[Chinesisch (vereinfacht)]]></item>
+ <item name="wcf.global.languages.charset.KOI8-R"><![CDATA[Kyrillisch]]></item>
+ <item name="wcf.global.languages.charset.Windows-1251"><![CDATA[Kyrillisch]]></item>
+ <item name="wcf.global.languages.charset.EUC-KR"><![CDATA[Koreanisch]]></item>
+
+ <item name="wcf.global.languages.languages"><![CDATA[Sprachen]]></item>
+ <item name="wcf.global.languages.error.empty"><![CDATA[Bitte wählen Sie mindestens eine Sprache aus!]]></item>
+ <item name="wcf.global.languages.error.notAvailable"><![CDATA[Sie haben Sprachen ausgewählt, die in der gleichzeitig ausgewählten Zeichencodierung nicht zur Verfügung stehen. Bitte korrigieren Sie Ihre Auswahl.]]></item>
+ <item name="wcf.global.configureDB"><![CDATA[Datenbankzugang konfigurieren]]></item>
+ <item name="wcf.global.configureDB.description"><![CDATA[Die Daten der Software werden in einer SQL Datenbank gespeichert. Bitte geben Sie die Zugangsdaten für diese Datenbank an!]]></item>
+ <item name="wcf.global.configureDB.accessData"><![CDATA[Datenbankzugangsdaten]]></item>
+ <item name="wcf.global.configureDB.host"><![CDATA[Hostname]]></item>
+ <item name="wcf.global.configureDB.user"><![CDATA[Benutzername]]></item>
+ <item name="wcf.global.configureDB.password"><![CDATA[Kennwort]]></item>
+ <item name="wcf.global.configureDB.database"><![CDATA[Datenbankname]]></item>
+ <item name="wcf.global.configureDB.number"><![CDATA[Installationsnummer]]></item>
+ <item name="wcf.global.configureDB.error"><![CDATA[Beim Verbindungsversuch mit der Datenbank ist folgender Fehler aufgetreten:
+ <br /><b>{$exception->getMessage()}{if $exception|get_class == 'DatabaseException'}<br />{$exception->getErrorDesc()}{/if}</b>
+ <br />Weitere Informationen zu diesem Problem erhalten Sie im Nachschlagewerk von WoltLab:
+ <br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>
+ <item name="wcf.global.configureDB.conflictedTables"><![CDATA[Folgende Tabelle{if $conflictedTables|count > 1}n{/if} existier{if $conflictedTables|count > 1}en{else}t{/if} schon in der Datenbank »{$dbName}«:<br />{implode from=$conflictedTables item="table"}{$table}{/implode}.<br /><br />Um dieses Problem zu beheben, können Sie:<br />1. diese Tabelle{if $conflictedTables|count > 1}n{/if} überschreiben, indem Sie die »Überschreiben« Option aktivieren und die »Weiter« Schaltfläche betätigen, oder<br />2. Sie geben die Daten einer anderen Datenbank ein und betätigen die »Weiter« Schaltfläche, oder<br />3. Sie geben eine von »{$dbNumber}« unterschiedliche Installationsnummer an und betätigen die »Weiter« Schaltfläche.]]></item>
+ <item name="wcf.global.configureDB.conflictedTables.overwrite"><![CDATA[Oben genannte Tabelle{if $conflictedTables|count > 1}n{/if} überschreiben]]></item>
+ <item name="wcf.global.configureDB.class"><![CDATA[Datenbank-Typ]]></item>
+ <item name="wcf.global.configureDB.class.MSSQLDatabase"><![CDATA[Microsoft SQL Server 2008+]]></item>
+ <item name="wcf.global.configureDB.class.MySQLDatabase"><![CDATA[MySQL 5.1+]]></item>
+ <item name="wcf.global.configureDB.class.PostgreSQLDatabase"><![CDATA[PostgreSQL 8.2+]]></item>
+ <item name="wcf.global.createUser"><![CDATA[Administrator erstellen]]></item>
+ <item name="wcf.global.createUser.description"><![CDATA[Der Installationsassistent erstellt nun ein Administrator-Konto für Sie. Bitte geben Sie dazu einen Benutzernamen, eine E-Mail-Adresse und ein Kennwort ein.]]></item>
+ <item name="wcf.global.createUser.data"><![CDATA[Benutzerdaten]]></item>
+ <item name="wcf.global.createUser.username"><![CDATA[Benutzername]]></item>
+ <item name="wcf.global.createUser.email"><![CDATA[E-Mail-Adresse]]></item>
+ <item name="wcf.global.createUser.confirmEmail"><![CDATA[E-Mail-Adresse wiederholen]]></item>
+ <item name="wcf.global.createUser.password"><![CDATA[Kennwort]]></item>
+ <item name="wcf.global.createUser.confirmPassword"><![CDATA[Kennwort wiederholen]]></item>
+ <item name="wcf.global.createUser.error"><![CDATA[Es sind Fehler bei Ihrer Registrierung aufgetreten. Bitte überprüfen Sie die markierten Felder.]]></item>
+ <item name="wcf.global.createUser.error.empty"><![CDATA[Bitte füllen Sie dieses Eingabefeld aus.]]></item>
+ <item name="wcf.global.createUser.error.username.notValid"><![CDATA[Der eingegebene Benutzername ist ungültig. Ein gültiger Benutzername muss mindestens 3 und maximal 20 Zeichen lang sein.]]></item>
+ <item name="wcf.global.createUser.error.email.notValid"><![CDATA[Die eingegebene E-Mail-Adresse ist ungültig. Eine gültige E-Mail-Adresse muss dem Format name@domain.tld entsprechen.]]></item>
+ <item name="wcf.global.createUser.error.confirmEmail.notEqual"><![CDATA[Die eingegebenen E-Mail-Adressen sind nicht identisch. Bitte tragen Sie zur Sicherheit in beide Eingabefelder die selbe E-Mail-Adresse ein.]]></item>
+ <item name="wcf.global.createUser.error.confirmPassword.notEqual"><![CDATA[Die eingegebenen Kennwörter sind nicht identisch. Bitte tragen Sie zur Sicherheit in beide Eingabefelder das selbe Kennwort ein.]]></item>
+ <item name="wcf.global.wcfDir.error"><![CDATA[Beim Versuch die Dateien zu entpacken, ist folgender Fehler aufgetreten:
+ <br /><b>{$exception->getMessage()}</b><br />
+ Bitte kontrollieren Sie, ob das Zielverzeichnis existiert und beschreibbar ist.
+ <br /><br />Weitere Informationen zu diesem Problem erhalten Sie im Nachschlagewerk von WoltLab:<br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>
+ </category>
+</language>
-<?xml version="1.0" encoding="UTF-8"?>\r
-<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="en">\r
- <category name="wcf.global">\r
- <item name="wcf.global.pageTitle"><![CDATA[{$setupPackageName} Installation]]></item>\r
- <item name="wcf.global.title"><![CDATA[<b>{$setupPackageName}</b><br />Installation]]></item>\r
- <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item> <!-- system variable; do not translate -->\r
- <item name="wcf.global.locale.unix"><![CDATA[en_US]]></item> <!-- system variable; do not translate -->\r
- <item name="wcf.global.locale.win"><![CDATA[english]]></item> <!-- system variable; do not translate -->\r
- <item name="wcf.global.decimalPoint"><![CDATA[.]]></item>\r
- <item name="wcf.global.thousandsSeparator"><![CDATA[,]]></item>\r
- <item name="wcf.global.button.next"><![CDATA[Next »]]></item>\r
- <item name="wcf.global.progressBar"><![CDATA[{@$progress}% complete]]></item>\r
- <item name="wcf.global.dateMethod"><![CDATA[date]]></item> <!-- system variable; do not translate -->\r
- <item name="wcf.global.dateFormat"><![CDATA[M jS Y]]></item>\r
- <item name="wcf.global.timeFormat"><![CDATA[l, F jS Y, g:ia]]></item>\r
- <item name="wcf.global.dateFormatToday"><![CDATA[<b>\T\o\d\a\y</b>, g:ia]]></item>\r
- <item name="wcf.global.dateFormatYesterday"><![CDATA[\Y\e\s\t\e\r\d\a\y, g:ia]]></item>\r
- <item name="wcf.global.welcome"><![CDATA[Thank you for choosing {$setupPackageName}]]></item>\r
- <item name="wcf.global.welcome.description"><![CDATA[This installations-assistant will help you to setup <br /><b>WoltLab Community Framework</b>{if $setupPackageName != 'WoltLab Community Framework'} and <b>{$setupPackageName}</b>{/if}.]]></item>\r
- <item name="wcf.global.welcome.language"><![CDATA[Language]]></item>\r
- <item name="wcf.global.language.en"><![CDATA[English]]></item>\r
- <item name="wcf.global.language.de"><![CDATA[German]]></item>\r
- <item name="wcf.global.language.de-informal"><![CDATA[German (Informal)]]></item>\r
- <item name="wcf.global.language.fr"><![CDATA[French]]></item>\r
- <item name="wcf.global.language.ja"><![CDATA[Japanese]]></item>\r
- <item name="wcf.global.language.es"><![CDATA[Spanish]]></item>\r
- <item name="wcf.global.language.zh-TW"><![CDATA[Chinese (Traditional)]]></item>\r
- <item name="wcf.global.language.zh-CN"><![CDATA[Chinese (Simplified)]]></item>\r
- <item name="wcf.global.language.it"><![CDATA[Italian]]></item>\r
- <item name="wcf.global.language.nl"><![CDATA[Dutch]]></item>\r
- <item name="wcf.global.language.ru"><![CDATA[Russian]]></item>\r
- <item name="wcf.global.language.ko"><![CDATA[Korean]]></item>\r
- <item name="wcf.global.language.pt"><![CDATA[Portuguese]]></item>\r
- <item name="wcf.global.language.pt-BR"><![CDATA[Portuguese (Brazil)]]></item>\r
- <item name="wcf.global.language.sv"><![CDATA[Swedish]]></item>\r
- <item name="wcf.global.language.pl"><![CDATA[Polish]]></item>\r
- <item name="wcf.global.language.da"><![CDATA[Danish]]></item>\r
- <item name="wcf.global.language.cs"><![CDATA[Czech]]></item>\r
- <item name="wcf.global.language.tr"><![CDATA[Turkish]]></item>\r
- <item name="wcf.global.language.hu"><![CDATA[Hungarian]]></item>\r
- <item name="wcf.global.language.ar"><![CDATA[Arabic]]></item>\r
- <item name="wcf.global.language.he"><![CDATA[Hebrew]]></item>\r
- <item name="wcf.global.language.fa"><![CDATA[Persian]]></item>\r
- <item name="wcf.global.language.no"><![CDATA[Norwegian]]></item>\r
- <item name="wcf.global.language.fi"><![CDATA[Finnish]]></item>\r
- <item name="wcf.global.language.ro"><![CDATA[Romanian]]></item>\r
- <item name="wcf.global.language.bs"><![CDATA[Bosnian]]></item>\r
- <item name="wcf.global.language.hr"><![CDATA[Croatian]]></item>\r
- <item name="wcf.global.language.sr"><![CDATA[Serbian]]></item>\r
- <item name="wcf.global.language.sk"><![CDATA[Slovak]]></item>\r
- <item name="wcf.global.language.el"><![CDATA[Greek]]></item>\r
- <item name="wcf.global.welcome.language.description"><![CDATA[The assistants language is currently set to English.]]></item>\r
- <item name="wcf.global.welcome.language.change"><![CDATA[Change language]]></item>\r
- <item name="wcf.global.license"><![CDATA[License Agreement]]></item>\r
- <item name="wcf.global.license.description"><![CDATA[Please read the following License Agreement. Use the scrollbar to view the whole document.]]></item>\r
- <item name="wcf.global.license.accept.description"><![CDATA[Do you accept the terms and conditions of the License Agreement? You may only install this software upon acceptance of the License Agreement.]]></item>\r
- <item name="wcf.global.license.missingAcception"><![CDATA[You must accept the License Agreement to continue this installation.]]></item>\r
- <item name="wcf.global.systemRequirements"><![CDATA[Checking System Requirements]]></item>\r
- <item name="wcf.global.systemRequirements.description"><![CDATA[These are the System Requirements:]]></item>\r
- <item name="wcf.global.systemRequirements.required"><![CDATA[Required System component]]></item>\r
- <item name="wcf.global.systemRequirements.recommended"><![CDATA[Recommended System component]]></item>\r
- <item name="wcf.global.systemRequirements.element.required"><![CDATA[Required:]]></item>\r
- <item name="wcf.global.systemRequirements.element.yours"><![CDATA[Found:]]></item>\r
- <item name="wcf.global.systemRequirements.element.recommended"><![CDATA[Recommended:]]></item>\r
- <item name="wcf.global.systemRequirements.php"><![CDATA[Installed version of the Script language "PHP"]]></item>\r
- <item name="wcf.global.systemRequirements.php.description"><![CDATA[The installed version of the Script language "PHP" is too old for a stable operation of this Software. To proceed with the installation, a version update is necessary.]]></item>\r
- <item name="wcf.global.systemRequirements.php.description2"><![CDATA[Your PHP Version is obsolete. For a stable operation of this Software, we recommend a PHP version of 5.0.5 or greater.]]></item>\r
- <item name="wcf.global.systemRequirements.mysql"><![CDATA["MySQL" Database support]]></item>\r
- <item name="wcf.global.systemRequirements.mysql.description"><![CDATA["MySQL" Database support is required to install this Software.]]></item>\r
- <item name="wcf.global.systemRequirements.uploadMaxFilesize"><![CDATA[Maximum size for file uploads]]></item>\r
- <item name="wcf.global.systemRequirements.uploadMaxFilesize.description"><![CDATA[The current configuration of the installed "PHP" makes it impossible to upload any files. Due to this configuration, some features of this Software will be restricted.]]></item>\r
- <item name="wcf.global.systemRequirements.gdLib"><![CDATA[Installed version of the graphics library "GDLib"]]></item>\r
- <item name="wcf.global.systemRequirements.gdLib.description"><![CDATA[The graphics library "GDLib" is needed for the Dynamic Generation of Images. Without this, some features of this Software will not be available.]]></item>\r
- <item name="wcf.global.systemRequirements.mbString"><![CDATA[The multibyte character library "MBString"]]></item>\r
- <item name="wcf.global.systemRequirements.mbString.description"><![CDATA[Without this library, the Software can only be used with Western European languages.]]></item>\r
- <item name="wcf.global.systemRequirements.safeMode"><![CDATA[Security option of "safe mode" in the "PHP" Script language]]></item>\r
- <item name="wcf.global.systemRequirements.safeMode.description"><![CDATA[To quarantee the operation of this Software, we recommend to disable the safe mode setting.]]></item>\r
- <item name="wcf.global.systemRequirements.ftp"><![CDATA[The data transfer library for FTP]]></item>\r
- <item name="wcf.global.systemRequirements.ftp.description"><![CDATA[With the security option of "safe mode" being enabled, the data transfer library is needed for most of the file operations within this Software. We strongly recommend to enable this library.]]></item>\r
- <item name="wcf.global.systemRequirements.active"><![CDATA[Enabled]]></item>\r
- <item name="wcf.global.systemRequirements.notActive"><![CDATA[Not enabled]]></item>\r
- <item name="wcf.global.wcfDir"><![CDATA[Choose the installation folder]]></item>\r
- <item name="wcf.global.wcfDir.description"><![CDATA[All files of <b>WoltLab Community Framework</b> will be extracted into the installation folder.]]></item>\r
- <item name="wcf.global.wcfDir.foundDirectory"><![CDATA[The installation assistant has found a previous installation of <b>WoltLab Community Framework</b> in the "{$foundDirectory}" folder.<br />If you would like to install a new copy of the <b>WoltLab Community Framework</b>, then please enter an alternative installation folder.]]></item>\r
- <item name="wcf.global.wcfDir.dir"><![CDATA[Installation folder]]></item>\r
- <item name="wcf.global.wcfDir.dir.description"><![CDATA[Please enter the installation folder for <b>WoltLab Community Framework</b>.]]></item>\r
- <item name="wcf.global.wcfDir.url.description"><![CDATA[After installation into the given folder you can access <b>WoltLab Community Framework</b> through the following URL:]]></item>\r
- <item name="wcf.global.wcfDir.error.invalid"><![CDATA[The given folder is not valid.]]></item>\r
- <item name="wcf.global.ftp"><![CDATA[FTP access information]]></item>\r
- <item name="wcf.global.ftp.description"><![CDATA[With the PHP-SafeMode security option being enabled, WoltLab Community Framework can only be installed using FTP functionality. Please enter here the FTP Username and Password for this Server. The information given will not be saved and is only required for the installation of this Package. For this reason alone, further FTP Username and Password requests will be needed.]]></item>\r
- <item name="wcf.global.ftp.accessData"><![CDATA[FTP access information]]></item>\r
- <item name="wcf.global.ftp.host"><![CDATA[Hostname]]></item>\r
- <item name="wcf.global.ftp.user"><![CDATA[Username]]></item>\r
- <item name="wcf.global.ftp.password"><![CDATA[Password]]></item>\r
- <item name="wcf.global.ftp.error"><![CDATA[A connection to the given FTP server could not be made.]]></item>\r
- <item name="wcf.global.next"><![CDATA[Loading next step ...]]></item>\r
- <item name="wcf.global.next.description"><![CDATA[The installation is currently loading the next step, please wait.]]></item>\r
- <item name="wcf.global.languages"><![CDATA[Choose languages to install]]></item>\r
- <item name="wcf.global.languages.description"><![CDATA[This Software can support multiple languages. Please choose the languages you would like to install.]]></item>\r
- <item name="wcf.global.languages.charset"><![CDATA[Character Encoding]]></item>\r
- <item name="wcf.global.languages.charset.description"><![CDATA[The Character Encoding, also known as the Character Set or the Code page determines the storage type and the representation of the installed languages of this System. Please be aware that once you have set your chosen Character Encoding, this can not be changed afterwards.]]></item>\r
- \r
- <!--<item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[ISO-8859-1 is required if you wish to install Western European languages only.]]></item>\r
- <item name="wcf.global.languages.charset.UTF-8"><![CDATA[UTF-8 is required if you wish to install Western European or any Non-Western European langauges, now or at a later date.]]></item>-->\r
- \r
- <item name="wcf.global.languages.charset.UTF-8"><![CDATA[Unicode]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Western European]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-2"><![CDATA[Central European]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-7"><![CDATA[Greek]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-8"><![CDATA[Hebrew]]></item>\r
- <item name="wcf.global.languages.charset.ISO-8859-9"><![CDATA[Turkish]]></item>\r
- <item name="wcf.global.languages.charset.EUC-JP"><![CDATA[Japanese]]></item>\r
- <item name="wcf.global.languages.charset.SJIS"><![CDATA[Japanese]]></item>\r
- <item name="wcf.global.languages.charset.BIG-5"><![CDATA[Chinese (Traditional)]]></item>\r
- <item name="wcf.global.languages.charset.CP936"><![CDATA[Chinese (Simplified)]]></item>\r
- <item name="wcf.global.languages.charset.EUC-CN"><![CDATA[Chinese (Simplified)]]></item>\r
- <item name="wcf.global.languages.charset.KOI8-R"><![CDATA[Cyrillic]]></item>\r
- <item name="wcf.global.languages.charset.Windows-1251"><![CDATA[Cyrillic]]></item>\r
- <item name="wcf.global.languages.charset.EUC-KR"><![CDATA[Korean]]></item>\r
- \r
- <item name="wcf.global.languages.languages"><![CDATA[Languages]]></item>\r
- <item name="wcf.global.languages.error.empty"><![CDATA[Please choose at least one language!]]></item>\r
- <item name="wcf.global.languages.error.notAvailable"><![CDATA[The languages you have chosen do not correspond to the given Character Encoding you made previously. Please amend your language choice.]]></item>\r
- <item name="wcf.global.configureDB"><![CDATA[Configure Database access]]></item>\r
- <item name="wcf.global.configureDB.description"><![CDATA[The Data for this Software needs to be stored in a MySQL Database. Please enter your Database access information!]]></item>\r
- <item name="wcf.global.configureDB.accessData"><![CDATA[Database access information]]></item>\r
- <item name="wcf.global.configureDB.host"><![CDATA[Hostname]]></item>\r
- <item name="wcf.global.configureDB.user"><![CDATA[Username]]></item>\r
- <item name="wcf.global.configureDB.password"><![CDATA[Password]]></item>\r
- <item name="wcf.global.configureDB.database"><![CDATA[Database name]]></item>\r
- <item name="wcf.global.configureDB.number"><![CDATA[Installations number]]></item>\r
- <item name="wcf.global.configureDB.error"><![CDATA[An Error has accured while trying to connect to your Database:\r
- <br /><b>{$exception->getMessage()}{if $exception|get_class == 'DatabaseException'}<br />{$exception->getErrorDesc()}{/if}</b>\r
- <br />Additional information can be found in the WoltLab Error Reference:\r
- <br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>\r
- <item name="wcf.global.configureDB.conflictedTables"><![CDATA[The following table{if $conflictedTables|count > 1}s{/if} already exist{if $conflictedTables|count == 1}s{/if} within your "{$dbName}" Database:<br />{implode from=$conflictedTables item="table"}{$table}{/implode}.<br /><br />To solve this problem, please do one of the following:<br />1. Enable the "Overwrite" option below to overwrite {if $conflictedTables|count > 1}these tables{else}this table{/if} and continue the installation with the "Next" Button or<br />2. You re-enter the Database access information, but to a different Database and continue the installation with the "Next" Button or<br />3. You enter a new Installations number, not forgetting to continue the installation with the "Next" Button.]]></item>\r
- <item name="wcf.global.configureDB.conflictedTables.overwrite"><![CDATA[Overwrite the above listed table{if $conflictedTables|count > 1}s{/if}?]]></item>\r
- <item name="wcf.global.configureDB.class"><![CDATA[Database type]]></item>\r
- <item name="wcf.global.configureDB.class.MSSQLDatabase"><![CDATA[Microsoft SQL Server 2008+]]></item>\r
- <item name="wcf.global.configureDB.class.MySQLDatabase"><![CDATA[MySQL 5.1+]]></item>\r
- <item name="wcf.global.configureDB.class.PostgreSQLDatabase"><![CDATA[PostgreSQL 8.2+]]></item>\r
- <item name="wcf.global.createUser"><![CDATA[Create an Administrator]]></item>\r
- <item name="wcf.global.createUser.description"><![CDATA[The Installation will now generate an Administrator account for you. Please give a username, email address and password.]]></item>\r
- <item name="wcf.global.createUser.data"><![CDATA[User information]]></item>\r
- <item name="wcf.global.createUser.username"><![CDATA[Username]]></item>\r
- <item name="wcf.global.createUser.email"><![CDATA[E-Mail Address]]></item>\r
- <item name="wcf.global.createUser.confirmEmail"><![CDATA[Confirm E-Mail Address]]></item>\r
- <item name="wcf.global.createUser.password"><![CDATA[Password]]></item>\r
- <item name="wcf.global.createUser.confirmPassword"><![CDATA[Confirm Password]]></item>\r
- <item name="wcf.global.createUser.error"><![CDATA[Errors have accured while registering the User account, please check the marked fields for errors.]]></item>\r
- <item name="wcf.global.createUser.error.empty"><![CDATA[This field can not be left empty.]]></item>\r
- <item name="wcf.global.createUser.error.username.notValid"><![CDATA[The Username you have given is invalid. A valid Username must be between 3 and 20 characters long.]]></item>\r
- <item name="wcf.global.createUser.error.email.notValid"><![CDATA[The E-Mail Address you have given is invalid. A valid E-Mail Address must be in the format of name@domain.tld]]></item>\r
- <item name="wcf.global.createUser.error.confirmEmail.notEqual"><![CDATA[The E-Mail Addresses you have given are not identical. For security reasons, please make sure that both E-Mail Address fields have been filled in and are identical.]]></item>\r
- <item name="wcf.global.createUser.error.confirmPassword.notEqual"><![CDATA[The Passwords you have given are not identical. For security reasons, please make sure that both Password fields have been filled in and are identical.]]></item>\r
- <item name="wcf.global.wcfDir.error"><![CDATA[An Error has accured while extracting the required files:\r
- <br /><b>{$exception->getMessage()}</b><br />\r
- Please make sure that the destination folder exists and can be written to.\r
- <br /><br />Additional information can be found in the WoltLab Error Reference:<br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>\r
- </category>\r
-</language>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<language xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/maelstrom/language.xsd" languagecode="en">
+ <category name="wcf.global">
+ <item name="wcf.global.pageTitle"><![CDATA[{$setupPackageName} Installation]]></item>
+ <item name="wcf.global.title"><![CDATA[<b>{$setupPackageName}</b><br />Installation]]></item>
+ <item name="wcf.global.pageDirection"><![CDATA[ltr]]></item> <!-- system variable; do not translate -->
+ <item name="wcf.global.locale.unix"><![CDATA[en_US]]></item> <!-- system variable; do not translate -->
+ <item name="wcf.global.locale.win"><![CDATA[english]]></item> <!-- system variable; do not translate -->
+ <item name="wcf.global.decimalPoint"><![CDATA[.]]></item>
+ <item name="wcf.global.thousandsSeparator"><![CDATA[,]]></item>
+ <item name="wcf.global.button.next"><![CDATA[Next »]]></item>
+ <item name="wcf.global.progressBar"><![CDATA[{@$progress}% complete]]></item>
+ <item name="wcf.global.dateMethod"><![CDATA[date]]></item> <!-- system variable; do not translate -->
+ <item name="wcf.global.dateFormat"><![CDATA[M jS Y]]></item>
+ <item name="wcf.global.timeFormat"><![CDATA[l, F jS Y, g:ia]]></item>
+ <item name="wcf.global.dateFormatToday"><![CDATA[<b>\T\o\d\a\y</b>, g:ia]]></item>
+ <item name="wcf.global.dateFormatYesterday"><![CDATA[\Y\e\s\t\e\r\d\a\y, g:ia]]></item>
+ <item name="wcf.global.welcome"><![CDATA[Thank you for choosing {$setupPackageName}]]></item>
+ <item name="wcf.global.welcome.description"><![CDATA[This installations-assistant will help you to setup <br /><b>WoltLab Community Framework</b>{if $setupPackageName != 'WoltLab Community Framework'} and <b>{$setupPackageName}</b>{/if}.]]></item>
+ <item name="wcf.global.welcome.language"><![CDATA[Language]]></item>
+ <item name="wcf.global.language.en"><![CDATA[English]]></item>
+ <item name="wcf.global.language.de"><![CDATA[German]]></item>
+ <item name="wcf.global.language.de-informal"><![CDATA[German (Informal)]]></item>
+ <item name="wcf.global.language.fr"><![CDATA[French]]></item>
+ <item name="wcf.global.language.ja"><![CDATA[Japanese]]></item>
+ <item name="wcf.global.language.es"><![CDATA[Spanish]]></item>
+ <item name="wcf.global.language.zh-TW"><![CDATA[Chinese (Traditional)]]></item>
+ <item name="wcf.global.language.zh-CN"><![CDATA[Chinese (Simplified)]]></item>
+ <item name="wcf.global.language.it"><![CDATA[Italian]]></item>
+ <item name="wcf.global.language.nl"><![CDATA[Dutch]]></item>
+ <item name="wcf.global.language.ru"><![CDATA[Russian]]></item>
+ <item name="wcf.global.language.ko"><![CDATA[Korean]]></item>
+ <item name="wcf.global.language.pt"><![CDATA[Portuguese]]></item>
+ <item name="wcf.global.language.pt-BR"><![CDATA[Portuguese (Brazil)]]></item>
+ <item name="wcf.global.language.sv"><![CDATA[Swedish]]></item>
+ <item name="wcf.global.language.pl"><![CDATA[Polish]]></item>
+ <item name="wcf.global.language.da"><![CDATA[Danish]]></item>
+ <item name="wcf.global.language.cs"><![CDATA[Czech]]></item>
+ <item name="wcf.global.language.tr"><![CDATA[Turkish]]></item>
+ <item name="wcf.global.language.hu"><![CDATA[Hungarian]]></item>
+ <item name="wcf.global.language.ar"><![CDATA[Arabic]]></item>
+ <item name="wcf.global.language.he"><![CDATA[Hebrew]]></item>
+ <item name="wcf.global.language.fa"><![CDATA[Persian]]></item>
+ <item name="wcf.global.language.no"><![CDATA[Norwegian]]></item>
+ <item name="wcf.global.language.fi"><![CDATA[Finnish]]></item>
+ <item name="wcf.global.language.ro"><![CDATA[Romanian]]></item>
+ <item name="wcf.global.language.bs"><![CDATA[Bosnian]]></item>
+ <item name="wcf.global.language.hr"><![CDATA[Croatian]]></item>
+ <item name="wcf.global.language.sr"><![CDATA[Serbian]]></item>
+ <item name="wcf.global.language.sk"><![CDATA[Slovak]]></item>
+ <item name="wcf.global.language.el"><![CDATA[Greek]]></item>
+ <item name="wcf.global.welcome.language.description"><![CDATA[The assistants language is currently set to English.]]></item>
+ <item name="wcf.global.welcome.language.change"><![CDATA[Change language]]></item>
+ <item name="wcf.global.license"><![CDATA[License Agreement]]></item>
+ <item name="wcf.global.license.description"><![CDATA[Please read the following License Agreement. Use the scrollbar to view the whole document.]]></item>
+ <item name="wcf.global.license.accept.description"><![CDATA[Do you accept the terms and conditions of the License Agreement? You may only install this software upon acceptance of the License Agreement.]]></item>
+ <item name="wcf.global.license.missingAcception"><![CDATA[You must accept the License Agreement to continue this installation.]]></item>
+ <item name="wcf.global.systemRequirements"><![CDATA[Checking System Requirements]]></item>
+ <item name="wcf.global.systemRequirements.description"><![CDATA[These are the System Requirements:]]></item>
+ <item name="wcf.global.systemRequirements.required"><![CDATA[Required System component]]></item>
+ <item name="wcf.global.systemRequirements.recommended"><![CDATA[Recommended System component]]></item>
+ <item name="wcf.global.systemRequirements.element.required"><![CDATA[Required:]]></item>
+ <item name="wcf.global.systemRequirements.element.yours"><![CDATA[Found:]]></item>
+ <item name="wcf.global.systemRequirements.element.recommended"><![CDATA[Recommended:]]></item>
+ <item name="wcf.global.systemRequirements.php"><![CDATA[Installed version of the Script language "PHP"]]></item>
+ <item name="wcf.global.systemRequirements.php.description"><![CDATA[The installed version of the Script language "PHP" is too old for a stable operation of this Software. To proceed with the installation, a version update is necessary.]]></item>
+ <item name="wcf.global.systemRequirements.php.description2"><![CDATA[Your PHP Version is obsolete. For a stable operation of this Software, we recommend a PHP version of 5.0.5 or greater.]]></item>
+ <item name="wcf.global.systemRequirements.mysql"><![CDATA["MySQL" Database support]]></item>
+ <item name="wcf.global.systemRequirements.mysql.description"><![CDATA["MySQL" Database support is required to install this Software.]]></item>
+ <item name="wcf.global.systemRequirements.uploadMaxFilesize"><![CDATA[Maximum size for file uploads]]></item>
+ <item name="wcf.global.systemRequirements.uploadMaxFilesize.description"><![CDATA[The current configuration of the installed "PHP" makes it impossible to upload any files. Due to this configuration, some features of this Software will be restricted.]]></item>
+ <item name="wcf.global.systemRequirements.gdLib"><![CDATA[Installed version of the graphics library "GDLib"]]></item>
+ <item name="wcf.global.systemRequirements.gdLib.description"><![CDATA[The graphics library "GDLib" is needed for the Dynamic Generation of Images. Without this, some features of this Software will not be available.]]></item>
+ <item name="wcf.global.systemRequirements.mbString"><![CDATA[The multibyte character library "MBString"]]></item>
+ <item name="wcf.global.systemRequirements.mbString.description"><![CDATA[Without this library, the Software can only be used with Western European languages.]]></item>
+ <item name="wcf.global.systemRequirements.safeMode"><![CDATA[Security option of "safe mode" in the "PHP" Script language]]></item>
+ <item name="wcf.global.systemRequirements.safeMode.description"><![CDATA[To quarantee the operation of this Software, we recommend to disable the safe mode setting.]]></item>
+ <item name="wcf.global.systemRequirements.ftp"><![CDATA[The data transfer library for FTP]]></item>
+ <item name="wcf.global.systemRequirements.ftp.description"><![CDATA[With the security option of "safe mode" being enabled, the data transfer library is needed for most of the file operations within this Software. We strongly recommend to enable this library.]]></item>
+ <item name="wcf.global.systemRequirements.active"><![CDATA[Enabled]]></item>
+ <item name="wcf.global.systemRequirements.notActive"><![CDATA[Not enabled]]></item>
+ <item name="wcf.global.wcfDir"><![CDATA[Choose the installation folder]]></item>
+ <item name="wcf.global.wcfDir.description"><![CDATA[All files of <b>WoltLab Community Framework</b> will be extracted into the installation folder.]]></item>
+ <item name="wcf.global.wcfDir.foundDirectory"><![CDATA[The installation assistant has found a previous installation of <b>WoltLab Community Framework</b> in the "{$foundDirectory}" folder.<br />If you would like to install a new copy of the <b>WoltLab Community Framework</b>, then please enter an alternative installation folder.]]></item>
+ <item name="wcf.global.wcfDir.dir"><![CDATA[Installation folder]]></item>
+ <item name="wcf.global.wcfDir.dir.description"><![CDATA[Please enter the installation folder for <b>WoltLab Community Framework</b>.]]></item>
+ <item name="wcf.global.wcfDir.url.description"><![CDATA[After installation into the given folder you can access <b>WoltLab Community Framework</b> through the following URL:]]></item>
+ <item name="wcf.global.wcfDir.error.invalid"><![CDATA[The given folder is not valid.]]></item>
+ <item name="wcf.global.ftp"><![CDATA[FTP access information]]></item>
+ <item name="wcf.global.ftp.description"><![CDATA[With the PHP-SafeMode security option being enabled, WoltLab Community Framework can only be installed using FTP functionality. Please enter here the FTP Username and Password for this Server. The information given will not be saved and is only required for the installation of this Package. For this reason alone, further FTP Username and Password requests will be needed.]]></item>
+ <item name="wcf.global.ftp.accessData"><![CDATA[FTP access information]]></item>
+ <item name="wcf.global.ftp.host"><![CDATA[Hostname]]></item>
+ <item name="wcf.global.ftp.user"><![CDATA[Username]]></item>
+ <item name="wcf.global.ftp.password"><![CDATA[Password]]></item>
+ <item name="wcf.global.ftp.error"><![CDATA[A connection to the given FTP server could not be made.]]></item>
+ <item name="wcf.global.next"><![CDATA[Loading next step ...]]></item>
+ <item name="wcf.global.next.description"><![CDATA[The installation is currently loading the next step, please wait.]]></item>
+ <item name="wcf.global.languages"><![CDATA[Choose languages to install]]></item>
+ <item name="wcf.global.languages.description"><![CDATA[This Software can support multiple languages. Please choose the languages you would like to install.]]></item>
+ <item name="wcf.global.languages.charset"><![CDATA[Character Encoding]]></item>
+ <item name="wcf.global.languages.charset.description"><![CDATA[The Character Encoding, also known as the Character Set or the Code page determines the storage type and the representation of the installed languages of this System. Please be aware that once you have set your chosen Character Encoding, this can not be changed afterwards.]]></item>
+
+ <!--<item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[ISO-8859-1 is required if you wish to install Western European languages only.]]></item>
+ <item name="wcf.global.languages.charset.UTF-8"><![CDATA[UTF-8 is required if you wish to install Western European or any Non-Western European langauges, now or at a later date.]]></item>-->
+
+ <item name="wcf.global.languages.charset.UTF-8"><![CDATA[Unicode]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-1"><![CDATA[Western European]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-2"><![CDATA[Central European]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-7"><![CDATA[Greek]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-8"><![CDATA[Hebrew]]></item>
+ <item name="wcf.global.languages.charset.ISO-8859-9"><![CDATA[Turkish]]></item>
+ <item name="wcf.global.languages.charset.EUC-JP"><![CDATA[Japanese]]></item>
+ <item name="wcf.global.languages.charset.SJIS"><![CDATA[Japanese]]></item>
+ <item name="wcf.global.languages.charset.BIG-5"><![CDATA[Chinese (Traditional)]]></item>
+ <item name="wcf.global.languages.charset.CP936"><![CDATA[Chinese (Simplified)]]></item>
+ <item name="wcf.global.languages.charset.EUC-CN"><![CDATA[Chinese (Simplified)]]></item>
+ <item name="wcf.global.languages.charset.KOI8-R"><![CDATA[Cyrillic]]></item>
+ <item name="wcf.global.languages.charset.Windows-1251"><![CDATA[Cyrillic]]></item>
+ <item name="wcf.global.languages.charset.EUC-KR"><![CDATA[Korean]]></item>
+
+ <item name="wcf.global.languages.languages"><![CDATA[Languages]]></item>
+ <item name="wcf.global.languages.error.empty"><![CDATA[Please choose at least one language!]]></item>
+ <item name="wcf.global.languages.error.notAvailable"><![CDATA[The languages you have chosen do not correspond to the given Character Encoding you made previously. Please amend your language choice.]]></item>
+ <item name="wcf.global.configureDB"><![CDATA[Configure Database access]]></item>
+ <item name="wcf.global.configureDB.description"><![CDATA[The Data for this Software needs to be stored in a MySQL Database. Please enter your Database access information!]]></item>
+ <item name="wcf.global.configureDB.accessData"><![CDATA[Database access information]]></item>
+ <item name="wcf.global.configureDB.host"><![CDATA[Hostname]]></item>
+ <item name="wcf.global.configureDB.user"><![CDATA[Username]]></item>
+ <item name="wcf.global.configureDB.password"><![CDATA[Password]]></item>
+ <item name="wcf.global.configureDB.database"><![CDATA[Database name]]></item>
+ <item name="wcf.global.configureDB.number"><![CDATA[Installations number]]></item>
+ <item name="wcf.global.configureDB.error"><![CDATA[An Error has accured while trying to connect to your Database:
+ <br /><b>{$exception->getMessage()}{if $exception|get_class == 'DatabaseException'}<br />{$exception->getErrorDesc()}{/if}</b>
+ <br />Additional information can be found in the WoltLab Error Reference:
+ <br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>
+ <item name="wcf.global.configureDB.conflictedTables"><![CDATA[The following table{if $conflictedTables|count > 1}s{/if} already exist{if $conflictedTables|count == 1}s{/if} within your "{$dbName}" Database:<br />{implode from=$conflictedTables item="table"}{$table}{/implode}.<br /><br />To solve this problem, please do one of the following:<br />1. Enable the "Overwrite" option below to overwrite {if $conflictedTables|count > 1}these tables{else}this table{/if} and continue the installation with the "Next" Button or<br />2. You re-enter the Database access information, but to a different Database and continue the installation with the "Next" Button or<br />3. You enter a new Installations number, not forgetting to continue the installation with the "Next" Button.]]></item>
+ <item name="wcf.global.configureDB.conflictedTables.overwrite"><![CDATA[Overwrite the above listed table{if $conflictedTables|count > 1}s{/if}?]]></item>
+ <item name="wcf.global.configureDB.class"><![CDATA[Database type]]></item>
+ <item name="wcf.global.configureDB.class.MSSQLDatabase"><![CDATA[Microsoft SQL Server 2008+]]></item>
+ <item name="wcf.global.configureDB.class.MySQLDatabase"><![CDATA[MySQL 5.1+]]></item>
+ <item name="wcf.global.configureDB.class.PostgreSQLDatabase"><![CDATA[PostgreSQL 8.2+]]></item>
+ <item name="wcf.global.createUser"><![CDATA[Create an Administrator]]></item>
+ <item name="wcf.global.createUser.description"><![CDATA[The Installation will now generate an Administrator account for you. Please give a username, email address and password.]]></item>
+ <item name="wcf.global.createUser.data"><![CDATA[User information]]></item>
+ <item name="wcf.global.createUser.username"><![CDATA[Username]]></item>
+ <item name="wcf.global.createUser.email"><![CDATA[E-Mail Address]]></item>
+ <item name="wcf.global.createUser.confirmEmail"><![CDATA[Confirm E-Mail Address]]></item>
+ <item name="wcf.global.createUser.password"><![CDATA[Password]]></item>
+ <item name="wcf.global.createUser.confirmPassword"><![CDATA[Confirm Password]]></item>
+ <item name="wcf.global.createUser.error"><![CDATA[Errors have accured while registering the User account, please check the marked fields for errors.]]></item>
+ <item name="wcf.global.createUser.error.empty"><![CDATA[This field can not be left empty.]]></item>
+ <item name="wcf.global.createUser.error.username.notValid"><![CDATA[The Username you have given is invalid. A valid Username must be between 3 and 20 characters long.]]></item>
+ <item name="wcf.global.createUser.error.email.notValid"><![CDATA[The E-Mail Address you have given is invalid. A valid E-Mail Address must be in the format of name@domain.tld]]></item>
+ <item name="wcf.global.createUser.error.confirmEmail.notEqual"><![CDATA[The E-Mail Addresses you have given are not identical. For security reasons, please make sure that both E-Mail Address fields have been filled in and are identical.]]></item>
+ <item name="wcf.global.createUser.error.confirmPassword.notEqual"><![CDATA[The Passwords you have given are not identical. For security reasons, please make sure that both Password fields have been filled in and are identical.]]></item>
+ <item name="wcf.global.wcfDir.error"><![CDATA[An Error has accured while extracting the required files:
+ <br /><b>{$exception->getMessage()}</b><br />
+ Please make sure that the destination folder exists and can be written to.
+ <br /><br />Additional information can be found in the WoltLab Error Reference:<br /><a href="http://www.woltlab.com/help/?code={@$exception->getCode()}">http://www.woltlab.com/help/?code={@$exception->getCode()}</a>]]></item>
+ </category>
+</language>
- GNU LESSER GENERAL PUBLIC LICENSE\r
- Version 3, 29 June 2007\r
-\r
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\r
- Everyone is permitted to copy and distribute verbatim copies\r
- of this license document, but changing it is not allowed.\r
-\r
-\r
- This version of the GNU Lesser General Public License incorporates\r
-the terms and conditions of version 3 of the GNU General Public\r
-License, supplemented by the additional permissions listed below.\r
-\r
- 0. Additional Definitions. \r
-\r
- As used herein, "this License" refers to version 3 of the GNU Lesser\r
-General Public License, and the "GNU GPL" refers to version 3 of the GNU\r
-General Public License.\r
-\r
- "The Library" refers to a covered work governed by this License,\r
-other than an Application or a Combined Work as defined below.\r
-\r
- An "Application" is any work that makes use of an interface provided\r
-by the Library, but which is not otherwise based on the Library.\r
-Defining a subclass of a class defined by the Library is deemed a mode\r
-of using an interface provided by the Library.\r
-\r
- A "Combined Work" is a work produced by combining or linking an\r
-Application with the Library. The particular version of the Library\r
-with which the Combined Work was made is also called the "Linked\r
-Version".\r
-\r
- The "Minimal Corresponding Source" for a Combined Work means the\r
-Corresponding Source for the Combined Work, excluding any source code\r
-for portions of the Combined Work that, considered in isolation, are\r
-based on the Application, and not on the Linked Version.\r
-\r
- The "Corresponding Application Code" for a Combined Work means the\r
-object code and/or source code for the Application, including any data\r
-and utility programs needed for reproducing the Combined Work from the\r
-Application, but excluding the System Libraries of the Combined Work.\r
-\r
- 1. Exception to Section 3 of the GNU GPL.\r
-\r
- You may convey a covered work under sections 3 and 4 of this License\r
-without being bound by section 3 of the GNU GPL.\r
-\r
- 2. Conveying Modified Versions.\r
-\r
- If you modify a copy of the Library, and, in your modifications, a\r
-facility refers to a function or data to be supplied by an Application\r
-that uses the facility (other than as an argument passed when the\r
-facility is invoked), then you may convey a copy of the modified\r
-version:\r
-\r
- a) under this License, provided that you make a good faith effort to\r
- ensure that, in the event an Application does not supply the\r
- function or data, the facility still operates, and performs\r
- whatever part of its purpose remains meaningful, or\r
-\r
- b) under the GNU GPL, with none of the additional permissions of\r
- this License applicable to that copy.\r
-\r
- 3. Object Code Incorporating Material from Library Header Files.\r
-\r
- The object code form of an Application may incorporate material from\r
-a header file that is part of the Library. You may convey such object\r
-code under terms of your choice, provided that, if the incorporated\r
-material is not limited to numerical parameters, data structure\r
-layouts and accessors, or small macros, inline functions and templates\r
-(ten or fewer lines in length), you do both of the following:\r
-\r
- a) Give prominent notice with each copy of the object code that the\r
- Library is used in it and that the Library and its use are\r
- covered by this License.\r
-\r
- b) Accompany the object code with a copy of the GNU GPL and this license\r
- document.\r
-\r
- 4. Combined Works.\r
-\r
- You may convey a Combined Work under terms of your choice that,\r
-taken together, effectively do not restrict modification of the\r
-portions of the Library contained in the Combined Work and reverse\r
-engineering for debugging such modifications, if you also do each of\r
-the following:\r
-\r
- a) Give prominent notice with each copy of the Combined Work that\r
- the Library is used in it and that the Library and its use are\r
- covered by this License.\r
-\r
- b) Accompany the Combined Work with a copy of the GNU GPL and this license\r
- document.\r
-\r
- c) For a Combined Work that displays copyright notices during\r
- execution, include the copyright notice for the Library among\r
- these notices, as well as a reference directing the user to the\r
- copies of the GNU GPL and this license document.\r
-\r
- d) Do one of the following:\r
-\r
- 0) Convey the Minimal Corresponding Source under the terms of this\r
- License, and the Corresponding Application Code in a form\r
- suitable for, and under terms that permit, the user to\r
- recombine or relink the Application with a modified version of\r
- the Linked Version to produce a modified Combined Work, in the\r
- manner specified by section 6 of the GNU GPL for conveying\r
- Corresponding Source.\r
-\r
- 1) Use a suitable shared library mechanism for linking with the\r
- Library. A suitable mechanism is one that (a) uses at run time\r
- a copy of the Library already present on the user's computer\r
- system, and (b) will operate properly with a modified version\r
- of the Library that is interface-compatible with the Linked\r
- Version. \r
-\r
- e) Provide Installation Information, but only if you would otherwise\r
- be required to provide such information under section 6 of the\r
- GNU GPL, and only to the extent that such information is\r
- necessary to install and execute a modified version of the\r
- Combined Work produced by recombining or relinking the\r
- Application with a modified version of the Linked Version. (If\r
- you use option 4d0, the Installation Information must accompany\r
- the Minimal Corresponding Source and Corresponding Application\r
- Code. If you use option 4d1, you must provide the Installation\r
- Information in the manner specified by section 6 of the GNU GPL\r
- for conveying Corresponding Source.)\r
-\r
- 5. Combined Libraries.\r
-\r
- You may place library facilities that are a work based on the\r
-Library side by side in a single library together with other library\r
-facilities that are not Applications and are not covered by this\r
-License, and convey such a combined library under terms of your\r
-choice, if you do both of the following:\r
-\r
- a) Accompany the combined library with a copy of the same work based\r
- on the Library, uncombined with any other library facilities,\r
- conveyed under the terms of this License.\r
-\r
- b) Give prominent notice with the combined library that part of it\r
- is a work based on the Library, and explaining where to find the\r
- accompanying uncombined form of the same work.\r
-\r
- 6. Revised Versions of the GNU Lesser General Public License.\r
-\r
- The Free Software Foundation may publish revised and/or new versions\r
-of the GNU Lesser General Public License from time to time. Such new\r
-versions will be similar in spirit to the present version, but may\r
-differ in detail to address new problems or concerns.\r
-\r
- Each version is given a distinguishing version number. If the\r
-Library as you received it specifies that a certain numbered version\r
-of the GNU Lesser General Public License "or any later version"\r
-applies to it, you have the option of following the terms and\r
-conditions either of that published version or of any later version\r
-published by the Free Software Foundation. If the Library as you\r
-received it does not specify a version number of the GNU Lesser\r
-General Public License, you may choose any version of the GNU Lesser\r
-General Public License ever published by the Free Software Foundation.\r
-\r
- If the Library as you received it specifies that a proxy can decide\r
-whether future versions of the GNU Lesser General Public License shall\r
-apply, that proxy's public statement of acceptance of any version is\r
-permanent authorization for you to choose that version for the\r
-Library.\r
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ 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 that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU 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 as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
- <div class="copyright">\r
- <span>Copyright © 2001-2011 WoltLab® GmbH</span>\r
- </div>\r
- </div>\r
-</body>\r
+ <div class="copyright">
+ <span>Copyright © 2001-2011 WoltLab® GmbH</span>
+ </div>
+ </div>
+</body>
</html>
\ No newline at end of file
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.configureDB{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.configureDB.description{/lang}</p>\r
-\r
-{if $exception|isset}\r
- <p class="error">{lang}wcf.global.configureDB.error{/lang}</p>\r
-{/if}\r
-\r
-{if $conflictedTables|isset}\r
-<p class="error">\r
- {lang}wcf.global.configureDB.conflictedTables{/lang}\r
-</p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
- <fieldset>\r
- <legend>{lang}wcf.global.configureDB.accessData{/lang}</legend>\r
- \r
- <div class="inner">\r
- <div>\r
- <label for="dbClass">{lang}wcf.global.configureDB.class{/lang}</label>\r
- <select name="dbClass" id="dbClass">\r
- {foreach from=$availableDBClasses key=dbClassName item=availableDBClass}\r
- <option value="{@$availableDBClass.class}"{if $availableDBClass.class == $dbClass} selected="selected"{/if}>{lang}wcf.global.configureDB.class.{@$dbClassName}{/lang}</option>\r
- {/foreach}\r
- </select>\r
- </div>\r
-\r
- <div>\r
- <label for="dbHost">{lang}wcf.global.configureDB.host{/lang}</label>\r
- <input type="text" class="inputText" id="dbHost" name="dbHost" value="{$dbHost}" style="width: 100%;" />\r
- </div>\r
- \r
- <div>\r
- <label for="dbUser">{lang}wcf.global.configureDB.user{/lang}</label>\r
- <input type="text" class="inputText" id="dbUser" name="dbUser" value="{$dbUser}" style="width: 100%;" />\r
- </div>\r
- \r
- <div>\r
- <label for="dbPassword">{lang}wcf.global.configureDB.password{/lang}</label>\r
- <input type="password" class="inputText" id="dbPassword" name="dbPassword" value="{$dbPassword}" style="width: 100%;" />\r
- </div>\r
- \r
- <div>\r
- <label for="dbName">{lang}wcf.global.configureDB.database{/lang}</label>\r
- <input type="text" class="inputText" id="dbName" name="dbName" value="{$dbName}" style="width: 100%;" />\r
- </div>\r
- \r
- <div>\r
- <label for="dbNumber">{lang}wcf.global.configureDB.number{/lang}</label>\r
- <input type="text" class="inputText" id="dbNumber" name="dbNumber" value="{$dbNumber}" style="width: 100%;" />\r
- </div>\r
- \r
- {if $conflictedTables|isset}\r
- <div>\r
- <label><input type="checkbox" name="overwriteTables" value="1" /> {lang}wcf.global.configureDB.conflictedTables.overwrite{/lang}</label>\r
- </div>\r
- {/if}\r
- </div>\r
- </fieldset>\r
- \r
- <div class="nextButton">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
- <input type="hidden" name="send" value="1" />\r
- <input type="hidden" name="step" value="{@$nextStep}" />\r
- <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
- <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
- <input type="hidden" name="wcfDir" value="{$wcfDir}" />\r
- <input type="hidden" name="dev" value="{@$developerMode}" />\r
- {foreach from=$selectedLanguages item=language}\r
- <input type="hidden" name="selectedLanguages[]" value="{$language}" />\r
- {/foreach}\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.configureDB{/lang}</h2>
+
+<p>{lang}wcf.global.configureDB.description{/lang}</p>
+
+{if $exception|isset}
+ <p class="error">{lang}wcf.global.configureDB.error{/lang}</p>
+{/if}
+
+{if $conflictedTables|isset}
+<p class="error">
+ {lang}wcf.global.configureDB.conflictedTables{/lang}
+</p>
+{/if}
+
+<form method="post" action="install.php">
+ <fieldset>
+ <legend>{lang}wcf.global.configureDB.accessData{/lang}</legend>
+
+ <div class="inner">
+ <div>
+ <label for="dbClass">{lang}wcf.global.configureDB.class{/lang}</label>
+ <select name="dbClass" id="dbClass">
+ {foreach from=$availableDBClasses key=dbClassName item=availableDBClass}
+ <option value="{@$availableDBClass.class}"{if $availableDBClass.class == $dbClass} selected="selected"{/if}>{lang}wcf.global.configureDB.class.{@$dbClassName}{/lang}</option>
+ {/foreach}
+ </select>
+ </div>
+
+ <div>
+ <label for="dbHost">{lang}wcf.global.configureDB.host{/lang}</label>
+ <input type="text" class="inputText" id="dbHost" name="dbHost" value="{$dbHost}" style="width: 100%;" />
+ </div>
+
+ <div>
+ <label for="dbUser">{lang}wcf.global.configureDB.user{/lang}</label>
+ <input type="text" class="inputText" id="dbUser" name="dbUser" value="{$dbUser}" style="width: 100%;" />
+ </div>
+
+ <div>
+ <label for="dbPassword">{lang}wcf.global.configureDB.password{/lang}</label>
+ <input type="password" class="inputText" id="dbPassword" name="dbPassword" value="{$dbPassword}" style="width: 100%;" />
+ </div>
+
+ <div>
+ <label for="dbName">{lang}wcf.global.configureDB.database{/lang}</label>
+ <input type="text" class="inputText" id="dbName" name="dbName" value="{$dbName}" style="width: 100%;" />
+ </div>
+
+ <div>
+ <label for="dbNumber">{lang}wcf.global.configureDB.number{/lang}</label>
+ <input type="text" class="inputText" id="dbNumber" name="dbNumber" value="{$dbNumber}" style="width: 100%;" />
+ </div>
+
+ {if $conflictedTables|isset}
+ <div>
+ <label><input type="checkbox" name="overwriteTables" value="1" /> {lang}wcf.global.configureDB.conflictedTables.overwrite{/lang}</label>
+ </div>
+ {/if}
+ </div>
+ </fieldset>
+
+ <div class="nextButton">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+ <input type="hidden" name="send" value="1" />
+ <input type="hidden" name="step" value="{@$nextStep}" />
+ <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+ <input type="hidden" name="languageCode" value="{@$languageCode}" />
+ <input type="hidden" name="wcfDir" value="{$wcfDir}" />
+ <input type="hidden" name="dev" value="{@$developerMode}" />
+ {foreach from=$selectedLanguages item=language}
+ <input type="hidden" name="selectedLanguages[]" value="{$language}" />
+ {/foreach}
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.createUser{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.createUser.description{/lang}</p>\r
-\r
-{if $errorField}\r
-<p class="error">{lang}wcf.global.createUser.error{/lang}</p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
- <fieldset>\r
- <legend>{lang}wcf.global.createUser.data{/lang}</legend>\r
- \r
- <div class="inner">\r
- <div{if $errorField == 'username'} class="errorField"{/if}>\r
- <label for="username">{lang}wcf.global.createUser.username{/lang}</label>\r
- <input type="text" class="inputText" id="username" name="username" value="{$username}" style="width: 100%;" />\r
- {if $errorField == 'username'}\r
- <p>\r
- {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}\r
- {if $errorType == 'notValid'}{lang}wcf.global.createUser.error.username.notValid{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- \r
- <div{if $errorField == 'email'} class="errorField"{/if}>\r
- <label for="email">{lang}wcf.global.createUser.email{/lang}</label>\r
- <input type="text" class="inputText" id="email" name="email" value="{$email}" style="width: 100%;" />\r
- {if $errorField == 'email'}\r
- <p>\r
- {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}\r
- {if $errorType == 'notValid'}{lang}wcf.global.createUser.error.email.notValid{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- \r
- <div{if $errorField == 'confirmEmail'} class="errorField"{/if}>\r
- <label for="confirmEmail">{lang}wcf.global.createUser.confirmEmail{/lang}</label>\r
- <input type="text" class="inputText" id="confirmEmail" name="confirmEmail" value="{$confirmEmail}" style="width: 100%;" />\r
- {if $errorField == 'confirmEmail'}\r
- <p>\r
- {if $errorType == 'notEqual'}{lang}wcf.global.createUser.error.confirmEmail.notEqual{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- \r
- <div{if $errorField == 'password'} class="errorField"{/if}>\r
- <label for="password">{lang}wcf.global.createUser.password{/lang}</label>\r
- <input type="password" class="inputText" id="password" name="password" value="{$password}" style="width: 100%;" />\r
- {if $errorField == 'password'}\r
- <p>\r
- {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- \r
- <div{if $errorField == 'confirmPassword'} class="errorField"{/if}>\r
- <label for="confirmPassword">{lang}wcf.global.createUser.confirmPassword{/lang}</label>\r
- <input type="password" class="inputText" id="confirmPassword" name="confirmPassword" value="{$confirmPassword}" style="width: 100%;" />\r
- {if $errorField == 'confirmPassword'}\r
- <p>\r
- {if $errorType == 'notEqual'}{lang}wcf.global.createUser.error.confirmPassword.notEqual{/lang}{/if}\r
- </p>\r
- {/if}\r
- </div>\r
- \r
- </div>\r
- </fieldset>\r
- \r
- <div class="nextButton">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
- <input type="hidden" name="send" value="1" />\r
- <input type="hidden" name="step" value="{@$nextStep}" />\r
- <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
- <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
- <input type="hidden" name="wcfDir" value="{$wcfDir}" />\r
- <input type="hidden" name="dev" value="{@$developerMode}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.createUser{/lang}</h2>
+
+<p>{lang}wcf.global.createUser.description{/lang}</p>
+
+{if $errorField}
+<p class="error">{lang}wcf.global.createUser.error{/lang}</p>
+{/if}
+
+<form method="post" action="install.php">
+ <fieldset>
+ <legend>{lang}wcf.global.createUser.data{/lang}</legend>
+
+ <div class="inner">
+ <div{if $errorField == 'username'} class="errorField"{/if}>
+ <label for="username">{lang}wcf.global.createUser.username{/lang}</label>
+ <input type="text" class="inputText" id="username" name="username" value="{$username}" style="width: 100%;" />
+ {if $errorField == 'username'}
+ <p>
+ {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}
+ {if $errorType == 'notValid'}{lang}wcf.global.createUser.error.username.notValid{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+
+ <div{if $errorField == 'email'} class="errorField"{/if}>
+ <label for="email">{lang}wcf.global.createUser.email{/lang}</label>
+ <input type="text" class="inputText" id="email" name="email" value="{$email}" style="width: 100%;" />
+ {if $errorField == 'email'}
+ <p>
+ {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}
+ {if $errorType == 'notValid'}{lang}wcf.global.createUser.error.email.notValid{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+
+ <div{if $errorField == 'confirmEmail'} class="errorField"{/if}>
+ <label for="confirmEmail">{lang}wcf.global.createUser.confirmEmail{/lang}</label>
+ <input type="text" class="inputText" id="confirmEmail" name="confirmEmail" value="{$confirmEmail}" style="width: 100%;" />
+ {if $errorField == 'confirmEmail'}
+ <p>
+ {if $errorType == 'notEqual'}{lang}wcf.global.createUser.error.confirmEmail.notEqual{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+
+ <div{if $errorField == 'password'} class="errorField"{/if}>
+ <label for="password">{lang}wcf.global.createUser.password{/lang}</label>
+ <input type="password" class="inputText" id="password" name="password" value="{$password}" style="width: 100%;" />
+ {if $errorField == 'password'}
+ <p>
+ {if $errorType == 'empty'}{lang}wcf.global.createUser.error.empty{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+
+ <div{if $errorField == 'confirmPassword'} class="errorField"{/if}>
+ <label for="confirmPassword">{lang}wcf.global.createUser.confirmPassword{/lang}</label>
+ <input type="password" class="inputText" id="confirmPassword" name="confirmPassword" value="{$confirmPassword}" style="width: 100%;" />
+ {if $errorField == 'confirmPassword'}
+ <p>
+ {if $errorType == 'notEqual'}{lang}wcf.global.createUser.error.confirmPassword.notEqual{/lang}{/if}
+ </p>
+ {/if}
+ </div>
+
+ </div>
+ </fieldset>
+
+ <div class="nextButton">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+ <input type="hidden" name="send" value="1" />
+ <input type="hidden" name="step" value="{@$nextStep}" />
+ <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+ <input type="hidden" name="languageCode" value="{@$languageCode}" />
+ <input type="hidden" name="wcfDir" value="{$wcfDir}" />
+ <input type="hidden" name="dev" value="{@$developerMode}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.next{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.next.description{/lang}</p>\r
-\r
-<hr />\r
-\r
-<form method="get" action="{@RELATIVE_WCF_DIR}acp/index.php">\r
- <div class="nextButton">\r
- <input type="submit" name="nextButton" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
- {@SID_INPUT_TAG}\r
- </div>\r
-</form>\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- window.onload = function() {\r
- document.forms[0].nextButton.disabled = true;\r
- document.forms[0].submit();\r
- }\r
- //]]>\r
-</script>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.next{/lang}</h2>
+
+<p>{lang}wcf.global.next.description{/lang}</p>
+
+<hr />
+
+<form method="get" action="{@RELATIVE_WCF_DIR}acp/index.php">
+ <div class="nextButton">
+ <input type="submit" name="nextButton" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+ {@SID_INPUT_TAG}
+ </div>
+</form>
+
+<script type="text/javascript">
+ //<![CDATA[
+ window.onload = function() {
+ document.forms[0].nextButton.disabled = true;
+ document.forms[0].submit();
+ }
+ //]]>
+</script>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.next{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.next.description{/lang}</p>\r
-\r
-<hr />\r
-\r
-<form method="post" action="install.php?step={@$nextStep}">\r
- <div class="nextButton">\r
- <input type="submit" name="nextButton" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
- <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
- <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
- <input type="hidden" name="wcfDir" value="{$wcfDir}" />\r
- <input type="hidden" name="dev" value="{@$developerMode}" />\r
- {foreach from=$selectedLanguages item=language}\r
- <input type="hidden" name="selectedLanguages[]" value="{$language}" />\r
- {/foreach}\r
- </div>\r
-</form>\r
-\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- window.onload = function() {\r
- document.forms[0].nextButton.disabled = true;\r
- document.forms[0].submit();\r
- }\r
- //]]>\r
-</script>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.next{/lang}</h2>
+
+<p>{lang}wcf.global.next.description{/lang}</p>
+
+<hr />
+
+<form method="post" action="install.php?step={@$nextStep}">
+ <div class="nextButton">
+ <input type="submit" name="nextButton" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+ <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+ <input type="hidden" name="languageCode" value="{@$languageCode}" />
+ <input type="hidden" name="wcfDir" value="{$wcfDir}" />
+ <input type="hidden" name="dev" value="{@$developerMode}" />
+ {foreach from=$selectedLanguages item=language}
+ <input type="hidden" name="selectedLanguages[]" value="{$language}" />
+ {/foreach}
+ </div>
+</form>
+
+
+<script type="text/javascript">
+ //<![CDATA[
+ window.onload = function() {
+ document.forms[0].nextButton.disabled = true;
+ document.forms[0].submit();
+ }
+ //]]>
+</script>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.wcfDir{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.wcfDir.description{/lang}</p>\r
-\r
-{if $foundDirectory}\r
- <p>{lang}wcf.global.wcfDir.foundDirectory{/lang}</p>\r
-{/if}\r
-\r
-{if $exception|isset}\r
- <p class="error">\r
- {lang}wcf.global.wcfDir.error{/lang}\r
- </p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
- <fieldset>\r
- <legend>{lang}wcf.global.wcfDir.dir{/lang}</legend>\r
- \r
- <div class="inner">\r
- <div>\r
- <label for="wcfDir">{lang}wcf.global.wcfDir.dir.description{/lang}</label>\r
- <input type="text" class="inputText" id="wcfDir" name="wcfDir" value="{$wcfDir}" style="width: 100%;" />\r
- </div>\r
- <div>\r
- <label for="wcfUrl">{lang}wcf.global.wcfDir.url.description{/lang}</label>\r
- <input type="text" class="inputText" id="wcfUrl" name="wcfUrl" value="" style="width: 100%;" readonly="readonly" />\r
- </div>\r
- </div>\r
- </fieldset>\r
- \r
- <div class="nextButton">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
- <input type="hidden" name="step" value="{@$nextStep}" />\r
- <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
- <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
- <input type="hidden" name="dev" value="{@$developerMode}" />\r
- </div>\r
-</form>\r
-\r
-<script type="text/javascript">\r
- //<![CDATA[\r
- // data\r
- var domainName = '{@$domainName|encodeJS}';\r
- var installScriptDir = '{@$installScriptDir|encodeJS}';\r
- var installScriptUrl = '{@$installScriptUrl|encodeJS}';\r
- var invalidErrorMessage = '{lang}wcf.global.wcfDir.error.invalid{/lang}';\r
- \r
- // function\r
- function refreshWcfUrl() {\r
- // split paths\r
- var installScriptDirs = installScriptDir.split('/');\r
- var wcfDirs = document.getElementById('wcfDir').value.split('/');\r
- var installScriptUrlDirs = installScriptUrl.split('/');\r
- \r
- // remove empty elements\r
- for (var i = installScriptDirs.length; i >= 0; i--) if (installScriptDirs[i] == '' || installScriptDirs[i] == '.') installScriptDirs.splice(i, 1);\r
- for (var i = wcfDirs.length; i >= 0; i--) if (wcfDirs[i] == '' || wcfDirs[i] == '.') wcfDirs.splice(i, 1);\r
- for (var i = installScriptUrlDirs.length; i >= 0; i--) if (installScriptUrlDirs[i] == '') installScriptUrlDirs.splice(i, 1);\r
- \r
- // get relative path\r
- var relativePathDirs = new Array();\r
- var max = (wcfDirs.length > installScriptDirs.length ? wcfDirs.length : installScriptDirs.length);\r
- for (var i = 0; i < max; i++) {\r
- if (i < installScriptDirs.length && i < wcfDirs.length) {\r
- if (installScriptDirs[i] != wcfDirs[i]) {\r
- wcfDirs.splice(0, i);\r
- for (var j = 0; j < installScriptDirs.length - i; j++) relativePathDirs.push('..');\r
- relativePathDirs = relativePathDirs.concat(wcfDirs);\r
- break;\r
- }\r
- } \r
- // go up one level\r
- else if (i < installScriptDirs.length && i >= wcfDirs.length) {\r
- relativePathDirs.push('..');\r
- }\r
- else {\r
- relativePathDirs.push(wcfDirs[i]);\r
- }\r
- }\r
- \r
- // loop dirs\r
- for (var i = 0; i < relativePathDirs.length; i++) {\r
- if (relativePathDirs[i] == '..') {\r
- if (installScriptUrlDirs.length < 1) {\r
- document.getElementById('wcfUrl').value = invalidErrorMessage;\r
- return;\r
- }\r
- \r
- installScriptUrlDirs.pop();\r
- }\r
- else {\r
- installScriptUrlDirs.push(relativePathDirs[i]);\r
- }\r
- }\r
- \r
- // implode and show result\r
- var result = domainName;\r
- for (var i = 0; i < installScriptUrlDirs.length; i++) result += '/' + installScriptUrlDirs[i];\r
- document.getElementById('wcfUrl').value = result;\r
- }\r
- \r
- window.onload = function() {\r
- // set onchange listener\r
- document.getElementById('wcfDir').onkeyup = function() { refreshWcfUrl(); };\r
- \r
- // set onblur listener\r
- document.getElementById('wcfDir').onblur = function() { refreshWcfUrl(); };\r
- \r
- // set default value\r
- refreshWcfUrl();\r
- }\r
- //]]>\r
-</script>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.wcfDir{/lang}</h2>
+
+<p>{lang}wcf.global.wcfDir.description{/lang}</p>
+
+{if $foundDirectory}
+ <p>{lang}wcf.global.wcfDir.foundDirectory{/lang}</p>
+{/if}
+
+{if $exception|isset}
+ <p class="error">
+ {lang}wcf.global.wcfDir.error{/lang}
+ </p>
+{/if}
+
+<form method="post" action="install.php">
+ <fieldset>
+ <legend>{lang}wcf.global.wcfDir.dir{/lang}</legend>
+
+ <div class="inner">
+ <div>
+ <label for="wcfDir">{lang}wcf.global.wcfDir.dir.description{/lang}</label>
+ <input type="text" class="inputText" id="wcfDir" name="wcfDir" value="{$wcfDir}" style="width: 100%;" />
+ </div>
+ <div>
+ <label for="wcfUrl">{lang}wcf.global.wcfDir.url.description{/lang}</label>
+ <input type="text" class="inputText" id="wcfUrl" name="wcfUrl" value="" style="width: 100%;" readonly="readonly" />
+ </div>
+ </div>
+ </fieldset>
+
+ <div class="nextButton">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+ <input type="hidden" name="step" value="{@$nextStep}" />
+ <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+ <input type="hidden" name="languageCode" value="{@$languageCode}" />
+ <input type="hidden" name="dev" value="{@$developerMode}" />
+ </div>
+</form>
+
+<script type="text/javascript">
+ //<![CDATA[
+ // data
+ var domainName = '{@$domainName|encodeJS}';
+ var installScriptDir = '{@$installScriptDir|encodeJS}';
+ var installScriptUrl = '{@$installScriptUrl|encodeJS}';
+ var invalidErrorMessage = '{lang}wcf.global.wcfDir.error.invalid{/lang}';
+
+ // function
+ function refreshWcfUrl() {
+ // split paths
+ var installScriptDirs = installScriptDir.split('/');
+ var wcfDirs = document.getElementById('wcfDir').value.split('/');
+ var installScriptUrlDirs = installScriptUrl.split('/');
+
+ // remove empty elements
+ for (var i = installScriptDirs.length; i >= 0; i--) if (installScriptDirs[i] == '' || installScriptDirs[i] == '.') installScriptDirs.splice(i, 1);
+ for (var i = wcfDirs.length; i >= 0; i--) if (wcfDirs[i] == '' || wcfDirs[i] == '.') wcfDirs.splice(i, 1);
+ for (var i = installScriptUrlDirs.length; i >= 0; i--) if (installScriptUrlDirs[i] == '') installScriptUrlDirs.splice(i, 1);
+
+ // get relative path
+ var relativePathDirs = new Array();
+ var max = (wcfDirs.length > installScriptDirs.length ? wcfDirs.length : installScriptDirs.length);
+ for (var i = 0; i < max; i++) {
+ if (i < installScriptDirs.length && i < wcfDirs.length) {
+ if (installScriptDirs[i] != wcfDirs[i]) {
+ wcfDirs.splice(0, i);
+ for (var j = 0; j < installScriptDirs.length - i; j++) relativePathDirs.push('..');
+ relativePathDirs = relativePathDirs.concat(wcfDirs);
+ break;
+ }
+ }
+ // go up one level
+ else if (i < installScriptDirs.length && i >= wcfDirs.length) {
+ relativePathDirs.push('..');
+ }
+ else {
+ relativePathDirs.push(wcfDirs[i]);
+ }
+ }
+
+ // loop dirs
+ for (var i = 0; i < relativePathDirs.length; i++) {
+ if (relativePathDirs[i] == '..') {
+ if (installScriptUrlDirs.length < 1) {
+ document.getElementById('wcfUrl').value = invalidErrorMessage;
+ return;
+ }
+
+ installScriptUrlDirs.pop();
+ }
+ else {
+ installScriptUrlDirs.push(relativePathDirs[i]);
+ }
+ }
+
+ // implode and show result
+ var result = domainName;
+ for (var i = 0; i < installScriptUrlDirs.length; i++) result += '/' + installScriptUrlDirs[i];
+ document.getElementById('wcfUrl').value = result;
+ }
+
+ window.onload = function() {
+ // set onchange listener
+ document.getElementById('wcfDir').onkeyup = function() { refreshWcfUrl(); };
+
+ // set onblur listener
+ document.getElementById('wcfDir').onblur = function() { refreshWcfUrl(); };
+
+ // set default value
+ refreshWcfUrl();
+ }
+ //]]>
+</script>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.languages{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.languages.description{/lang}</p>\r
-\r
-{if $errorField}\r
- <p class="error">{if $errorType == 'empty'}{lang}wcf.global.languages.error.empty{/lang}{/if}</p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
- <fieldset>\r
- <legend>{lang}wcf.global.languages.languages{/lang}</legend>\r
- \r
- <div class="inner">\r
- <ul class="languages">\r
- {foreach from=$languages key=language item=languageName}\r
- <li><label><input type="checkbox" name="selectedLanguages[]" value="{@$language}" {if $language|in_array:$selectedLanguages}checked="checked" {/if}/> {@$languageName}</label></li>\r
- {/foreach}\r
- </ul>\r
- <br style="clear: both" />\r
- </div>\r
- </fieldset>\r
- \r
- <div class="nextButton">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
- <input type="hidden" name="send" value="1" />\r
- <input type="hidden" name="step" value="{@$nextStep}" />\r
- <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
- <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
- <input type="hidden" name="wcfDir" value="{$wcfDir}" />\r
- <input type="hidden" name="dev" value="{@$developerMode}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.languages{/lang}</h2>
+
+<p>{lang}wcf.global.languages.description{/lang}</p>
+
+{if $errorField}
+ <p class="error">{if $errorType == 'empty'}{lang}wcf.global.languages.error.empty{/lang}{/if}</p>
+{/if}
+
+<form method="post" action="install.php">
+ <fieldset>
+ <legend>{lang}wcf.global.languages.languages{/lang}</legend>
+
+ <div class="inner">
+ <ul class="languages">
+ {foreach from=$languages key=language item=languageName}
+ <li><label><input type="checkbox" name="selectedLanguages[]" value="{@$language}" {if $language|in_array:$selectedLanguages}checked="checked" {/if}/> {@$languageName}</label></li>
+ {/foreach}
+ </ul>
+ <br style="clear: both" />
+ </div>
+ </fieldset>
+
+ <div class="nextButton">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+ <input type="hidden" name="send" value="1" />
+ <input type="hidden" name="step" value="{@$nextStep}" />
+ <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+ <input type="hidden" name="languageCode" value="{@$languageCode}" />
+ <input type="hidden" name="wcfDir" value="{$wcfDir}" />
+ <input type="hidden" name="dev" value="{@$developerMode}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.welcome{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.welcome.description{/lang}</p>\r
-\r
-<form method="post" action="install.php">\r
- <fieldset>\r
- <legend>{lang}wcf.global.welcome.language{/lang}</legend>\r
- \r
- <div class="inner">\r
- <div>\r
- <label for="languageCode">{lang}wcf.global.welcome.language.description{/lang}</label>\r
- {htmlOptions name="languageCode" id="languageCode" options=$availableLanguages selected=$languageCode disableEncoding=true}\r
- \r
- <input type="submit" value="{lang}wcf.global.welcome.language.change{/lang}" />\r
- <input type="hidden" name="step" value="selectSetupLanguage" />\r
- <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
- </div>\r
- \r
- </div>\r
- \r
- </fieldset>\r
-</form>\r
-\r
-<form method="post" action="install.php">\r
- <div class="nextButton">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
- <input type="hidden" name="step" value="{@$nextStep}" />\r
- <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
- <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
- <input type="hidden" name="dev" value="{@$developerMode}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.welcome{/lang}</h2>
+
+<p>{lang}wcf.global.welcome.description{/lang}</p>
+
+<form method="post" action="install.php">
+ <fieldset>
+ <legend>{lang}wcf.global.welcome.language{/lang}</legend>
+
+ <div class="inner">
+ <div>
+ <label for="languageCode">{lang}wcf.global.welcome.language.description{/lang}</label>
+ {htmlOptions name="languageCode" id="languageCode" options=$availableLanguages selected=$languageCode disableEncoding=true}
+
+ <input type="submit" value="{lang}wcf.global.welcome.language.change{/lang}" />
+ <input type="hidden" name="step" value="selectSetupLanguage" />
+ <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+ </div>
+
+ </div>
+
+ </fieldset>
+</form>
+
+<form method="post" action="install.php">
+ <div class="nextButton">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+ <input type="hidden" name="step" value="{@$nextStep}" />
+ <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+ <input type="hidden" name="languageCode" value="{@$languageCode}" />
+ <input type="hidden" name="dev" value="{@$developerMode}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.license{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.license.description{/lang}</p>\r
-\r
-{if $missingAcception|isset}\r
-<p class="error">\r
- {lang}wcf.global.license.missingAcception{/lang}\r
-</p>\r
-{/if}\r
-\r
-<form method="post" action="install.php">\r
- <div>\r
- <textarea rows="20" cols="40" style="width: 100%" readonly="readonly">{$license}</textarea>\r
- <p><label{if $missingAcception|isset} class="errorField"{/if}><input type="checkbox" name="accepted" value="1" /> {lang}wcf.global.license.accept.description{/lang}</label></p>\r
- </div>\r
- <hr />\r
- <div class="nextButton">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />\r
- <input type="hidden" name="send" value="1" />\r
- <input type="hidden" name="step" value="{@$nextStep}" />\r
- <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
- <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
- <input type="hidden" name="dev" value="{@$developerMode}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.license{/lang}</h2>
+
+<p>{lang}wcf.global.license.description{/lang}</p>
+
+{if $missingAcception|isset}
+<p class="error">
+ {lang}wcf.global.license.missingAcception{/lang}
+</p>
+{/if}
+
+<form method="post" action="install.php">
+ <div>
+ <textarea rows="20" cols="40" style="width: 100%" readonly="readonly">{$license}</textarea>
+ <p><label{if $missingAcception|isset} class="errorField"{/if}><input type="checkbox" name="accepted" value="1" /> {lang}wcf.global.license.accept.description{/lang}</label></p>
+ </div>
+ <hr />
+ <div class="nextButton">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" />
+ <input type="hidden" name="send" value="1" />
+ <input type="hidden" name="step" value="{@$nextStep}" />
+ <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+ <input type="hidden" name="languageCode" value="{@$languageCode}" />
+ <input type="hidden" name="dev" value="{@$developerMode}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-{include file='header'}\r
-\r
-<h2>{lang}wcf.global.systemRequirements{/lang}</h2>\r
-\r
-<p>{lang}wcf.global.systemRequirements.description{/lang}</p>\r
-\r
-<fieldset>\r
- <legend>{lang}wcf.global.systemRequirements.required{/lang}</legend>\r
- <div class="inner">\r
- \r
- <div>\r
- <h3>{lang}wcf.global.systemRequirements.php{/lang}</h3>\r
- <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} 5.3.0</span>\r
- <span class="right" style="color: {if !$system.phpVersion.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.phpVersion.value}</span>\r
- {if !$system.phpVersion.result}<div>{lang}wcf.global.systemRequirements.php.description{/lang}</div>{/if}\r
- </div>\r
- <hr />\r
- \r
- <div>\r
- <h3>{lang}wcf.global.systemRequirements.sql{/lang}</h3>\r
- <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.active{/lang}</span>\r
- <span class="right" style="color: {if !$system.sql.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} \r
- {if !$system.sql.result}{lang}wcf.global.systemRequirements.sql.notFound{/lang}{else}\r
- {implode from=$system.sql.value item=$sqlType glue=', '}{lang}wcf.global.configureDB.class.{@$sqlType}{/lang}{/implode}\r
- {/if}</span>\r
- {if !$system.sql.result}<div>{lang}wcf.global.systemRequirements.sql.description{/lang}</div>{/if}\r
- </div>\r
- <hr />\r
- \r
- <div>\r
- <h3>{lang}wcf.global.systemRequirements.mbString{/lang}</h3>\r
- <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.active{/lang}</span>\r
- <span class="right" style="color: {if !$system.mbString.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {if !$system.mbString.result}{lang}wcf.global.systemRequirements.notActive{/lang}{else}{lang}wcf.global.systemRequirements.active{/lang}{/if}</span>\r
- {if !$system.mbString.result}<div>{lang}wcf.global.systemRequirements.mbString.description{/lang}</div>{/if}\r
- </div>\r
- <hr />\r
- \r
- <div>\r
- <h3>{lang}wcf.global.systemRequirements.safeMode{/lang}</h3>\r
- <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.notActive{/lang}</span>\r
- <span class="right" style="color: {if !$system.safeMode.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {if !$system.safeMode.result}{lang}wcf.global.systemRequirements.active{/lang}{else}{lang}wcf.global.systemRequirements.notActive{/lang}{/if}</span>\r
- {if !$system.safeMode.result}<div>{lang}wcf.global.systemRequirements.safeMode.description{/lang}</div>{/if}\r
- </div>\r
- \r
- </div>\r
-</fieldset>\r
-\r
-<fieldset>\r
- <legend>{lang}wcf.global.systemRequirements.recommended{/lang}</legend>\r
- <div class="inner">\r
- \r
- <div>\r
- <h3>{lang}wcf.global.systemRequirements.uploadMaxFilesize{/lang}</h3>\r
- <span class="left">{lang}wcf.global.systemRequirements.element.recommended{/lang} > 0</span>\r
- <span class="right" style="color: {if !$system.uploadMaxFilesize.result}orange{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.uploadMaxFilesize.value}</span>\r
- {if !$system.uploadMaxFilesize.result}<div>{lang}wcf.global.systemRequirements.uploadMaxFilesize.description{/lang}</div>{/if}\r
- </div>\r
- <hr />\r
- \r
- <div>\r
- <h3>{lang}wcf.global.systemRequirements.gdLib{/lang}</h3>\r
- <span class="left">{lang}wcf.global.systemRequirements.element.recommended{/lang} 2.0.0</span>\r
- <span class="right" style="color: {if !$system.gdLib.result}orange{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.gdLib.value}</span>\r
- {if !$system.gdLib.result}<div>{lang}wcf.global.systemRequirements.gdLib.description{/lang}</div>{/if}\r
- </div>\r
- \r
- </div>\r
-</fieldset>\r
-\r
-<form method="post" action="install.php"> \r
- <div class="nextButton">\r
- <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" {if !$system.phpVersion.result || !$system.sql.result || !$system.mbString.result || !$system.safeMode.result} disabled="disabled"{/if}/>\r
- <input type="hidden" name="step" value="{@$nextStep}" />\r
- <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />\r
- <input type="hidden" name="languageCode" value="{@$languageCode}" />\r
- <input type="hidden" name="dev" value="{@$developerMode}" />\r
- </div>\r
-</form>\r
-\r
+{include file='header'}
+
+<h2>{lang}wcf.global.systemRequirements{/lang}</h2>
+
+<p>{lang}wcf.global.systemRequirements.description{/lang}</p>
+
+<fieldset>
+ <legend>{lang}wcf.global.systemRequirements.required{/lang}</legend>
+ <div class="inner">
+
+ <div>
+ <h3>{lang}wcf.global.systemRequirements.php{/lang}</h3>
+ <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} 5.3.0</span>
+ <span class="right" style="color: {if !$system.phpVersion.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.phpVersion.value}</span>
+ {if !$system.phpVersion.result}<div>{lang}wcf.global.systemRequirements.php.description{/lang}</div>{/if}
+ </div>
+ <hr />
+
+ <div>
+ <h3>{lang}wcf.global.systemRequirements.sql{/lang}</h3>
+ <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.active{/lang}</span>
+ <span class="right" style="color: {if !$system.sql.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang}
+ {if !$system.sql.result}{lang}wcf.global.systemRequirements.sql.notFound{/lang}{else}
+ {implode from=$system.sql.value item=$sqlType glue=', '}{lang}wcf.global.configureDB.class.{@$sqlType}{/lang}{/implode}
+ {/if}</span>
+ {if !$system.sql.result}<div>{lang}wcf.global.systemRequirements.sql.description{/lang}</div>{/if}
+ </div>
+ <hr />
+
+ <div>
+ <h3>{lang}wcf.global.systemRequirements.mbString{/lang}</h3>
+ <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.active{/lang}</span>
+ <span class="right" style="color: {if !$system.mbString.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {if !$system.mbString.result}{lang}wcf.global.systemRequirements.notActive{/lang}{else}{lang}wcf.global.systemRequirements.active{/lang}{/if}</span>
+ {if !$system.mbString.result}<div>{lang}wcf.global.systemRequirements.mbString.description{/lang}</div>{/if}
+ </div>
+ <hr />
+
+ <div>
+ <h3>{lang}wcf.global.systemRequirements.safeMode{/lang}</h3>
+ <span class="left">{lang}wcf.global.systemRequirements.element.required{/lang} {lang}wcf.global.systemRequirements.notActive{/lang}</span>
+ <span class="right" style="color: {if !$system.safeMode.result}red{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {if !$system.safeMode.result}{lang}wcf.global.systemRequirements.active{/lang}{else}{lang}wcf.global.systemRequirements.notActive{/lang}{/if}</span>
+ {if !$system.safeMode.result}<div>{lang}wcf.global.systemRequirements.safeMode.description{/lang}</div>{/if}
+ </div>
+
+ </div>
+</fieldset>
+
+<fieldset>
+ <legend>{lang}wcf.global.systemRequirements.recommended{/lang}</legend>
+ <div class="inner">
+
+ <div>
+ <h3>{lang}wcf.global.systemRequirements.uploadMaxFilesize{/lang}</h3>
+ <span class="left">{lang}wcf.global.systemRequirements.element.recommended{/lang} > 0</span>
+ <span class="right" style="color: {if !$system.uploadMaxFilesize.result}orange{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.uploadMaxFilesize.value}</span>
+ {if !$system.uploadMaxFilesize.result}<div>{lang}wcf.global.systemRequirements.uploadMaxFilesize.description{/lang}</div>{/if}
+ </div>
+ <hr />
+
+ <div>
+ <h3>{lang}wcf.global.systemRequirements.gdLib{/lang}</h3>
+ <span class="left">{lang}wcf.global.systemRequirements.element.recommended{/lang} 2.0.0</span>
+ <span class="right" style="color: {if !$system.gdLib.result}orange{else}green{/if}">{lang}wcf.global.systemRequirements.element.yours{/lang} {$system.gdLib.value}</span>
+ {if !$system.gdLib.result}<div>{lang}wcf.global.systemRequirements.gdLib.description{/lang}</div>{/if}
+ </div>
+
+ </div>
+</fieldset>
+
+<form method="post" action="install.php">
+ <div class="nextButton">
+ <input type="submit" accesskey="s" value="{lang}wcf.global.button.next{/lang}" {if !$system.phpVersion.result || !$system.sql.result || !$system.mbString.result || !$system.safeMode.result} disabled="disabled"{/if}/>
+ <input type="hidden" name="step" value="{@$nextStep}" />
+ <input type="hidden" name="tmpFilePrefix" value="{@$tmpFilePrefix}" />
+ <input type="hidden" name="languageCode" value="{@$languageCode}" />
+ <input type="hidden" name="dev" value="{@$developerMode}" />
+ </div>
+</form>
+
{include file='footer'}
\ No newline at end of file
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\r
-<html>\r
-<head>\r
- <title>PHP5 Check</title>\r
-</head>\r
-<body>\r
-<?php\r
-/**\r
- * Tests the support of php5.0.5 or greater.\r
- * ><p><b>Support for PHP is missing.<br />PHP Unterstützung nicht gefunden</b></p> <!--\r
- * \r
- * @author Marcel Werk\r
- * @copyright 2001-2007 WoltLab GmbH\r
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>\r
- */\r
-// check php version\r
-// php version\r
-$phpVersion = phpversion();\r
-$comparePhpVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $phpVersion);\r
-if (!(version_compare($comparePhpVersion, '5.2.0') >= 0)) {\r
- ?>\r
- <p>Your PHP version '<?php echo $phpVersion; ?>' is insufficient for installation of this software. PHP version 5.2.0 or greater is required.<br />\r
- Ihre PHP Version '<?php echo $phpVersion; ?>' ist unzureichend für die Installation dieser Software. PHP Version 5.2.0 oder höher wird benötigt.</p>\r
- <?php\r
-}\r
-\r
-// check ze1_compatibility_mode\r
-else if (ini_get('zend.ze1_compatibility_mode')) {\r
- ?>\r
- <p>The option 'zend.ze1_compatibility_mode' is enabled. Please disable the option in your PHP configuration (php.ini) for a stable work of this software.<br />\r
- Die Einstellung 'zend.ze1_compatibility_mode' ist aktiv. Für einen einwandfreien Betrieb dieser Software muss die Einstellung in der PHP-Konfiguration (php.ini) deaktiviert werden.</p>\r
- <?php\r
-}\r
-\r
-// check simplexml\r
-else if (!function_exists('simplexml_load_file')) {\r
- ?>\r
- <p>The 'simplexml' PHP extension is missing. Simplexml is required for a stable work of this software.<br />\r
- Die 'simplexml' Erweiterung für PHP wurde nicht gefunden. Diese Erweiterung ist für den Betrieb der Software notwendig.</p>\r
- <?php\r
-}\r
-\r
-// check zlib extension\r
-else if (!function_exists('gzopen')) {\r
- ?>\r
- <p>The 'zlib' PHP extension is missing. ZLib is required for a stable work of this software.<br />\r
- Die 'zlib' Erweiterung für PHP wurde nicht gefunden. Diese Erweiterung ist für den Betrieb der Software notwendig.</p>\r
- <?php\r
-}\r
-\r
-// \r
-else {\r
- ?>\r
- <p>PHP5 or greater is available. You can <a href="install.php">start</a> the installation now.<br />\r
- PHP5 oder höher wurde gefunden. Sie können mit der Installation <a href="install.php">beginnen</a>.</p>\r
- <?php\r
-}\r
-?>\r
-</body>\r
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <title>PHP5 Check</title>
+</head>
+<body>
+<?php
+/**
+ * Tests the support of php5.0.5 or greater.
+ * ><p><b>Support for PHP is missing.<br />PHP Unterstützung nicht gefunden</b></p> <!--
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2007 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ */
+// check php version
+// php version
+$phpVersion = phpversion();
+$comparePhpVersion = preg_replace('/^(\d+\.\d+\.\d+).*$/', '\\1', $phpVersion);
+if (!(version_compare($comparePhpVersion, '5.2.0') >= 0)) {
+ ?>
+ <p>Your PHP version '<?php echo $phpVersion; ?>' is insufficient for installation of this software. PHP version 5.2.0 or greater is required.<br />
+ Ihre PHP Version '<?php echo $phpVersion; ?>' ist unzureichend für die Installation dieser Software. PHP Version 5.2.0 oder höher wird benötigt.</p>
+ <?php
+}
+
+// check ze1_compatibility_mode
+else if (ini_get('zend.ze1_compatibility_mode')) {
+ ?>
+ <p>The option 'zend.ze1_compatibility_mode' is enabled. Please disable the option in your PHP configuration (php.ini) for a stable work of this software.<br />
+ Die Einstellung 'zend.ze1_compatibility_mode' ist aktiv. Für einen einwandfreien Betrieb dieser Software muss die Einstellung in der PHP-Konfiguration (php.ini) deaktiviert werden.</p>
+ <?php
+}
+
+// check simplexml
+else if (!function_exists('simplexml_load_file')) {
+ ?>
+ <p>The 'simplexml' PHP extension is missing. Simplexml is required for a stable work of this software.<br />
+ Die 'simplexml' Erweiterung für PHP wurde nicht gefunden. Diese Erweiterung ist für den Betrieb der Software notwendig.</p>
+ <?php
+}
+
+// check zlib extension
+else if (!function_exists('gzopen')) {
+ ?>
+ <p>The 'zlib' PHP extension is missing. ZLib is required for a stable work of this software.<br />
+ Die 'zlib' Erweiterung für PHP wurde nicht gefunden. Diese Erweiterung ist für den Betrieb der Software notwendig.</p>
+ <?php
+}
+
+//
+else {
+ ?>
+ <p>PHP5 or greater is available. You can <a href="install.php">start</a> the installation now.<br />
+ PHP5 oder höher wurde gefunden. Sie können mit der Installation <a href="install.php">beginnen</a>.</p>
+ <?php
+}
+?>
+</body>
</html>
\ No newline at end of file