aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVjacheslav Trushkin <arty@phpbb.com>2012-03-31 10:43:06 +0300
committerVjacheslav Trushkin <arty@phpbb.com>2012-03-31 10:43:06 +0300
commit398a6c8045113f14900bdea8c70ba032f75b45f6 (patch)
tree1a9ff30f5eeca6faf0adbd314b60caf1869079c5
parent506951e8aff98582ebc56fcda9ed0626497ade77 (diff)
parent013a8649a5164b90310e76d99fae2186b831a5f0 (diff)
downloadforums-398a6c8045113f14900bdea8c70ba032f75b45f6.tar
forums-398a6c8045113f14900bdea8c70ba032f75b45f6.tar.gz
forums-398a6c8045113f14900bdea8c70ba032f75b45f6.tar.bz2
forums-398a6c8045113f14900bdea8c70ba032f75b45f6.tar.xz
forums-398a6c8045113f14900bdea8c70ba032f75b45f6.zip
Merge branch 'develop' into feature/merging-style-components
* develop: (175 commits) [feature/ajax] Remove strange non-breaking spaces from approve button [feature/ajax] Add entirely unrelated but nice newlines [feature/ajax] Unify phpbb_json_response instantiation [feature/ajax] Fix acp_styles activate_deactivate ajax callback name [feature/ajax] Send correct activate/deactivate JSON response in acp_profile [ticket/10270] Alter background colors for posts [feature/ajax] Remove not working module enable/disable ajax code [feature/ajax] Replace static call to phpbb_request with OO [feature/ajax] Remove quick-reply AJAX handling until we have something good [ticket/10270] Changing close button for ajax popups [ticket/10270] Disabling links in disappearing content [ticket/10291] Fixed an AJAX bug on quick reply form submit. [ticket/10273] Fixed accepting / denying posts AJAX. [ticket/10272] Removed code that was prevent event propogation in AJAX. [ticket/10291] Fixed a bug in the quick reply AJAX. [feature/ajax] Handle acp_modules error cases with JSON response [feature/ajax] Fix filter check, quick mod tools data-attribute [feature/ajax] Use the error handler [feature/ajax] Generic error handling with a phpbb.alert box [feature/ajax] Change filter semantics, some minor adjustments ... Conflicts: phpBB/adm/style/acp_styles.html phpBB/includes/acp/acp_styles.php
-rw-r--r--.gitignore2
-rw-r--r--.travis.yml2
-rw-r--r--README.md9
-rw-r--r--phpBB/adm/images/alert_close.pngbin0 -> 2097 bytes
-rw-r--r--phpBB/adm/style/acp_attachments.html2
-rw-r--r--phpBB/adm/style/acp_bbcodes.html2
-rw-r--r--phpBB/adm/style/acp_bots.html4
-rw-r--r--phpBB/adm/style/acp_forums.html26
-rw-r--r--phpBB/adm/style/acp_groups.html2
-rw-r--r--phpBB/adm/style/acp_icons.html2
-rw-r--r--phpBB/adm/style/acp_main.html17
-rw-r--r--phpBB/adm/style/acp_modules.html2
-rw-r--r--phpBB/adm/style/acp_permission_roles.html2
-rw-r--r--phpBB/adm/style/acp_profile.html4
-rw-r--r--phpBB/adm/style/acp_ranks.html2
-rw-r--r--phpBB/adm/style/acp_reasons.html2
-rw-r--r--phpBB/adm/style/acp_words.html2
-rw-r--r--phpBB/adm/style/admin.css54
-rw-r--r--phpBB/adm/style/ajax.js135
-rw-r--r--phpBB/adm/style/overall_footer.html18
-rw-r--r--phpBB/assets/javascript/core.js445
-rw-r--r--phpBB/common.php6
-rw-r--r--phpBB/composer.json5
-rw-r--r--phpBB/composer.lock10
-rw-r--r--phpBB/docs/AUTHORS3
-rw-r--r--phpBB/download/file.php4
-rw-r--r--phpBB/includes/acp/acp_bbcodes.php14
-rw-r--r--phpBB/includes/acp/acp_bots.php10
-rw-r--r--phpBB/includes/acp/acp_forums.php8
-rw-r--r--phpBB/includes/acp/acp_icons.php12
-rw-r--r--phpBB/includes/acp/acp_main.php43
-rw-r--r--phpBB/includes/acp/acp_modules.php11
-rw-r--r--phpBB/includes/acp/acp_profile.php18
-rw-r--r--phpBB/includes/acp/acp_ranks.php14
-rw-r--r--phpBB/includes/event/data.php68
-rw-r--r--phpBB/includes/event/dispatcher.php42
-rw-r--r--phpBB/includes/event/extension_subscriber_loader.php46
-rw-r--r--phpBB/includes/extension/controller.php77
-rw-r--r--phpBB/includes/extension/controller_interface.php2
-rw-r--r--phpBB/includes/functions.php61
-rw-r--r--phpBB/includes/functions_content.php20
-rw-r--r--phpBB/includes/functions_display.php1
-rw-r--r--phpBB/includes/json_response.php41
-rw-r--r--phpBB/includes/mcp/mcp_queue.php31
-rw-r--r--phpBB/includes/startup.php31
-rw-r--r--phpBB/includes/ucp/ucp_zebra.php22
-rw-r--r--phpBB/index.php7
-rw-r--r--phpBB/install/database_update.php1
-rw-r--r--phpBB/install/index.php1
-rw-r--r--phpBB/language/en/acp/common.php15
-rw-r--r--phpBB/language/en/acp/permissions.php12
-rw-r--r--phpBB/language/en/acp/posting.php1
-rw-r--r--phpBB/language/en/acp/styles.php2
-rw-r--r--phpBB/language/en/common.php8
-rw-r--r--phpBB/language/en/viewtopic.php4
-rw-r--r--phpBB/styles/prosilver/template/ajax.js100
-rw-r--r--phpBB/styles/prosilver/template/index_body.html2
-rw-r--r--phpBB/styles/prosilver/template/memberlist_view.html8
-rw-r--r--phpBB/styles/prosilver/template/overall_footer.html28
-rw-r--r--phpBB/styles/prosilver/template/overall_header.html4
-rw-r--r--phpBB/styles/prosilver/template/quickreply_editor.html61
-rw-r--r--phpBB/styles/prosilver/template/simple_header.html4
-rw-r--r--phpBB/styles/prosilver/template/viewforum_body.html2
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_body.html24
-rw-r--r--phpBB/styles/prosilver/theme/colours.css28
-rw-r--r--phpBB/styles/prosilver/theme/common.css156
-rw-r--r--phpBB/styles/prosilver/theme/content.css128
-rw-r--r--phpBB/styles/prosilver/theme/cp.css96
-rw-r--r--phpBB/styles/prosilver/theme/forms.css52
-rw-r--r--phpBB/styles/prosilver/theme/images/alert_close.pngbin0 -> 2097 bytes
-rw-r--r--phpBB/styles/prosilver/theme/links.css55
-rw-r--r--phpBB/styles/prosilver/theme/stylesheet.css1
-rw-r--r--phpBB/styles/prosilver/theme/tweaks.css92
-rw-r--r--phpBB/styles/subsilver2/template/viewtopic_body.html14
-rw-r--r--phpBB/viewtopic.php42
-rw-r--r--tests/event/dispatcher_test.php29
-rw-r--r--tests/functional/fixtures/ext/error/class/controller.php7
-rw-r--r--tests/functional/fixtures/ext/error/classtype/controller.php2
-rw-r--r--tests/functional/fixtures/ext/error/disabled/controller.php9
-rw-r--r--tests/functional/fixtures/ext/foo/bar/controller.php7
-rw-r--r--tests/functional/fixtures/ext/foobar/controller.php7
81 files changed, 1716 insertions, 627 deletions
diff --git a/.gitignore b/.gitignore
index e6e017f85e..4093aeb56d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
/phpBB/cache/*.html
/phpBB/cache/*.php
/phpBB/cache/queue.php.lock
+/phpBB/composer.phar
/phpBB/config.php
/phpBB/config_dev.php
/phpBB/config_test.php
@@ -11,6 +12,7 @@
/phpBB/images/avatars/gallery/*
/phpBB/images/avatars/upload/*
/phpBB/store/*
+/phpBB/vendor
/tests/phpbb_unit_tests.sqlite2
/tests/test_config.php
/tests/tmp/*
diff --git a/.travis.yml b/.travis.yml
index d5e1231584..f21928dd37 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,6 +13,8 @@ before_script:
- sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'create database IF NOT EXISTS phpbb_tests;'; fi"
- sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.2' ]; then pear install --force phpunit/DbUnit; else pyrus install --force phpunit/DbUnit; fi"
- phpenv rehash
+ - curl -s http://getcomposer.org/installer | php
+ - php composer.phar install
script:
- phpunit --configuration travis/phpunit-$DB-travis.xml
diff --git a/README.md b/README.md
index 51e65176c6..a7feb8db40 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,15 @@ phpBB is a free bulletin board written in PHP.
Find support and lots more on [phpBB.com](http://www.phpbb.com)! Discuss the development on [area51](http://area51.phpbb.com/phpBB/index.php).
+## INSTALLING DEPENDENCIES
+
+To be able to run an installation from the repo (and not from a pre-built package) you need to run the following commands to install phpBB's dependencies.
+
+ cd phpBB
+ curl -s http://getcomposer.org/installer | php
+ php composer.phar install
+
+
## CONTRIBUTE
1. [Create an account on phpBB.com](http://www.phpbb.com/community/ucp.php?mode=register)
diff --git a/phpBB/adm/images/alert_close.png b/phpBB/adm/images/alert_close.png
new file mode 100644
index 0000000000..79750a013c
--- /dev/null
+++ b/phpBB/adm/images/alert_close.png
Binary files differ
diff --git a/phpBB/adm/style/acp_attachments.html b/phpBB/adm/style/acp_attachments.html
index 33ef8062a6..c2f8b34792 100644
--- a/phpBB/adm/style/acp_attachments.html
+++ b/phpBB/adm/style/acp_attachments.html
@@ -248,7 +248,7 @@
<!-- ELSE --><br /><span>&raquo; {L_ALLOWED_IN_PM_POST}</span><!-- ENDIF -->
</td>
<td>{groups.CATEGORY}</td>
- <td align="center" valign="middle" style="white-space: nowrap;">&nbsp;<a href="{groups.U_EDIT}">{ICON_EDIT}</a>&nbsp;&nbsp;<a href="{groups.U_DELETE}">{ICON_DELETE}</a>&nbsp;</td>
+ <td align="center" valign="middle" style="white-space: nowrap;">&nbsp;<a href="{groups.U_EDIT}">{ICON_EDIT}</a>&nbsp;&nbsp;<a href="{groups.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a>&nbsp;</td>
</tr>
<!-- END groups -->
</tbody>
diff --git a/phpBB/adm/style/acp_bbcodes.html b/phpBB/adm/style/acp_bbcodes.html
index b85e8eca81..5939af24ae 100644
--- a/phpBB/adm/style/acp_bbcodes.html
+++ b/phpBB/adm/style/acp_bbcodes.html
@@ -101,7 +101,7 @@
<!-- BEGIN bbcodes -->
<!-- IF bbcodes.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->
<td style="text-align: center;">{bbcodes.BBCODE_TAG}</td>
- <td style="text-align: right; width: 40px;"><a href="{bbcodes.U_EDIT}">{ICON_EDIT}</a> <a href="{bbcodes.U_DELETE}">{ICON_DELETE}</a></td>
+ <td style="text-align: right; width: 40px;"><a href="{bbcodes.U_EDIT}">{ICON_EDIT}</a> <a href="{bbcodes.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a></td>
</tr>
<!-- BEGINELSE -->
<tr class="row3">
diff --git a/phpBB/adm/style/acp_bots.html b/phpBB/adm/style/acp_bots.html
index 886005caa3..87679fc33a 100644
--- a/phpBB/adm/style/acp_bots.html
+++ b/phpBB/adm/style/acp_bots.html
@@ -76,9 +76,9 @@
<!-- IF bots.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->
<td style="width: 50%;">{bots.BOT_NAME}</td>
<td style="width: 15%; white-space: nowrap;" align="center">&nbsp;{bots.LAST_VISIT}&nbsp;</td>
- <td style="text-align: center;">&nbsp;<a href="{bots.U_ACTIVATE_DEACTIVATE}">{bots.L_ACTIVATE_DEACTIVATE}</a>&nbsp;</td>
+ <td style="text-align: center;">&nbsp;<a href="{bots.U_ACTIVATE_DEACTIVATE}" data-ajax="activate_deactivate">{bots.L_ACTIVATE_DEACTIVATE}</a>&nbsp;</td>
<td style="text-align: center;">&nbsp;<a href="{bots.U_EDIT}">{L_EDIT}</a>&nbsp;</td>
- <td style="text-align: center;">&nbsp;<a href="{bots.U_DELETE}">{L_DELETE}</a>&nbsp;</td>
+ <td style="text-align: center;">&nbsp;<a href="{bots.U_DELETE}" data-ajax="row_delete">{L_DELETE}</a>&nbsp;</td>
<td style="text-align: center;"><input type="checkbox" class="radio" name="mark[]" value="{bots.BOT_ID}" /></td>
</tr>
<!-- END bots -->
diff --git a/phpBB/adm/style/acp_forums.html b/phpBB/adm/style/acp_forums.html
index 447c0ce466..048a24a328 100644
--- a/phpBB/adm/style/acp_forums.html
+++ b/phpBB/adm/style/acp_forums.html
@@ -443,7 +443,7 @@
<col class="row1" /><col class="row1" /><col class="row2" />
<tbody>
<!-- BEGIN forums -->
- <tr>
+ <tr data-down="{forums.U_MOVE_DOWN}" data-up="{forums.U_MOVE_UP}">
<td style="width: 5%; text-align: center;">{forums.FOLDER_IMAGE}</td>
<td>
<!-- IF forums.FORUM_IMAGE --><div style="float: {S_CONTENT_FLOW_BEGIN}; margin-right: 5px;">{forums.FORUM_IMAGE}</div><!-- ENDIF -->
@@ -453,17 +453,17 @@
</td>
<td style="vertical-align: top; width: 100px; text-align: right; white-space: nowrap;">
<!-- IF forums.S_FIRST_ROW && not forums.S_LAST_ROW -->
- {ICON_MOVE_UP_DISABLED}
- <a href="{forums.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a>
+ <span class="up">{ICON_MOVE_UP_DISABLED}</span>
+ <span class="down"><a href="{forums.U_MOVE_DOWN}" data-ajax="forum_down">{ICON_MOVE_DOWN}</a></span>
<!-- ELSEIF not forums.S_FIRST_ROW && not forums.S_LAST_ROW -->
- <a href="{forums.U_MOVE_UP}">{ICON_MOVE_UP}</a>
- <a href="{forums.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a>
+ <span class="up"><a href="{forums.U_MOVE_UP}" data-ajax="forum_up">{ICON_MOVE_UP}</a></span>
+ <span class="down"><a href="{forums.U_MOVE_DOWN}" data-ajax="forum_down">{ICON_MOVE_DOWN}</a></span>
<!-- ELSEIF forums.S_LAST_ROW && not forums.S_FIRST_ROW -->
- <a href="{forums.U_MOVE_UP}">{ICON_MOVE_UP}</a>
- {ICON_MOVE_DOWN_DISABLED}
+ <span class="up"><a href="{forums.U_MOVE_UP}" data-ajax="forum_up">{ICON_MOVE_UP}</a></span>
+ <span class="down">{ICON_MOVE_DOWN_DISABLED}</span>
<!-- ELSE -->
- {ICON_MOVE_UP_DISABLED}
- {ICON_MOVE_DOWN_DISABLED}
+ <span class="up">{ICON_MOVE_UP_DISABLED}</span>
+ <span class="down">{ICON_MOVE_DOWN_DISABLED}</span>
<!-- ENDIF -->
<a href="{forums.U_EDIT}">{ICON_EDIT}</a>
<!-- IF not forums.S_FORUM_LINK -->
@@ -500,6 +500,14 @@
</fieldset>
</form>
+ <div class="hidden">
+ <a class="template-up-img" href="#">{ICON_MOVE_UP}</a>
+ <span class="template-up-img-disabled">{ICON_MOVE_UP_DISABLED}</span>
+
+ <a class="template-down-img" href="#">{ICON_MOVE_DOWN}</a>
+ <span class="template-down-img-disabled">{ICON_MOVE_DOWN_DISABLED}</span>
+ </div>
+
<!-- ENDIF -->
<!-- INCLUDE overall_footer.html -->
diff --git a/phpBB/adm/style/acp_groups.html b/phpBB/adm/style/acp_groups.html
index 158751623a..ed94fa985e 100644
--- a/phpBB/adm/style/acp_groups.html
+++ b/phpBB/adm/style/acp_groups.html
@@ -350,7 +350,7 @@
<td style="text-align: center;">{groups.TOTAL_MEMBERS}</td>
<td style="text-align: center;"><a href="{groups.U_EDIT}">{L_SETTINGS}</a></td>
<td style="text-align: center;"><a href="{groups.U_LIST}">{L_MEMBERS}</a></td>
- <td style="text-align: center;"><!-- IF not groups.S_GROUP_SPECIAL and groups.U_DELETE --><a href="{groups.U_DELETE}">{L_DELETE}</a><!-- ELSE -->{L_DELETE}<!-- ENDIF --></td>
+ <td style="text-align: center;"><!-- IF not groups.S_GROUP_SPECIAL and groups.U_DELETE --><a href="{groups.U_DELETE}" data-ajax="row_delete">{L_DELETE}</a><!-- ELSE -->{L_DELETE}<!-- ENDIF --></td>
</tr>
<!-- ENDIF -->
<!-- END groups -->
diff --git a/phpBB/adm/style/acp_icons.html b/phpBB/adm/style/acp_icons.html
index 85b5343666..a8864d42f7 100644
--- a/phpBB/adm/style/acp_icons.html
+++ b/phpBB/adm/style/acp_icons.html
@@ -245,7 +245,7 @@
<td style="text-align: right; white-space: nowrap;">
<!-- IF items.S_FIRST_ROW and not PREVIOUS_PAGE -->{ICON_MOVE_UP_DISABLED}<!-- ELSE --><a href="{items.U_MOVE_UP}">{ICON_MOVE_UP}</a><!-- ENDIF -->&nbsp;
<!-- IF items.S_LAST_ROW and not NEXT_PAGE -->{ICON_MOVE_DOWN_DISABLED}<!-- ELSE --><a href="{items.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a><!-- ENDIF -->
- &nbsp;<a href="{items.U_EDIT}">{ICON_EDIT}</a> <a href="{items.U_DELETE}">{ICON_DELETE}</a>
+ &nbsp;<a href="{items.U_EDIT}">{ICON_EDIT}</a> <a href="{items.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a>
</td>
</tr>
<!-- BEGINELSE -->
diff --git a/phpBB/adm/style/acp_main.html b/phpBB/adm/style/acp_main.html
index 11f7fedd38..d9f833d878 100644
--- a/phpBB/adm/style/acp_main.html
+++ b/phpBB/adm/style/acp_main.html
@@ -152,35 +152,35 @@
<fieldset>
<legend>{L_STATISTIC_RESYNC_OPTIONS}</legend>
- <form id="action_online_form" method="post" action="{U_ACTION}">
+ <form id="action_online_form" method="post" action="{U_ACTION}" data-ajax="true">
<dl>
<dt><label for="action_online">{L_RESET_ONLINE}</label><br /><span>&nbsp;</span></dt>
<dd><input type="hidden" name="action" value="online" /><input class="button2" type="submit" id="action_online" name="action_online" value="{L_RUN}" /></dd>
</dl>
</form>
- <form id="action_date_form" method="post" action="{U_ACTION}">
+ <form id="action_date_form" method="post" action="{U_ACTION}" data-ajax="true">
<dl>
<dt><label for="action_date">{L_RESET_DATE}</label><br /><span>&nbsp;</span></dt>
<dd><input type="hidden" name="action" value="date" /><input class="button2" type="submit" id="action_date" name="action_date" value="{L_RUN}" /></dd>
</dl>
</form>
- <form id="action_stats_form" method="post" action="{U_ACTION}">
+ <form id="action_stats_form" method="post" action="{U_ACTION}" data-ajax="true">
<dl>
<dt><label for="action_stats">{L_RESYNC_STATS}</label><br /><span>{L_RESYNC_STATS_EXPLAIN}</span></dt>
<dd><input type="hidden" name="action" value="stats" /><input class="button2" type="submit" id="action_stats" name="action_stats" value="{L_RUN}" /></dd>
</dl>
</form>
- <form id="action_user_form" method="post" action="{U_ACTION}">
+ <form id="action_user_form" method="post" action="{U_ACTION}" data-ajax="true">
<dl>
<dt><label for="action_user">{L_RESYNC_POSTCOUNTS}</label><br /><span>{L_RESYNC_POSTCOUNTS_EXPLAIN}</span></dt>
<dd><input type="hidden" name="action" value="user" /><input class="button2" type="submit" id="action_user" name="action_user" value="{L_RUN}" /></dd>
</dl>
</form>
- <form id="action_db_track_form" method="post" action="{U_ACTION}">
+ <form id="action_db_track_form" method="post" action="{U_ACTION}" data-ajax="true">
<dl>
<dt><label for="action_db_track">{L_RESYNC_POST_MARKING}</label><br /><span>{L_RESYNC_POST_MARKING_EXPLAIN}</span></dt>
<dd><input type="hidden" name="action" value="db_track" /><input class="button2" type="submit" id="action_db_track" name="action_db_track" value="{L_RUN}" /></dd>
@@ -188,19 +188,20 @@
</form>
<!-- IF S_FOUNDER -->
- <form id="action_purge_sessions_form" method="post" action="{U_ACTION}">
+ <form id="action_purge_sessions_form" method="post" action="{U_ACTION}" data-ajax="true">
<dl>
<dt><label for="action_purge_sessions">{L_PURGE_SESSIONS}</label><br /><span>{L_PURGE_SESSIONS_EXPLAIN}</span></dt>
<dd><input type="hidden" name="action" value="purge_sessions" /><input class="button2" type="submit" id="action_purge_sessions" name="action_purge_sessions" value="{L_RUN}" /></dd>
</dl>
</form>
- <form id="action_purge_cache_form" method="post" action="{U_ACTION}">
+ <!-- ENDIF -->
+
+ <form id="action_purge_cache_form" method="post" action="{U_ACTION}" data-ajax="true">
<dl>
<dt><label for="action_purge_cache">{L_PURGE_CACHE}</label><br /><span>{L_PURGE_CACHE_EXPLAIN}</span></dt>
<dd><input type="hidden" name="action" value="purge_cache" /><input class="button2" type="submit" id="action_purge_cache" name="action_purge_cache" value="{L_RUN}" /></dd>
</dl>
</form>
- <!-- ENDIF -->
</fieldset>
<!-- ENDIF -->
diff --git a/phpBB/adm/style/acp_modules.html b/phpBB/adm/style/acp_modules.html
index 3f1c0bf50b..6c4645e80c 100644
--- a/phpBB/adm/style/acp_modules.html
+++ b/phpBB/adm/style/acp_modules.html
@@ -164,7 +164,7 @@
{ICON_MOVE_DOWN_DISABLED}
<!-- ENDIF -->
<a href="{modules.U_EDIT}">{ICON_EDIT}</a>
- <a href="{modules.U_DELETE}">{ICON_DELETE}</a>
+ <a href="{modules.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a>
</td>
</tr>
<!-- END modules -->
diff --git a/phpBB/adm/style/acp_permission_roles.html b/phpBB/adm/style/acp_permission_roles.html
index 658d8dd0c8..2ac77af25d 100644
--- a/phpBB/adm/style/acp_permission_roles.html
+++ b/phpBB/adm/style/acp_permission_roles.html
@@ -174,7 +174,7 @@
{ICON_MOVE_DOWN_DISABLED}
<!-- ENDIF -->
<a href="{roles.U_EDIT}" title="{L_EDIT_ROLE}">{ICON_EDIT}</a>
- <a href="{roles.U_REMOVE}" title="{L_REMOVE_ROLE}">{ICON_DELETE}</a>
+ <a href="{roles.U_REMOVE}" title="{L_REMOVE_ROLE}" data-ajax="row_delete">{ICON_DELETE}</a>
</td>
</tr>
<!-- END roles -->
diff --git a/phpBB/adm/style/acp_profile.html b/phpBB/adm/style/acp_profile.html
index 0ac0d78a64..4a6df768a8 100644
--- a/phpBB/adm/style/acp_profile.html
+++ b/phpBB/adm/style/acp_profile.html
@@ -195,7 +195,7 @@
<td>{fields.FIELD_IDENT}</td>
<td>{fields.FIELD_TYPE}</td>
- <td style="text-align: center;"><a href="{fields.U_ACTIVATE_DEACTIVATE}">{fields.L_ACTIVATE_DEACTIVATE}</a><!-- IF fields.S_NEED_EDIT --> | <a href="{fields.U_TRANSLATE}" style="color: red;">{L_TRANSLATE}</a><!-- ENDIF --></td>
+ <td style="text-align: center;"><a href="{fields.U_ACTIVATE_DEACTIVATE}" data-ajax="activate_deactivate">{fields.L_ACTIVATE_DEACTIVATE}</a><!-- IF fields.S_NEED_EDIT --> | <a href="{fields.U_TRANSLATE}" style="color: red;">{L_TRANSLATE}</a><!-- ENDIF --></td>
<td style="width: 80px; text-align: right; white-space: nowrap;">
<!-- IF fields.S_FIRST_ROW && not fields.S_LAST_ROW -->
@@ -213,7 +213,7 @@
<!-- ELSE -->
{ICON_EDIT_DISABLED}
<!-- ENDIF -->
- <a href="{fields.U_DELETE}">{ICON_DELETE}</a>
+ <a href="{fields.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a>
</td>
</tr>
diff --git a/phpBB/adm/style/acp_ranks.html b/phpBB/adm/style/acp_ranks.html
index 2f77a256b1..7fb7da7095 100644
--- a/phpBB/adm/style/acp_ranks.html
+++ b/phpBB/adm/style/acp_ranks.html
@@ -80,7 +80,7 @@
<td style="text-align: center;"><!-- IF ranks.S_RANK_IMAGE --><img src="{ranks.RANK_IMAGE}" alt="{ranks.RANK_TITLE}" title="{ranks.RANK_TITLE}" /><!-- ELSE -->&nbsp; - &nbsp;<!-- ENDIF --></td>
<td style="text-align: center;">{ranks.RANK_TITLE}</td>
<td style="text-align: center;"><!-- IF ranks.S_SPECIAL_RANK -->&nbsp; - &nbsp;<!-- ELSE -->{ranks.MIN_POSTS}<!-- ENDIF --></td>
- <td style="text-align: center;"><a href="{ranks.U_EDIT}">{ICON_EDIT}</a> <a href="{ranks.U_DELETE}">{ICON_DELETE}</a></td>
+ <td style="text-align: center;"><a href="{ranks.U_EDIT}">{ICON_EDIT}</a> <a href="{ranks.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a></td>
</tr>
<!-- END ranks -->
</tbody>
diff --git a/phpBB/adm/style/acp_reasons.html b/phpBB/adm/style/acp_reasons.html
index 522aec5930..7cf2cce4c9 100644
--- a/phpBB/adm/style/acp_reasons.html
+++ b/phpBB/adm/style/acp_reasons.html
@@ -99,7 +99,7 @@
<!-- ENDIF -->
<a href="{reasons.U_EDIT}">{ICON_EDIT}</a>
<!-- IF reasons.U_DELETE -->
- <a href="{reasons.U_DELETE}">{ICON_DELETE}</a>
+ <a href="{reasons.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a>
<!-- ELSE -->
{ICON_DELETE_DISABLED}
<!-- ENDIF -->
diff --git a/phpBB/adm/style/acp_words.html b/phpBB/adm/style/acp_words.html
index 113f58ef92..4acd75f933 100644
--- a/phpBB/adm/style/acp_words.html
+++ b/phpBB/adm/style/acp_words.html
@@ -60,7 +60,7 @@
<!-- IF words.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->
<td style="text-align: center;">{words.WORD}</td>
<td style="text-align: center;">{words.REPLACEMENT}</td>
- <td>&nbsp;<a href="{words.U_EDIT}">{ICON_EDIT}</a>&nbsp;&nbsp;<a href="{words.U_DELETE}">{ICON_DELETE}</a>&nbsp;</td>
+ <td>&nbsp;<a href="{words.U_EDIT}">{ICON_EDIT}</a>&nbsp;&nbsp;<a href="{words.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a>&nbsp;</td>
</tr>
<!-- BEGINELSE -->
<tr class="row3">
diff --git a/phpBB/adm/style/admin.css b/phpBB/adm/style/admin.css
index 14a2b6dded..7afcc3d23b 100644
--- a/phpBB/adm/style/admin.css
+++ b/phpBB/adm/style/admin.css
@@ -101,6 +101,10 @@ hr {
font-size: 0.85em;
}
+.hidden {
+ display: none;
+}
+
/* General links */
a:link, a:visited {
color: #105289;
@@ -1087,6 +1091,56 @@ input.disabled {
color: #666666;
}
+/* jQuery popups
+---------------------------------------- */
+.phpbb_alert {
+ background-color: #FFFFFF;
+ border: 1px solid #999999;
+ position: fixed;
+ display: none;
+ top: 100px;
+ left: 35%;
+ width: 30%;
+ z-index: 50;
+ padding: 25px;
+ padding: 0 25px 20px 25px;
+}
+
+.phpbb_alert .alert_close {
+ display: block;
+ float: right;
+ width: 16px;
+ height: 16px;
+ overflow: hidden;
+ text-decoration: none !important;
+ background: transparent url("../images/alert_close.png") 0 0 no-repeat;
+ margin-top: -7px;
+ margin-right: -31px;
+}
+.phpbb_alert .alert_close:hover {
+ background-position: 0 -16px;
+}
+
+
+.phpbb_alert p {
+ margin: 8px 0;
+ padding-bottom: 8px;
+}
+
+#darkenwrapper {
+ display: none;
+}
+
+#darken {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ background-color: #000000;
+ opacity: 0.5;
+}
+
/* Pagination
---------------------------------------- */
.pagination {
diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js
new file mode 100644
index 0000000000..fd2f7a2122
--- /dev/null
+++ b/phpBB/adm/style/ajax.js
@@ -0,0 +1,135 @@
+(function($) { // Avoid conflicts with other libraries
+
+"use strict";
+
+var img_templates = {
+ up: $('.template-up-img'),
+ up_disabled: $('.template-up-img-disabled'),
+ down: $('.template-down-img'),
+ down_disabled: $('.template-down-img-disabled')
+};
+
+/**
+ * The following callbacks are for reording forums in acp_forums. forum_down
+ * is triggered when a forum is moved down, and forum_up is triggered when
+ * a forum is moved up. It moves the row up or down, and deactivates /
+ * activates any up / down icons that require it (the ones at the top or bottom).
+ */
+phpbb.add_ajax_callback('forum_down', function() {
+ var el = $(this),
+ tr = el.parents('tr');
+
+ if (tr.is(':first-child'))
+ {
+ var up_img = img_templates.up.clone().attr('href', tr.attr('data-up'));
+ el.parents('span').siblings('.up').html(up_img);
+
+ tr.next().find('.up').html(img_templates.up_disabled);
+
+ phpbb.ajaxify({
+ selector: el.parents('span').siblings('.up').children('a'),
+ callback: 'forum_up'
+ });
+ }
+
+ tr.insertAfter(tr.next());
+
+ if (tr.is(':last-child'))
+ {
+ el.replaceWith(img_templates.down_disabled);
+
+ var down_img = img_templates.down.clone().attr('href', tr.attr('data-down'));
+ tr.prev().find('.down').html(down_img);
+
+ phpbb.ajaxify({
+ selector: tr.prev().find('.down').children('a'),
+ callback: 'forum_down'
+ });
+ }
+});
+
+phpbb.add_ajax_callback('forum_up', function() {
+ var el = $(this),
+ tr = el.parents('tr');
+
+ if (tr.is(':last-child'))
+ {
+ var down_img = img_templates.down.clone().attr('href', tr.attr('data-down'));
+ el.parents('span').siblings('.down').html(down_img);
+
+ tr.prev().find('.down').html(img_templates.down_disabled);
+
+ phpbb.ajaxify({
+ selector: el.parents('span').siblings('.down').children('a'),
+ callback: 'forum_down'
+ });
+ }
+
+ tr.insertBefore(tr.prev());
+
+ if (tr.is(':first-child'))
+ {
+ el.replaceWith(img_templates.up_disabled);
+
+ var up_img = img_templates.up.clone().attr('href', tr.attr('data-up'));
+ tr.next().find('.up').html(up_img);
+
+ phpbb.ajaxify({
+ selector: tr.next().find('.up').children('a'),
+ callback: 'forum_up'
+ });
+ }
+});
+
+/**
+ * This callback replaces activate links with deactivate links and vice versa.
+ * It does this by replacing the text, and replacing all instances of "activate"
+ * in the href with "deactivate", and vice versa.
+ */
+phpbb.add_ajax_callback('activate_deactivate', function(res) {
+ var el = $(this),
+ new_href = el.attr('href');
+
+ el.text(res.text);
+
+ if (new_href.indexOf('deactivate') !== -1)
+ {
+ new_href = new_href.replace('deactivate', 'activate')
+ }
+ else
+ {
+ new_href = new_href.replace('activate', 'deactivate')
+ }
+
+ el.attr('href', new_href);
+});
+
+/**
+ * The removes the parent row of the link or form that triggered the callback,
+ * and is good for stuff like the removal of forums.
+ */
+phpbb.add_ajax_callback('row_delete', function() {
+ $(this).parents('tr').remove();
+});
+
+
+
+$('[data-ajax]').each(function() {
+ var $this = $(this),
+ ajax = $this.attr('data-ajax'),
+ fn;
+
+ if (ajax !== 'false')
+ {
+ fn = (ajax !== 'true') ? ajax : null;
+ phpbb.ajaxify({
+ selector: this,
+ refresh: $this.attr('data-refresh') !== undefined,
+ callback: fn
+ });
+ }
+});
+
+
+
+})(jQuery); // Avoid conflicts with other libraries
diff --git a/phpBB/adm/style/overall_footer.html b/phpBB/adm/style/overall_footer.html
index f05e9c56c5..0337080f3d 100644
--- a/phpBB/adm/style/overall_footer.html
+++ b/phpBB/adm/style/overall_footer.html
@@ -17,11 +17,29 @@
<!-- IF S_COPYRIGHT_HTML --><br /><!-- ENDIF -->
{DEBUG_OUTPUT}
<!-- ENDIF -->
+
+ <div id="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}">
+ <div id="darken">&nbsp;</div>
+ <div class="jalert" id="loadingalert"><h3>{L_LOADING}</h3><p>{L_PLEASE_WAIT}</p></div>
+ </div>
+
+ <div id="phpbb_alert" class="phpbb_alert" data-l-err="{L_ERROR}" data-l-timeout-processing-req="{L_TIMEOUT_PROCESSING_REQ}">
+ <a href="#" class="alert_close"></a>
+ <h3 class="alert_title"></h3><p class="alert_text"></p>
+ </div>
+ <div id="phpbb_confirm" class="phpbb_alert">
+ <a href="#" class="alert_close"></a>
+ <p class="alert_text"></p>
+ <input type="button" class="button1" value="{L_YES}" />&nbsp;
+ <input type="button" class="button2" value="{L_NO}" />
+ </div>
</div>
</div>
<script type="text/javascript" src="{T_JQUERY_LINK}"></script>
<!-- IF S_JQUERY_FALLBACK --><script type="text/javascript">window.jQuery || document.write(unescape('%3Cscript src="{T_ASSETS_PATH}/javascript/jquery.js" type="text/javascript"%3E%3C/script%3E'));</script><!-- ENDIF -->
+<script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js"></script>
+<script type="text/javascript" src="style/ajax.js"></script>
</body>
</html>
diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js
new file mode 100644
index 0000000000..c41edfa145
--- /dev/null
+++ b/phpBB/assets/javascript/core.js
@@ -0,0 +1,445 @@
+var phpbb = {};
+phpbb.alert_time = 100;
+
+(function($) { // Avoid conflicts with other libraries
+
+"use strict";
+
+// define a couple constants for keydown functions.
+var keymap = {
+ ENTER: 13,
+ ESC: 27
+};
+
+var dark = $('#darkenwrapper');
+var loading_alert = $('#loadingalert');
+
+
+/**
+ * Display a loading screen.
+ *
+ * @returns object Returns loading_alert.
+ */
+phpbb.loading_alert = function() {
+ if (dark.is(':visible'))
+ {
+ loading_alert.fadeIn(phpbb.alert_time);
+ }
+ else
+ {
+ loading_alert.show();
+ dark.fadeIn(phpbb.alert_time, function() {
+ // Wait five seconds and display an error if nothing has been returned by then.
+ setTimeout(function() {
+ if (loading_alert.is(':visible'))
+ {
+ phpbb.alert($('#phpbb_alert').attr('data-l-err'), $('#phpbb_alert').attr('data-l-timeout-processing-req'));
+ }
+ }, 5000);
+ });
+ }
+
+ return loading_alert;
+}
+
+/**
+ * Display a simple alert similar to JSs native alert().
+ *
+ * You can only call one alert or confirm box at any one time.
+ *
+ * @param string title Title of the message, eg "Information" (HTML).
+ * @param string msg Message to display (HTML).
+ * @param bool fadedark Remove the dark background when done? Defaults
+ * to yes.
+ *
+ * @returns object Returns the div created.
+ */
+phpbb.alert = function(title, msg, fadedark) {
+ var div = $('#phpbb_alert');
+ div.find('.alert_title').html(title);
+ div.find('.alert_text').html(msg);
+
+ div.bind('click', function(e) {
+ e.stopPropagation();
+ });
+ dark.one('click', function(e) {
+ var fade;
+
+ div.find('.alert_close').unbind('click');
+ fade = (typeof fadedark !== 'undefined' && !fadedark) ? div : dark;
+ fade.fadeOut(phpbb.alert_time, function() {
+ div.hide();
+ });
+
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ $(document).bind('keydown', function(e) {
+ if (e.keyCode === keymap.ENTER || e.keyCode === keymap.ESC) {
+ dark.trigger('click');
+
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ });
+
+ div.find('.alert_close').one('click', function(e) {
+ dark.trigger('click');
+
+ e.preventDefault();
+ });
+
+ if (loading_alert.is(':visible'))
+ {
+ loading_alert.fadeOut(phpbb.alert_time, function() {
+ dark.append(div);
+ div.fadeIn(phpbb.alert_time);
+ });
+ }
+ else if (dark.is(':visible'))
+ {
+ dark.append(div);
+ div.fadeIn(phpbb.alert_time);
+ }
+ else
+ {
+ dark.append(div);
+ div.show();
+ dark.fadeIn(phpbb.alert_time);
+ }
+
+ return div;
+}
+
+/**
+ * Display a simple yes / no box to the user.
+ *
+ * You can only call one alert or confirm box at any one time.
+ *
+ * @param string msg Message to display (HTML).
+ * @param function callback Callback. Bool param, whether the user pressed
+ * yes or no (or whatever their language is).
+ * @param bool fadedark Remove the dark background when done? Defaults
+ * to yes.
+ *
+ * @returns object Returns the div created.
+ */
+phpbb.confirm = function(msg, callback, fadedark) {
+ var div = $('#phpbb_confirm');
+ div.find('.alert_text').html(msg);
+
+ div.bind('click', function(e) {
+ e.stopPropagation();
+ });
+
+ var click_handler = function(e) {
+ var res = this.className === 'button1';
+ var fade = (typeof fadedark !== 'undefined' && !fadedark && res) ? div : dark;
+ fade.fadeOut(phpbb.alert_time, function() {
+ div.hide();
+ });
+ div.find('input[type="button"]').unbind('click', click_handler);
+ callback(res);
+
+ if (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ };
+ div.find('input[type="button"]').one('click', click_handler);
+
+ dark.one('click', function(e) {
+ div.find('.alert_close').unbind('click');
+ dark.fadeOut(phpbb.alert_time, function() {
+ div.hide();
+ });
+ callback(false);
+
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ $(document).bind('keydown', function(e) {
+ if (e.keyCode === keymap.ENTER) {
+ $('input[type="button"].button1').trigger('click');
+ e.preventDefault();
+ e.stopPropagation();
+ } else if (e.keyCode === keymap.ESC) {
+ $('input[type="button"].button2').trigger('click');
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ });
+
+ div.find('.alert_close').one('click', function(e) {
+ var fade = (typeof fadedark !== 'undefined' && fadedark) ? div : dark;
+ fade.fadeOut(phpbb.alert_time, function() {
+ div.hide();
+ });
+ callback(false);
+
+ e.preventDefault();
+ });
+
+ if (loading_alert.is(':visible'))
+ {
+ loading_alert.fadeOut(phpbb.alert_time, function() {
+ dark.append(div);
+ div.fadeIn(phpbb.alert_time);
+ });
+ }
+ else if (dark.is(':visible'))
+ {
+ dark.append(div);
+ div.fadeIn(phpbb.alert_time);
+ }
+ else
+ {
+ dark.append(div);
+ div.show();
+ dark.fadeIn(phpbb.alert_time);
+ }
+
+ return div;
+}
+
+/**
+ * Turn a querystring into an array.
+ *
+ * @argument string string The querystring to parse.
+ * @returns object The object created.
+ */
+phpbb.parse_querystring = function(string) {
+ var params = {}, i, split;
+
+ string = string.split('&');
+ for (i = 0; i < string.length; i++)
+ {
+ split = string[i].split('=');
+ params[split[0]] = decodeURIComponent(split[1]);
+ }
+ return params;
+}
+
+
+/**
+ * Makes a link use AJAX instead of loading an entire page.
+ *
+ * This function will work for links (both standard links and links which
+ * invoke confirm_box) and forms. It will be called automatically for links
+ * and forms with the data-ajax attribute set, and will call the necessary
+ * callback.
+ *
+ * For more info, view the following page on the phpBB wiki:
+ * http://wiki.phpbb.com/JavaScript_Function.phpbb.ajaxify
+ *
+ * @param object options Options.
+ * @param bool/function refresh If we are sent back a refresh, should it be
+ * acted upon? This can either be true / false / a function.
+ * @param function callback Callback to call on completion of event. Has
+ * three parameters: the element that the event was evoked from, the JSON
+ * that was returned and (if it is a form) the form action.
+ */
+phpbb.ajaxify = function(options) {
+ var elements = $(options.selector),
+ refresh = options.refresh,
+ callback = options.callback,
+ is_form = elements.is('form'),
+ event_name = is_form ? 'submit' : 'click';
+
+ elements.bind(event_name, function(event) {
+ var action, method, data, submit, that = this, $this = $(this);
+
+ if ($this.find('input[type="submit"][data-clicked]').attr('data-ajax') === 'false')
+ {
+ return;
+ }
+
+ /**
+ * This is a private function used to handle the callbacks, refreshes
+ * and alert. It calls the callback, refreshes the page if necessary, and
+ * displays an alert to the user and removes it after an amount of time.
+ *
+ * It cannot be called from outside this function, and is purely here to
+ * avoid repetition of code.
+ *
+ * @param object res The object sent back by the server.
+ */
+ function return_handler(res)
+ {
+ var alert;
+
+ // Is a confirmation required?
+ if (typeof res.S_CONFIRM_ACTION === 'undefined')
+ {
+ // If a confirmation is not required, display an alert and call the
+ // callbacks.
+ if (typeof res.MESSAGE_TITLE !== 'undefined')
+ {
+ alert = phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
+ }
+ else
+ {
+ dark.fadeOut(phpbb.alert_time);
+ }
+
+ if (typeof phpbb.ajax_callbacks[callback] === 'function')
+ {
+ phpbb.ajax_callbacks[callback].call(that, res);
+ }
+
+ // If the server says to refresh the page, check whether the page should
+ // be refreshed and refresh page after specified time if required.
+ if (res.REFRESH_DATA)
+ {
+ if (typeof refresh === 'function')
+ {
+ refresh = refresh(res.REFRESH_DATA.url);
+ }
+ else if (typeof refresh !== 'boolean')
+ {
+ refresh = false;
+ }
+
+ setTimeout(function() {
+ if (refresh)
+ {
+ window.location = res.REFRESH_DATA.url;
+ }
+
+ // Hide the alert even if we refresh the page, in case the user
+ // presses the back button.
+ dark.fadeOut(phpbb.alert_time, function() {
+ alert.hide();
+ });
+ }, res.REFRESH_DATA.time * 1000); // Server specifies time in seconds
+ }
+ }
+ else
+ {
+ // If confirmation is required, display a diologue to the user.
+ phpbb.confirm(res.MESSAGE_TEXT, function(del) {
+ if (del)
+ {
+ phpbb.loading_alert();
+ data = $('<form>' + res.S_HIDDEN_FIELDS + '</form>').serialize();
+ $.ajax({
+ url: res.S_CONFIRM_ACTION,
+ type: 'POST',
+ data: data + '&confirm=' + res.YES_VALUE,
+ success: return_handler,
+ error: error_handler
+ });
+ }
+ }, false);
+ }
+ }
+
+ function error_handler()
+ {
+ var alert;
+
+ alert = phpbb.alert(dark.attr('data-ajax-error-title'), dark.attr('data-ajax-error-text'));
+
+ setTimeout(function () {
+ dark.fadeOut(phpbb.alert_time, function() {
+ alert.hide();
+ });
+ }, 5000);
+ }
+
+ // If the element is a form, POST must be used and some extra data must
+ // be taken from the form.
+ var run_filter = (typeof options.filter === 'function');
+
+ if (is_form)
+ {
+ action = $this.attr('action').replace('&amp;', '&');
+ data = $this.serializeArray();
+ method = $this.attr('method') || 'GET';
+
+ if ($this.find('input[type="submit"][data-clicked]'))
+ {
+ submit = $this.find('input[type="submit"][data-clicked]');
+ data.push({
+ name: submit.attr('name'),
+ value: submit.val()
+ });
+ }
+ }
+ else
+ {
+ action = this.href;
+ data = null;
+ method = 'GET';
+ }
+
+ // If filter function returns false, cancel the AJAX functionality,
+ // and return true (meaning that the HTTP request will be sent normally).
+ if (run_filter && !options.filter.call(this, data))
+ {
+ return;
+ }
+
+ phpbb.loading_alert();
+
+ $.ajax({
+ url: action,
+ type: method,
+ data: data,
+ success: return_handler,
+ error: error_handler
+ });
+
+ event.preventDefault();
+ });
+
+ if (is_form) {
+ elements.find('input:submit').click(function () {
+ var $this = $(this);
+
+ $this.siblings('[data-clicked]').removeAttr('data-clicked');
+ $this.attr('data-clicked', 'true');
+ });
+ }
+
+ return this;
+}
+
+phpbb.ajax_callbacks = {};
+
+/**
+ * Adds an AJAX callback to be used by phpbb.ajaxify.
+ *
+ * See the phpbb.ajaxify comments for information on stuff like parameters.
+ *
+ * @param string id The name of the callback.
+ * @param function callback The callback to be called.
+ */
+phpbb.add_ajax_callback = function(id, callback)
+{
+ if (typeof callback === 'function')
+ {
+ phpbb.ajax_callbacks[id] = callback;
+ }
+ return this;
+}
+
+
+/**
+ * This callback alternates text - it replaces the current text with the text in
+ * the alt-text data attribute, and replaces the text in the attribute with the
+ * current text so that the process can be repeated.
+ */
+phpbb.add_ajax_callback('alt_text', function(data) {
+ var el = $(this),
+ alt_text;
+
+ alt_text = el.attr('data-alt-text');
+ el.attr('title', alt_text);
+ el.text(alt_text);
+});
+
+
+})(jQuery); // Avoid conflicts with other libraries
diff --git a/phpBB/common.php b/phpBB/common.php
index 5c468d74a2..3f039e49c0 100644
--- a/phpBB/common.php
+++ b/phpBB/common.php
@@ -15,6 +15,8 @@ if (!defined('IN_PHPBB'))
exit;
}
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
require($phpbb_root_path . 'includes/startup.' . $phpEx);
if (file_exists($phpbb_root_path . 'config.' . $phpEx))
@@ -98,6 +100,7 @@ $phpbb_class_loader_ext->set_cache($cache->get_driver());
$phpbb_class_loader->set_cache($cache->get_driver());
// Instantiate some basic classes
+$phpbb_dispatcher = new phpbb_event_dispatcher();
$request = new phpbb_request();
$user = new user();
$auth = new auth();
@@ -124,6 +127,9 @@ $phpbb_extension_manager = new phpbb_extension_manager($db, EXT_TABLE, $phpbb_ro
$style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_extension_manager);
$template = $style->template;
+$phpbb_subscriber_loader = new phpbb_event_extension_subscriber_loader($phpbb_dispatcher, $phpbb_extension_manager);
+$phpbb_subscriber_loader->load();
+
// Add own hook handler
require($phpbb_root_path . 'includes/hooks/index.' . $phpEx);
$phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display')));
diff --git a/phpBB/composer.json b/phpBB/composer.json
new file mode 100644
index 0000000000..1059b97f84
--- /dev/null
+++ b/phpBB/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "symfony/event-dispatcher": "2.0.*"
+ }
+}
diff --git a/phpBB/composer.lock b/phpBB/composer.lock
new file mode 100644
index 0000000000..062ad4b3aa
--- /dev/null
+++ b/phpBB/composer.lock
@@ -0,0 +1,10 @@
+{
+ "hash": "9bada3748ec2933fe0864dcfafbcd671",
+ "packages": [
+ {
+ "package": "symfony/event-dispatcher",
+ "version": "v2.0.10"
+ }
+ ],
+ "aliases": []
+}
diff --git a/phpBB/docs/AUTHORS b/phpBB/docs/AUTHORS
index 4fe0af6e28..8be261706e 100644
--- a/phpBB/docs/AUTHORS
+++ b/phpBB/docs/AUTHORS
@@ -79,3 +79,6 @@ Pear (c) 2001-2004 PHP Group, http://pear.php.net
Text_Diff-0.2.1 http://pear.php.net/package/Text_Diff
+MIT licenced:
+Symfony2 (c) 2004-2011 Fabien Potencier, http://symfony.com/
+
diff --git a/phpBB/download/file.php b/phpBB/download/file.php
index 2baa9d6c8a..c01b0789de 100644
--- a/phpBB/download/file.php
+++ b/phpBB/download/file.php
@@ -56,6 +56,7 @@ if (isset($_GET['avatar']))
$phpbb_class_loader_ext->set_cache($cache->get_driver());
$phpbb_class_loader->set_cache($cache->get_driver());
+ $phpbb_dispatcher = new phpbb_event_dispatcher();
$request = new phpbb_request();
$db = new $sql_db();
@@ -78,6 +79,9 @@ if (isset($_GET['avatar']))
// load extensions
$phpbb_extension_manager = new phpbb_extension_manager($db, EXT_TABLE, $phpbb_root_path, ".$phpEx", $cache->get_driver());
+ $phpbb_subscriber_loader = new phpbb_event_extension_subscriber_loader($phpbb_dispatcher, $phpbb_extension_manager);
+ $phpbb_subscriber_loader->load();
+
$filename = request_var('avatar', '');
$avatar_group = false;
$exit = false;
diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php
index a3822a982a..e537d7a8b9 100644
--- a/phpBB/includes/acp/acp_bbcodes.php
+++ b/phpBB/includes/acp/acp_bbcodes.php
@@ -24,7 +24,7 @@ class acp_bbcodes
function main($id, $mode)
{
- global $db, $user, $auth, $template, $cache;
+ global $db, $user, $auth, $template, $cache, $request;
global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
$user->add_lang('acp/posting');
@@ -272,6 +272,18 @@ class acp_bbcodes
$db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id");
$cache->destroy('sql', BBCODES_TABLE);
add_log('admin', 'LOG_BBCODE_DELETE', $row['bbcode_tag']);
+
+ if ($request->is_ajax())
+ {
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $user->lang['BBCODE_DELETED'],
+ 'REFRESH_DATA' => array(
+ 'time' => 3
+ )
+ ));
+ }
}
else
{
diff --git a/phpBB/includes/acp/acp_bots.php b/phpBB/includes/acp/acp_bots.php
index f080b3c9fb..b9dd6664f4 100644
--- a/phpBB/includes/acp/acp_bots.php
+++ b/phpBB/includes/acp/acp_bots.php
@@ -24,7 +24,7 @@ class acp_bots
function main($id, $mode)
{
- global $config, $db, $user, $auth, $template, $cache;
+ global $config, $db, $user, $auth, $template, $cache, $request;
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
$action = request_var('action', '');
@@ -352,6 +352,14 @@ class acp_bots
break;
}
+
+ if ($request->is_ajax() && ($action == 'activate' || $action == 'deactivate'))
+ {
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'text' => $user->lang['BOT_' . (($action == 'activate') ? 'DE' : '') . 'ACTIVATE'],
+ ));
+ }
$s_options = '';
$_options = array('activate' => 'BOT_ACTIVATE', 'deactivate' => 'BOT_DEACTIVATE', 'delete' => 'DELETE');
diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php
index fad22fc285..3a3b2021eb 100644
--- a/phpBB/includes/acp/acp_forums.php
+++ b/phpBB/includes/acp/acp_forums.php
@@ -25,7 +25,7 @@ class acp_forums
function main($id, $mode)
{
- global $db, $user, $auth, $template, $cache;
+ global $db, $user, $auth, $template, $cache, $request;
global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;
$user->add_lang('acp/forums');
@@ -255,6 +255,12 @@ class acp_forums
add_log('admin', 'LOG_FORUM_' . strtoupper($action), $row['forum_name'], $move_forum_name);
$cache->destroy('sql', FORUMS_TABLE);
}
+
+ if ($request->is_ajax())
+ {
+ $json_response = new phpbb_json_response;
+ $json_response->send(array('success' => ($move_forum_name !== false)));
+ }
break;
diff --git a/phpBB/includes/acp/acp_icons.php b/phpBB/includes/acp/acp_icons.php
index 49a092f16b..bfe17c5007 100644
--- a/phpBB/includes/acp/acp_icons.php
+++ b/phpBB/includes/acp/acp_icons.php
@@ -782,6 +782,18 @@ class acp_icons
$cache->destroy('_icons');
$cache->destroy('sql', $table);
+
+ if ($request->is_ajax())
+ {
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $notice,
+ 'REFRESH_DATA' => array(
+ 'time' => 3
+ )
+ ));
+ }
}
else
{
diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php
index 88c29702d4..144b225766 100644
--- a/phpBB/includes/acp/acp_main.php
+++ b/phpBB/includes/acp/acp_main.php
@@ -24,7 +24,7 @@ class acp_main
function main($id, $mode)
{
- global $config, $db, $user, $auth, $template;
+ global $config, $db, $user, $auth, $template, $request;
global $phpbb_root_path, $phpbb_admin_path, $phpEx;
// Show restore permissions notice
@@ -129,6 +129,11 @@ class acp_main
set_config('record_online_users', 1, true);
set_config('record_online_date', time(), true);
add_log('admin', 'LOG_RESET_ONLINE');
+
+ if ($request->is_ajax())
+ {
+ trigger_error('RESET_ONLINE_SUCCESS');
+ }
break;
case 'stats':
@@ -179,6 +184,11 @@ class acp_main
update_last_username();
add_log('admin', 'LOG_RESYNC_STATS');
+
+ if ($request->is_ajax())
+ {
+ trigger_error('RESYNC_STATS_SUCCESS');
+ }
break;
case 'user':
@@ -241,7 +251,11 @@ class acp_main
}
add_log('admin', 'LOG_RESYNC_POSTCOUNTS');
-
+
+ if ($request->is_ajax())
+ {
+ trigger_error('RESYNC_POSTCOUNTS_SUCCESS');
+ }
break;
case 'date':
@@ -252,6 +266,11 @@ class acp_main
set_config('board_startdate', time() - 1);
add_log('admin', 'LOG_RESET_DATE');
+
+ if ($request->is_ajax())
+ {
+ trigger_error('RESET_DATE_SUCCESS');
+ }
break;
case 'db_track':
@@ -327,14 +346,14 @@ class acp_main
}
add_log('admin', 'LOG_RESYNC_POST_MARKING');
- break;
-
- case 'purge_cache':
- if ((int) $user->data['user_type'] !== USER_FOUNDER)
+
+ if ($request->is_ajax())
{
- trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
+ trigger_error('RESYNC_POST_MARKING_SUCCESS');
}
+ break;
+ case 'purge_cache':
global $cache;
$cache->purge();
@@ -343,6 +362,11 @@ class acp_main
cache_moderators();
add_log('admin', 'LOG_PURGE_CACHE');
+
+ if ($request->is_ajax())
+ {
+ trigger_error('PURGE_CACHE_SUCCESS');
+ }
break;
case 'purge_sessions':
@@ -389,6 +413,11 @@ class acp_main
$db->sql_query($sql);
add_log('admin', 'LOG_PURGE_SESSIONS');
+
+ if ($request->is_ajax())
+ {
+ trigger_error('PURGE_SESSIONS_SUCCESS');
+ }
break;
}
}
diff --git a/phpBB/includes/acp/acp_modules.php b/phpBB/includes/acp/acp_modules.php
index 9d87bbbfbb..8528dc91c4 100644
--- a/phpBB/includes/acp/acp_modules.php
+++ b/phpBB/includes/acp/acp_modules.php
@@ -36,7 +36,7 @@ class acp_modules
function main($id, $mode)
{
- global $db, $user, $auth, $template, $module;
+ global $db, $user, $auth, $template, $module, $request;
global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;
// Set a global define for modules we might include (the author is able to prevent execution of code by checking this constant)
@@ -373,6 +373,15 @@ class acp_modules
// Default management page
if (sizeof($errors))
{
+ if ($request->is_ajax())
+ {
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $user->lang('ERROR'),
+ 'MESSAGE_TEXT' => implode('<br />', $errors),
+ ));
+ }
+
$template->assign_vars(array(
'S_ERROR' => true,
'ERROR_MSG' => implode('<br />', $errors))
diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php
index 511148baf9..3ffffd3047 100644
--- a/phpBB/includes/acp/acp_profile.php
+++ b/phpBB/includes/acp/acp_profile.php
@@ -242,6 +242,15 @@ class acp_profile
$db->sql_freeresult($result);
add_log('admin', 'LOG_PROFILE_FIELD_ACTIVATE', $field_ident);
+
+ if ($request->is_ajax())
+ {
+ $json_response = new phpbb_json_response();
+ $json_response->send(array(
+ 'text' => $user->lang('DEACTIVATE'),
+ ));
+ }
+
trigger_error($user->lang['PROFILE_FIELD_ACTIVATED'] . adm_back_link($this->u_action));
break;
@@ -266,7 +275,16 @@ class acp_profile
$field_ident = (string) $db->sql_fetchfield('field_ident');
$db->sql_freeresult($result);
+ if ($request->is_ajax())
+ {
+ $json_response = new phpbb_json_response();
+ $json_response->send(array(
+ 'text' => $user->lang('ACTIVATE'),
+ ));
+ }
+
add_log('admin', 'LOG_PROFILE_FIELD_DEACTIVATE', $field_ident);
+
trigger_error($user->lang['PROFILE_FIELD_DEACTIVATED'] . adm_back_link($this->u_action));
break;
diff --git a/phpBB/includes/acp/acp_ranks.php b/phpBB/includes/acp/acp_ranks.php
index ec5a76df87..d9ed5b17f1 100644
--- a/phpBB/includes/acp/acp_ranks.php
+++ b/phpBB/includes/acp/acp_ranks.php
@@ -24,7 +24,7 @@ class acp_ranks
function main($id, $mode)
{
- global $db, $user, $auth, $template, $cache;
+ global $db, $user, $auth, $template, $cache, $request;
global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
$user->add_lang('acp/posting');
@@ -122,6 +122,18 @@ class acp_ranks
$cache->destroy('_ranks');
add_log('admin', 'LOG_RANK_REMOVED', $rank_title);
+
+ if ($request->is_ajax())
+ {
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $user->lang['RANK_REMOVED'],
+ 'REFRESH_DATA' => array(
+ 'time' => 3
+ )
+ ));
+ }
}
else
{
diff --git a/phpBB/includes/event/data.php b/phpBB/includes/event/data.php
new file mode 100644
index 0000000000..70718ff0ae
--- /dev/null
+++ b/phpBB/includes/event/data.php
@@ -0,0 +1,68 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+use Symfony\Component\EventDispatcher\Event;
+
+class phpbb_event_data extends Event implements ArrayAccess
+{
+ private $data;
+
+ public function __construct(array $data = array())
+ {
+ $this->set_data($data);
+ }
+
+ public function set_data(array $data = array())
+ {
+ $this->data = $data;
+ }
+
+ public function get_data()
+ {
+ return $this->data;
+ }
+
+ /**
+ * Returns data filtered to only include specified keys.
+ *
+ * This effectively discards any keys added to data by hooks.
+ */
+ public function get_data_filtered($keys)
+ {
+ return array_intersect_key($this->data, array_flip($keys));
+ }
+
+ public function offsetExists($offset)
+ {
+ return isset($this->data[$offset]);
+ }
+
+ public function offsetGet($offset)
+ {
+ return isset($this->data[$offset]) ? $this->data[$offset] : null;
+ }
+
+ public function offsetSet($offset, $value)
+ {
+ $this->data[$offset] = $value;
+ }
+
+ public function offsetUnset($offset)
+ {
+ unset($this->data[$offset]);
+ }
+}
diff --git a/phpBB/includes/event/dispatcher.php b/phpBB/includes/event/dispatcher.php
new file mode 100644
index 0000000000..2bf46b9b06
--- /dev/null
+++ b/phpBB/includes/event/dispatcher.php
@@ -0,0 +1,42 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+/**
+* Extension of the Symfony2 EventDispatcher
+*
+* It provides an additional `trigger_event` method, which
+* gives some syntactic sugar for dispatching events. Instead
+* of creating the event object, the method will do that for
+* you.
+*
+* Example:
+*
+* $vars = array('page_title');
+* extract($phpbb_dispatcher->trigger_event('core.index', compact($vars)));
+*
+*/
+class phpbb_event_dispatcher extends EventDispatcher
+{
+ public function trigger_event($eventName, $data = array())
+ {
+ $event = new phpbb_event_data($data);
+ $this->dispatch($eventName, $event);
+ return $event->get_data_filtered(array_keys($data));
+ }
+}
diff --git a/phpBB/includes/event/extension_subscriber_loader.php b/phpBB/includes/event/extension_subscriber_loader.php
new file mode 100644
index 0000000000..d933b943d7
--- /dev/null
+++ b/phpBB/includes/event/extension_subscriber_loader.php
@@ -0,0 +1,46 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+class phpbb_event_extension_subscriber_loader
+{
+ private $dispatcher;
+ private $extension_manager;
+
+ public function __construct(EventDispatcherInterface $dispatcher, phpbb_extension_manager $extension_manager)
+ {
+ $this->dispatcher = $dispatcher;
+ $this->extension_manager = $extension_manager;
+ }
+
+ public function load()
+ {
+ $finder = $this->extension_manager->get_finder();
+ $subscriber_classes = $finder
+ ->extension_directory('/event')
+ ->suffix('listener')
+ ->core_path('event/')
+ ->get_classes();
+
+ foreach ($subscriber_classes as $class)
+ {
+ $subscriber = new $class();
+ $this->dispatcher->addSubscriber($subscriber);
+ }
+ }
+}
diff --git a/phpBB/includes/extension/controller.php b/phpBB/includes/extension/controller.php
new file mode 100644
index 0000000000..c7fd439a19
--- /dev/null
+++ b/phpBB/includes/extension/controller.php
@@ -0,0 +1,77 @@
+<?php
+/**
+*
+* @package extension
+* @copyright (c) 2011 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* Abstract class extended by extension front controller classes
+*
+* @package extension
+*/
+abstract class phpbb_extension_controller implements phpbb_extension_controller_interface
+{
+ /**
+ * @var phpbb_request Request class object
+ */
+ protected $request;
+
+ /**
+ * @var dbal DBAL class object
+ */
+ protected $db;
+
+ /**
+ * @var user User class object
+ */
+ protected $user;
+
+ /**
+ * @var phpbb_template Template class object
+ */
+ protected $template;
+
+ /**
+ * @var array Config array
+ */
+ protected $config;
+
+ /**
+ * @var string PHP Extension
+ */
+ protected $phpEx;
+
+ /**
+ * @var string Relative path to board root
+ */
+ protected $phpbb_root_path;
+
+ /**
+ * Constructor method that provides the common phpBB objects as inherited class
+ * properties for automatic availability in extension controllers
+ */
+ public function __construct()
+ {
+ global $request, $db, $user, $template, $config;
+ global $phpEx, $phpbb_root_path;
+
+ $this->request = $request;
+ $this->db = $db;
+ $this->user = $user;
+ $this->template = $template;
+ $this->config = $config;
+ $this->phpEx = $phpEx;
+ $this->phpbb_root_path = $phpbb_root_path;
+ }
+}
diff --git a/phpBB/includes/extension/controller_interface.php b/phpBB/includes/extension/controller_interface.php
index bcc8972db4..2b88925388 100644
--- a/phpBB/includes/extension/controller_interface.php
+++ b/phpBB/includes/extension/controller_interface.php
@@ -23,7 +23,7 @@ if (!defined('IN_PHPBB'))
interface phpbb_extension_controller_interface
{
/**
- * handle the request to display a page from an extension
+ * Handle the request to display a page from an extension
*
* @return null
*/
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index bd6272792b..99740b753b 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -2448,15 +2448,25 @@ function build_url($strip_vars = false)
*/
function meta_refresh($time, $url, $disable_cd_check = false)
{
- global $template;
+ global $template, $refresh_data, $request;
- $url = redirect($url, true, $disable_cd_check);
- $url = str_replace('&', '&amp;', $url);
+ if ($request->is_ajax())
+ {
+ $refresh_data = array(
+ 'time' => $time,
+ 'url' => str_replace('&amp;', '&', $url)
+ );
+ }
+ else
+ {
+ $url = redirect($url, true, $disable_cd_check);
+ $url = str_replace('&', '&amp;', $url);
- // For XHTML compatibility we change back & to &amp;
- $template->assign_vars(array(
- 'META' => '<meta http-equiv="refresh" content="' . $time . ';url=' . $url . '" />')
- );
+ // For XHTML compatibility we change back & to &amp;
+ $template->assign_vars(array(
+ 'META' => '<meta http-equiv="refresh" content="' . $time . ';url=' . $url . '" />')
+ );
+ }
return $url;
}
@@ -2619,7 +2629,7 @@ function check_form_key($form_name, $timespan = false, $return_page = '', $trigg
*/
function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_body.html', $u_action = '')
{
- global $user, $template, $db;
+ global $user, $template, $db, $request;
global $phpEx, $phpbb_root_path, $request;
if (isset($_POST['cancel']))
@@ -2699,6 +2709,21 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
WHERE user_id = " . $user->data['user_id'];
$db->sql_query($sql);
+
+ if ($request->is_ajax())
+ {
+ $u_action .= '&confirm_uid=' . $user->data['user_id'] . '&sess=' . $user->session_id . '&sid=' . $user->session_id;
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => (!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title],
+ 'MESSAGE_TEXT' => (!isset($user->lang[$title . '_CONFIRM'])) ? $title : $user->lang[$title . '_CONFIRM'],
+
+ 'YES_VALUE' => $user->lang['YES'],
+ 'S_CONFIRM_ACTION' => str_replace('&amp;', '&', $u_action), //inefficient, rewrite whole function
+ 'S_HIDDEN_FIELDS' => $hidden . $s_hidden_fields
+ ));
+ }
+
if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin'])
{
adm_page_footer();
@@ -3723,7 +3748,7 @@ function phpbb_checkdnsrr($host, $type = 'MX')
*/
function msg_handler($errno, $msg_text, $errfile, $errline)
{
- global $cache, $db, $auth, $template, $config, $user;
+ global $cache, $db, $auth, $template, $config, $user, $request;
global $phpEx, $phpbb_root_path, $msg_title, $msg_long_text;
// Do not display notices if we suppress them via @
@@ -3922,6 +3947,20 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
'S_USER_NOTICE' => ($errno == E_USER_NOTICE) ? true : false)
);
+ if ($request->is_ajax())
+ {
+ global $refresh_data;
+
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $msg_title,
+ 'MESSAGE_TEXT' => $msg_text,
+ 'S_USER_WARNING' => ($errno == E_USER_WARNING) ? true : false,
+ 'S_USER_NOTICE' => ($errno == E_USER_NOTICE) ? true : false,
+ 'REFRESH_DATA' => (!empty($refresh_data)) ? $refresh_data : null
+ ));
+ }
+
// We do not want the cron script to be called on error messages
define('IN_CRON', true);
@@ -4478,6 +4517,7 @@ function phpbb_http_login($param)
function page_header($page_title = '', $display_online_list = true, $item_id = 0, $item = 'forum')
{
global $db, $config, $template, $SID, $_SID, $_EXTRA_URL, $user, $auth, $phpEx, $phpbb_root_path;
+ global $phpbb_dispatcher;
if (defined('HEADER_INC'))
{
@@ -4761,6 +4801,9 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
'A_COOKIE_SETTINGS' => addslashes('; path=' . $config['cookie_path'] . ((!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain']) . ((!$config['cookie_secure']) ? '' : '; secure')),
));
+ $vars = array('page_title', 'display_online_list', 'item_id', 'item');
+ extract($phpbb_dispatcher->trigger_event('core.page_header', compact($vars)));
+
// application/xhtml+xml not used because of IE
header('Content-type: text/html; charset=UTF-8');
diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php
index 3a0124934e..f2faf20f43 100644
--- a/phpBB/includes/functions_content.php
+++ b/phpBB/includes/functions_content.php
@@ -1103,8 +1103,8 @@ function extension_allowed($forum_id, $extension, &$extensions)
* @param string $string The text to truncate to the given length. String is specialchared.
* @param int $max_length Maximum length of string (multibyte character count as 1 char / Html entity count as 1 char)
* @param int $max_store_length Maximum character length of string (multibyte character count as 1 char / Html entity count as entity chars).
-* @param bool $allow_reply Allow Re: in front of string
-* NOTE: This parameter can cause undesired behavior (returning strings longer than $max_store_length) and is deprecated.
+* @param bool $allow_reply Allow Re: in front of string
+* NOTE: This parameter can cause undesired behavior (returning strings longer than $max_store_length) and is deprecated.
* @param string $append String to be appended
*/
function truncate_string($string, $max_length = 60, $max_store_length = 255, $allow_reply = false, $append = '')
@@ -1259,6 +1259,22 @@ function get_username_string($mode, $user_id, $username, $username_colour = '',
}
/**
+ * Add an option to the quick-mod tools.
+ *
+ * @param string $option The language key for the value of the option.
+ * @param string $lang_string The language string to use.
+ */
+function phpbb_add_quickmod_option($option, $lang_string)
+{
+ global $template, $user;
+ $lang_string = $user->lang($lang_string);
+ $template->assign_block_vars('quickmod', array(
+ 'VALUE' => $option,
+ 'TITLE' => $lang_string,
+ ));
+}
+
+/**
* @package phpBB3
*/
class bitfield
diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php
index 9335cabc15..18db64cc68 100644
--- a/phpBB/includes/functions_display.php
+++ b/phpBB/includes/functions_display.php
@@ -273,6 +273,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
markread('topics', $forum_ids);
$message = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect . '">', '</a>');
meta_refresh(3, $redirect);
+
trigger_error($user->lang['FORUMS_MARKED'] . '<br /><br />' . $message);
}
else
diff --git a/phpBB/includes/json_response.php b/phpBB/includes/json_response.php
new file mode 100644
index 0000000000..5dd904da09
--- /dev/null
+++ b/phpBB/includes/json_response.php
@@ -0,0 +1,41 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2011 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* JSON class
+* @package phpBB3
+*/
+class phpbb_json_response
+{
+ /**
+ * Send the data to the client and exit the script.
+ *
+ * @param array $data Any additional data to send.
+ * @param bool $exit Will exit the script if true.
+ */
+ public function send($data, $exit = true)
+ {
+ header('Content-Type: application/json');
+ echo json_encode($data);
+
+ if ($exit)
+ {
+ garbage_collection();
+ exit_handler();
+ }
+ }
+}
diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php
index ef32b5f03c..59fa8b7263 100644
--- a/phpBB/includes/mcp/mcp_queue.php
+++ b/phpBB/includes/mcp/mcp_queue.php
@@ -451,6 +451,7 @@ function approve_post($post_id_list, $id, $mode)
{
global $db, $template, $user, $config;
global $phpEx, $phpbb_root_path;
+ global $request;
if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
{
@@ -709,7 +710,20 @@ function approve_post($post_id_list, $id, $mode)
$add_message = '<br /><br />' . sprintf($user->lang['RETURN_POST'], '<a href="' . $post_url . '">', '</a>');
}
- trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], "<a href=\"$redirect\">", '</a>') . $add_message);
+ $message = $user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], "<a href=\"$redirect\">", '</a>') . $add_message;
+
+ if ($request->is_ajax())
+ {
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $message,
+ 'REFRESH_DATA' => null,
+ 'approved' => true
+ ));
+ }
+
+ trigger_error($message);
}
}
@@ -968,7 +982,20 @@ function disapprove_post($post_id_list, $id, $mode)
}
else
{
+ $message = $user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], "<a href=\"$redirect\">", '</a>');
+
+ if ($request->is_ajax())
+ {
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $message,
+ 'REFRESH_DATA' => null,
+ 'approved' => false
+ ));
+ }
+
meta_refresh(3, $redirect);
- trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], "<a href=\"$redirect\">", '</a>'));
+ trigger_error($message);
}
}
diff --git a/phpBB/includes/startup.php b/phpBB/includes/startup.php
index fc45cd882b..f75d70e366 100644
--- a/phpBB/includes/startup.php
+++ b/phpBB/includes/startup.php
@@ -147,5 +147,36 @@ if (function_exists('date_default_timezone_set') && function_exists('date_defaul
date_default_timezone_set(@date_default_timezone_get());
}
+// Autoloading of dependencies.
+// Three options are supported:
+// 1. If dependencies are installed with Composer, Composer will create a
+// vendor/.composer/autoload.php. If this file exists it will be
+// automatically used by phpBB. This is the default mode that phpBB
+// will use when shipped.
+// 2. To disable composer autoloading, PHPBB_NO_COMPOSER_AUTOLOAD can be specified.
+// Additionally specify PHPBB_AUTOLOAD=/path/to/autoload.php in the
+// environment. This is useful for running CLI scripts and tests.
+// /path/to/autoload.php should define and register class loaders
+// for all of phpBB's dependencies.
+// 3. You can also set PHPBB_NO_COMPOSER_AUTOLOAD without setting PHPBB_AUTOLOAD.
+// In this case autoloading needs to be defined before running any phpBB
+// script. This might be useful in cases when phpBB is integrated into a
+// larger program.
+if (getenv('PHPBB_NO_COMPOSER_AUTOLOAD'))
+{
+ if (getenv('PHPBB_AUTOLOAD'))
+ {
+ require(getenv('PHPBB_AUTOLOAD'));
+ }
+}
+else
+{
+ if (!file_exists($phpbb_root_path . 'vendor/.composer/autoload.php'))
+ {
+ trigger_error('You have not set up composer dependencies. See http://getcomposer.org/.', E_USER_ERROR);
+ }
+ require($phpbb_root_path . 'vendor/.composer/autoload.php');
+}
+
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
diff --git a/phpBB/includes/ucp/ucp_zebra.php b/phpBB/includes/ucp/ucp_zebra.php
index 004f3b80aa..efe928b387 100644
--- a/phpBB/includes/ucp/ucp_zebra.php
+++ b/phpBB/includes/ucp/ucp_zebra.php
@@ -25,7 +25,7 @@ class ucp_zebra
function main($id, $mode)
{
- global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
+ global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx, $request;
$submit = (isset($_POST['submit']) || isset($_GET['add']) || isset($_GET['remove'])) ? true : false;
$s_hidden_fields = '';
@@ -198,8 +198,24 @@ class ucp_zebra
}
}
}
-
- if ($updated)
+
+ if ($request->is_ajax())
+ {
+ $message = ($updated) ? $user->lang[$l_mode . '_UPDATED'] : implode('<br />', $error);
+
+ $json_response = new phpbb_json_response;
+ $json_response->send(array(
+ 'success' => $updated,
+
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $message,
+ 'REFRESH_DATA' => array(
+ 'time' => 3,
+ 'url' => $this->u_action
+ )
+ ));
+ }
+ else if ($updated)
{
meta_refresh(3, $this->u_action);
$message = $user->lang[$l_mode . '_UPDATED'] . '<br />' . implode('<br />', $error) . ((sizeof($error)) ? '<br />' : '') . '<br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
diff --git a/phpBB/index.php b/phpBB/index.php
index d71878a885..9a57105d57 100644
--- a/phpBB/index.php
+++ b/phpBB/index.php
@@ -17,12 +17,11 @@ define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
-include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
// Start session management
$user->session_begin();
$auth->acl($user->data);
-$user->setup('viewforum');
+$user->setup();
// Handle the display of extension front pages
if ($ext = $request->variable('ext', ''))
@@ -57,6 +56,10 @@ if ($ext = $request->variable('ext', ''))
exit_handler();
}
+include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+
+$user->add_lang('viewforum');
+
display_forums('', $config['load_moderators']);
$order_legend = ($config['legend_sort_groupname']) ? 'group_name' : 'group_legend';
diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php
index 3e56112713..18ca4870fb 100644
--- a/phpBB/install/database_update.php
+++ b/phpBB/install/database_update.php
@@ -120,6 +120,7 @@ $cache = $cache_factory->get_service();
$phpbb_class_loader_ext->set_cache($cache->get_driver());
$phpbb_class_loader->set_cache($cache->get_driver());
+$phpbb_dispatcher = new phpbb_event_dispatcher();
$request = new phpbb_request();
$user = new user();
$db = new $sql_db();
diff --git a/phpBB/install/index.php b/phpBB/install/index.php
index f3664c177c..49f7847489 100644
--- a/phpBB/install/index.php
+++ b/phpBB/install/index.php
@@ -92,6 +92,7 @@ $cache = $cache_factory->get_service();
$phpbb_class_loader_ext->set_cache($cache->get_driver());
$phpbb_class_loader->set_cache($cache->get_driver());
+$phpbb_dispatcher = new phpbb_event_dispatcher();
$request = new phpbb_request();
// make sure request_var uses this request instance
diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php
index 254cd473a5..6012c59483 100644
--- a/phpBB/language/en/acp/common.php
+++ b/phpBB/language/en/acp/common.php
@@ -95,10 +95,10 @@ $lang = array_merge($lang, array(
'ACP_GLOBAL_MODERATORS' => 'Global moderators',
'ACP_GLOBAL_PERMISSIONS' => 'Global permissions',
'ACP_GROUPS' => 'Groups',
- 'ACP_GROUPS_FORUM_PERMISSIONS' => 'Groups’ forum permissions',
+ 'ACP_GROUPS_FORUM_PERMISSIONS' => 'Group forum permissions',
'ACP_GROUPS_MANAGE' => 'Manage groups',
'ACP_GROUPS_MANAGEMENT' => 'Group management',
- 'ACP_GROUPS_PERMISSIONS' => 'Groups’ permissions',
+ 'ACP_GROUPS_PERMISSIONS' => 'Group permissions',
'ACP_GROUPS_POSITION' => 'Manage group positions',
'ACP_ICONS' => 'Topic icons',
@@ -177,9 +177,9 @@ $lang = array_merge($lang, array(
'ACP_THEMES' => 'Themes',
'ACP_UPDATE' => 'Updating',
- 'ACP_USERS_FORUM_PERMISSIONS' => 'Users’ forum permissions',
+ 'ACP_USERS_FORUM_PERMISSIONS' => 'User forum permissions',
'ACP_USERS_LOGS' => 'User logs',
- 'ACP_USERS_PERMISSIONS' => 'Users’ permissions',
+ 'ACP_USERS_PERMISSIONS' => 'User permissions',
'ACP_USER_ATTACH' => 'Attachments',
'ACP_USER_AVATAR' => 'Avatar',
'ACP_USER_FEEDBACK' => 'Feedback',
@@ -370,25 +370,32 @@ $lang = array_merge($lang, array(
'PURGE_CACHE' => 'Purge the cache',
'PURGE_CACHE_CONFIRM' => 'Are you sure you wish to purge the cache?',
'PURGE_CACHE_EXPLAIN' => 'Purge all cache related items, this includes any cached template files or queries.',
+ 'PURGE_CACHE_SUCCESS' => 'Cache successfully purged.',
'PURGE_SESSIONS' => 'Purge all sessions',
'PURGE_SESSIONS_CONFIRM' => 'Are you sure you wish to purge all sessions? This will log out all users.',
'PURGE_SESSIONS_EXPLAIN' => 'Purge all sessions. This will log out all users by truncating the session table.',
+ 'PURGE_SESSIONS_SUCCESS' => 'Sessions successfully purged.',
'RESET_DATE' => 'Reset board’s start date',
'RESET_DATE_CONFIRM' => 'Are you sure you wish to reset the board’s start date?',
+ 'RESET_DATE_SUCCESS' => 'Board’s start date reset',
'RESET_ONLINE' => 'Reset most users ever online',
'RESET_ONLINE_CONFIRM' => 'Are you sure you wish to reset the most users ever online counter?',
+ 'RESET_ONLINE_SUCCESS' => 'Most users ever online reset',
'RESYNC_FILES_STATS_CONFIRM' => 'Are you sure you wish to resynchronise files statistics?',
'RESYNC_POSTCOUNTS' => 'Resynchronise post counts',
'RESYNC_POSTCOUNTS_EXPLAIN' => 'Only existing posts will be taken into consideration. Pruned posts will not be counted.',
'RESYNC_POSTCOUNTS_CONFIRM' => 'Are you sure you wish to resynchronise post counts?',
+ 'RESYNC_POSTCOUNTS_SUCCESS' => 'Resynchronised post counts',
'RESYNC_POST_MARKING' => 'Resynchronise dotted topics',
'RESYNC_POST_MARKING_CONFIRM' => 'Are you sure you wish to resynchronise dotted topics?',
'RESYNC_POST_MARKING_EXPLAIN' => 'First unmarks all topics and then correctly marks topics that have seen any activity during the past six months.',
+ 'RESYNC_POST_MARKING_SUCCESS' => 'Resynchronised dotted topics',
'RESYNC_STATS' => 'Resynchronise statistics',
'RESYNC_STATS_CONFIRM' => 'Are you sure you wish to resynchronise statistics?',
'RESYNC_STATS_EXPLAIN' => 'Recalculates the total number of posts, topics, users and files.',
+ 'RESYNC_STATS_SUCCESS' => 'Resynchronised statistics',
'RUN' => 'Run now',
'STATISTIC' => 'Statistic',
diff --git a/phpBB/language/en/acp/permissions.php b/phpBB/language/en/acp/permissions.php
index 7f7ecacfcf..2a8d857197 100644
--- a/phpBB/language/en/acp/permissions.php
+++ b/phpBB/language/en/acp/permissions.php
@@ -39,10 +39,10 @@ $lang = array_merge($lang, array(
<p>Permissions are highly granular and grouped into four major sections, which are:</p>
<h2>Global Permissions</h2>
- <p>These are used to control access on a global level and apply to the entire bulletin board. They are further divided into Users’ Permissions, Groups’ Permissions, Administrators and Global Moderators.</p>
+ <p>These are used to control access on a global level and apply to the entire bulletin board. They are further divided into User Permissions, Group Permissions, Administrators and Global Moderators.</p>
<h2>Forum Based Permissions</h2>
- <p>These are used to control access on a per forum basis. They are further divided into Forum Permissions, Forum Moderators, Users’ Forum Permissions and Groups’ Forum Permissions.</p>
+ <p>These are used to control access on a per forum basis. They are further divided into Forum Permissions, Forum Moderators, User Forum Permissions and Group Forum Permissions.</p>
<h2>Permission Roles</h2>
<p>These are used to create different sets of permissions for the different permission types later being able to be assigned on a role-based basis. The default roles should cover the administration of bulletin boards large and small, though within each of the four divisions, you can add/edit/delete roles as you see fit.</p>
@@ -82,13 +82,13 @@ $lang = array_merge($lang, array(
'ACP_FORUM_PERMISSIONS_COPY_EXPLAIN' => 'Here you can copy forum permissions from one forum to one or more other forums.',
'ACP_GLOBAL_MODERATORS_EXPLAIN' => 'Here you can assign global moderator permissions to users or groups. These moderators are like ordinary moderators except they have access to every forum on your board.',
'ACP_GROUPS_FORUM_PERMISSIONS_EXPLAIN' => 'Here you can assign forum permissions to groups.',
- 'ACP_GROUPS_PERMISSIONS_EXPLAIN' => 'Here you can assign global permissions to groups - user permissions, global moderator permissions and administrator permissions. User permissions include capabilities such as the use of avatars, sending private messages, et cetera; global moderator permissions such as approving posts, manage topics, manage bans, et cetera and lastly administrator permissions such as altering permissions, define custom BBCodes, manage forums, et cetera. Individual users permissions should only be changed in rare occasions, the preferred method is putting users in groups and assigning the group’s permissions.',
+ 'ACP_GROUPS_PERMISSIONS_EXPLAIN' => 'Here you can assign global permissions to groups - user permissions, global moderator permissions and administrator permissions. User permissions include capabilities such as the use of avatars, sending private messages, et cetera; global moderator permissions such as approving posts, manage topics, manage bans, et cetera and lastly administrator permissions such as altering permissions, define custom BBCodes, manage forums, et cetera. Individual user permissions should only be changed in rare occasions, the preferred method is putting users in groups and assigning the group permissions.',
'ACP_ADMIN_ROLES_EXPLAIN' => 'Here you are able to manage the roles for administrative permissions. Roles are effective permissions, if you change a role the items having this role assigned will change its permissions too.',
'ACP_FORUM_ROLES_EXPLAIN' => 'Here you are able to manage the roles for forum permissions. Roles are effective permissions, if you change a role the items having this role assigned will change its permissions too.',
'ACP_MOD_ROLES_EXPLAIN' => 'Here you are able to manage the roles for moderative permissions. Roles are effective permissions, if you change a role the items having this role assigned will change its permissions too.',
'ACP_USER_ROLES_EXPLAIN' => 'Here you are able to manage the roles for user permissions. Roles are effective permissions, if you change a role the items having this role assigned will change its permissions too.',
'ACP_USERS_FORUM_PERMISSIONS_EXPLAIN' => 'Here you can assign forum permissions to users.',
- 'ACP_USERS_PERMISSIONS_EXPLAIN' => 'Here you can assign global permissions to users - user permissions, global moderator permissions and administrator permissions. User permissions include capabilities such as the use of avatars, sending private messages, et cetera; global moderator permissions such as approving posts, manage topics, manage bans, et cetera and lastly administrator permissions such as altering permissions, define custom BBCodes, manage forums, et cetera. To alter these settings for large numbers of users the Group permissions system is the preferred method. User’s permissions should only be changed in rare occasions, the preferred method is putting users in groups and assigning the group’s permissions.',
+ 'ACP_USERS_PERMISSIONS_EXPLAIN' => 'Here you can assign global permissions to users - user permissions, global moderator permissions and administrator permissions. User permissions include capabilities such as the use of avatars, sending private messages, et cetera; global moderator permissions such as approving posts, manage topics, manage bans, et cetera and lastly administrator permissions such as altering permissions, define custom BBCodes, manage forums, et cetera. To alter these settings for large numbers of users the Group permissions system is the preferred method. User permissions should only be changed in rare occasions, the preferred method is putting users in groups and assigning the group permissions.',
'ACP_VIEW_ADMIN_PERMISSIONS_EXPLAIN' => 'Here you can view the effective administrative permissions assigned to the selected users/groups.',
'ACP_VIEW_GLOBAL_MOD_PERMISSIONS_EXPLAIN' => 'Here you can view the global moderative permissions assigned to the selected users/groups.',
'ACP_VIEW_FORUM_PERMISSIONS_EXPLAIN' => 'Here you can view the forum permissions assigned to the selected users/groups and forums.',
@@ -224,8 +224,8 @@ $lang = array_merge($lang, array(
'SELECT_TYPE' => 'Select type',
'SET_PERMISSIONS' => 'Set permissions',
'SET_ROLE_PERMISSIONS' => 'Set role permissions',
- 'SET_USERS_PERMISSIONS' => 'Set users permissions',
- 'SET_USERS_FORUM_PERMISSIONS' => 'Set users forum permissions',
+ 'SET_USERS_PERMISSIONS' => 'Set user permissions',
+ 'SET_USERS_FORUM_PERMISSIONS' => 'Set user forum permissions',
'TRACE_DEFAULT' => 'By default every permission is <samp>NO</samp> (unset). So the permission can be overwritten by other settings.',
'TRACE_FOR' => 'Trace for',
diff --git a/phpBB/language/en/acp/posting.php b/phpBB/language/en/acp/posting.php
index 84cf640d1f..76d4869990 100644
--- a/phpBB/language/en/acp/posting.php
+++ b/phpBB/language/en/acp/posting.php
@@ -45,6 +45,7 @@ $lang = array_merge($lang, array(
'BBCODE_ADDED' => 'BBCode added successfully.',
'BBCODE_EDITED' => 'BBCode edited successfully.',
+ 'BBCODE_DELETED' => 'The BBCode has been removed successfully.',
'BBCODE_NOT_EXIST' => 'The BBCode you selected does not exist.',
'BBCODE_HELPLINE' => 'Help line',
'BBCODE_HELPLINE_EXPLAIN' => 'This field contains the mouse over text of the BBCode.',
diff --git a/phpBB/language/en/acp/styles.php b/phpBB/language/en/acp/styles.php
index 8a4a8e7308..1a6335cdbf 100644
--- a/phpBB/language/en/acp/styles.php
+++ b/phpBB/language/en/acp/styles.php
@@ -283,9 +283,11 @@ $lang = array_merge($lang, array(
'SELECTED_THEME_FILE' => 'Selected theme file',
'STORE_FILESYSTEM' => 'Filesystem',
'STYLE_ACTIVATE' => 'Activate',
+ 'STYLE_ACTIVATED' => 'Style activated successfully',
'STYLE_ACTIVE' => 'Active',
'STYLE_ADDED' => 'Style added successfully.',
'STYLE_DEACTIVATE' => 'Deactivate',
+ 'STYLE_DEACTIVATED' => 'Style deactivated successfully',
'STYLE_DEFAULT' => 'Make default style',
'STYLE_DEFAULT_CHANGE' => 'Change default style',
'STYLE_DEFAULT_CHANGE_INACTIVE' => 'You must activate style before making it default style.',
diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php
index 94edddc6f5..b92b915623 100644
--- a/phpBB/language/en/common.php
+++ b/phpBB/language/en/common.php
@@ -67,6 +67,8 @@ $lang = array_merge($lang, array(
'ADMINISTRATORS' => 'Administrators',
'AGE' => 'Age',
'AIM' => 'AIM',
+ 'AJAX_ERROR_TITLE' => 'AJAX error',
+ 'AJAX_ERROR_TEXT' => 'Something went wrong when processing your request.',
'ALLOWED' => 'Allowed',
'ALL_FILES' => 'All files',
'ALL_FORUMS' => 'All forums',
@@ -183,6 +185,7 @@ $lang = array_merge($lang, array(
'ERR_UNWATCHING' => 'An error occured while trying to unsubscribe.',
'ERR_WATCHING' => 'An error occured while trying to subscribe.',
'ERR_WRONG_PATH_TO_PHPBB' => 'The phpBB path specified appears to be invalid.',
+ 'ERROR' => 'Error',
'EXPAND_VIEW' => 'Expand view',
'EXTENSION' => 'Extension',
'EXTENSION_CONTROLLER_MISSING' => 'The extension <strong>%s</strong> is missing a controller class and cannot be accessed through the front-end.',
@@ -314,6 +317,7 @@ $lang = array_merge($lang, array(
'LDAP_NO_SERVER_CONNECTION' => 'Could not connect to LDAP server.',
'LDAP_SEARCH_FAILED' => 'An error occured while searching the LDAP directory.',
'LEGEND' => 'Legend',
+ 'LOADING' => 'Loading',
'LOCATION' => 'Location',
'LOCK_POST' => 'Lock post',
'LOCK_POST_EXPLAIN' => 'Prevent editing',
@@ -451,6 +455,7 @@ $lang = array_merge($lang, array(
2 => '%d pixels',
),
'PLAY_QUICKTIME_FILE' => 'Play Quicktime file',
+ 'PLEASE_WAIT' => 'Please wait.',
'PM' => 'PM',
'PM_REPORTED' => 'Click to view report',
'POSTING_MESSAGE' => 'Posting message in %s',
@@ -476,7 +481,7 @@ $lang = array_merge($lang, array(
'POST_SUBJECT' => 'Post subject',
'POST_TIME' => 'Post time',
'POST_TOPIC' => 'Post a new topic',
- 'POST_UNAPPROVED' => 'This post is waiting for approval',
+ 'POST_UNAPPROVED' => 'Post awaiting approval:',
'PREVIEW' => 'Preview',
'PREVIOUS' => 'Previous', // Used in pagination
'PREVIOUS_STEP' => 'Previous',
@@ -597,6 +602,7 @@ $lang = array_merge($lang, array(
'TEST_CONNECTION' => 'Test connection',
'THE_TEAM' => 'The team',
'TIME' => 'Time',
+ 'TIMEOUT_PROCESSING_REQ' => 'Request timed out.',
'TOO_LARGE' => 'The value you entered is too large.',
'TOO_LARGE_MAX_RECIPIENTS' => 'The value of <strong>Maximum number of allowed recipients per private message</strong> setting you entered is too large.',
diff --git a/phpBB/language/en/viewtopic.php b/phpBB/language/en/viewtopic.php
index 2b20938afe..1460490672 100644
--- a/phpBB/language/en/viewtopic.php
+++ b/phpBB/language/en/viewtopic.php
@@ -35,6 +35,7 @@ if (empty($lang) || !is_array($lang))
// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
$lang = array_merge($lang, array(
+ 'APPROVE' => 'Approve',
'ATTACHMENT' => 'Attachment',
'ATTACHMENT_FUNCTIONALITY_DISABLED' => 'The attachments feature has been disabled.',
@@ -47,9 +48,9 @@ $lang = array_merge($lang, array(
'BUMP_TOPIC' => 'Bump topic',
'CODE' => 'Code',
- 'COLLAPSE_QR' => 'Hide Quick Reply',
'DELETE_TOPIC' => 'Delete topic',
+ 'DISAPPROVE' => 'Disapprove',
'DOWNLOAD_NOTICE' => 'You do not have the required permissions to view the files attached to this post.',
'EDITED_TIMES_TOTAL' => array(
@@ -97,7 +98,6 @@ $lang = array_merge($lang, array(
'REPLY_TO_TOPIC' => 'Reply to topic',
'RETURN_POST' => '%sReturn to the post%s',
- 'SHOW_QR' => 'Quick Reply',
'SUBMIT_VOTE' => 'Submit vote',
'TOTAL_VOTES' => 'Total votes',
diff --git a/phpBB/styles/prosilver/template/ajax.js b/phpBB/styles/prosilver/template/ajax.js
new file mode 100644
index 0000000000..cc886c42b1
--- /dev/null
+++ b/phpBB/styles/prosilver/template/ajax.js
@@ -0,0 +1,100 @@
+(function($) { // Avoid conflicts with other libraries
+
+"use strict";
+
+// This callback finds the post from the delete link, and removes it.
+phpbb.add_ajax_callback('post_delete', function() {
+ var el = $(this),
+ post_id;
+
+ if (el.attr('data-refresh') === undefined)
+ {
+ post_id = el[0].href.split('&p=')[1];
+ var post = el.parents('#p' + post_id).css('pointer-events', 'none');
+ if (post.hasClass('bg1') || post.hasClass('bg2'))
+ {
+ var posts1 = post.nextAll('.bg1');
+ post.nextAll('.bg2').removeClass('bg2').addClass('bg1');
+ posts1.removeClass('bg1').addClass('bg2');
+ }
+ post.fadeOut(function() {
+ $(this).remove();
+ });
+ }
+});
+
+// This callback removes the approve / disapprove div or link.
+phpbb.add_ajax_callback('post_approve', function(res) {
+ var remove = (res.approved) ? $(this) : $(this).parents('.post');
+ $(remove).css('pointer-events', 'none').fadeOut(function() {
+ $(this).remove();
+ });
+});
+
+// This removes the parent row of the link or form that fired the callback.
+phpbb.add_ajax_callback('row_delete', function() {
+ $(this).parents('tr').remove();
+});
+
+// This handles friend / foe additions removals.
+phpbb.add_ajax_callback('zebra', function(res) {
+ var zebra;
+
+ if (res.success) {
+ zebra = $('.zebra');
+ zebra.first().html(res.MESSAGE_TEXT);
+ zebra.not(':first').html('&nbsp;').prev().html('&nbsp;');
+ }
+});
+
+
+
+$('[data-ajax]').each(function() {
+ var $this = $(this),
+ ajax = $this.attr('data-ajax'),
+ fn;
+
+ if (ajax !== 'false')
+ {
+ fn = (ajax !== 'true') ? ajax : null;
+ phpbb.ajaxify({
+ selector: this,
+ refresh: $this.attr('data-refresh') !== undefined,
+ callback: fn
+ });
+ }
+});
+
+
+
+/**
+ * This AJAXifies the quick-mod tools. The reason it cannot be a standard
+ * callback / data attribute is that it requires filtering - some of the options
+ * can be ajaxified, while others cannot.
+ */
+phpbb.ajaxify({
+ selector: '#quickmodform',
+ refresh: true,
+ filter: function (data) {
+ var action = $('#quick-mod-select').val();
+
+ if (action === 'make_normal')
+ {
+ return $(this).find('select option[value="make_global"]').length > 0;
+ }
+ else if (action === 'lock' || action === 'unlock')
+ {
+ return true;
+ }
+
+ if (action === 'delete_topic' || action === 'make_sticky' || action === 'make_announce' || action === 'make_global') {
+ return true;
+ }
+
+ return false;
+ }
+});
+
+
+
+})(jQuery); // Avoid conflicts with other libraries
diff --git a/phpBB/styles/prosilver/template/index_body.html b/phpBB/styles/prosilver/template/index_body.html
index b183cf4372..9269f62769 100644
--- a/phpBB/styles/prosilver/template/index_body.html
+++ b/phpBB/styles/prosilver/template/index_body.html
@@ -8,7 +8,7 @@
<!-- IF S_DISPLAY_SEARCH -->
<li><a href="{U_SEARCH_UNANSWERED}">{L_SEARCH_UNANSWERED}</a><!-- IF S_LOAD_UNREADS --> &bull; <a href="{U_SEARCH_UNREAD}">{L_SEARCH_UNREAD}</a><!-- ENDIF --><!-- IF S_USER_LOGGED_IN --> &bull; <a href="{U_SEARCH_NEW}">{L_SEARCH_NEW}</a><!-- ENDIF --> &bull; <a href="{U_SEARCH_ACTIVE_TOPICS}">{L_SEARCH_ACTIVE_TOPICS}</a></li>
<!-- ENDIF -->
- <!-- IF not S_IS_BOT and U_MARK_FORUMS --><li class="rightside"><a href="{U_MARK_FORUMS}" accesskey="m">{L_MARK_FORUMS_READ}</a></li><!-- ENDIF -->
+ <!-- IF not S_IS_BOT and U_MARK_FORUMS --><li class="rightside"><a href="{U_MARK_FORUMS}" accesskey="m" data-ajax="true">{L_MARK_FORUMS_READ}</a></li><!-- ENDIF -->
</ul>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/memberlist_view.html b/phpBB/styles/prosilver/template/memberlist_view.html
index f10ec64975..d8bb92a731 100644
--- a/phpBB/styles/prosilver/template/memberlist_view.html
+++ b/phpBB/styles/prosilver/template/memberlist_view.html
@@ -35,15 +35,15 @@
<!-- BEGIN custom_fields --><dt>{custom_fields.PROFILE_FIELD_NAME}:</dt> <dd>{custom_fields.PROFILE_FIELD_VALUE}</dd><!-- END custom_fields -->
<!-- IF S_USER_LOGGED_IN and S_ZEBRA -->
<!-- IF U_REMOVE_FRIEND -->
- <dt>&nbsp;</dt> <dd><a href="{U_REMOVE_FRIEND}"><strong>{L_REMOVE_FRIEND}</strong></a></dd>
+ <dt>&nbsp;</dt> <dd class="zebra"><a href="{U_REMOVE_FRIEND}" data-ajax="zebra"><strong>{L_REMOVE_FRIEND}</strong></a></dd>
<!-- ELSEIF U_REMOVE_FOE -->
- <dt>&nbsp;</dt> <dd><a href="{U_REMOVE_FOE}"><strong>{L_REMOVE_FOE}</strong></a></dd>
+ <dt>&nbsp;</dt> <dd class="zebra"><a href="{U_REMOVE_FOE}" data-ajax="zebra"><strong>{L_REMOVE_FOE}</strong></a></dd>
<!-- ELSE -->
<!-- IF U_ADD_FRIEND -->
- <dt>&nbsp;</dt> <dd><a href="{U_ADD_FRIEND}"><strong>{L_ADD_FRIEND}</strong></a></dd>
+ <dt>&nbsp;</dt> <dd class="zebra"><a href="{U_ADD_FRIEND}" data-ajax="zebra"><strong>{L_ADD_FRIEND}</strong></a></dd>
<!-- ENDIF -->
<!-- IF U_ADD_FOE -->
- <dt>&nbsp;</dt> <dd><a href="{U_ADD_FOE}"><strong>{L_ADD_FOE}</strong></a></dd>
+ <dt>&nbsp;</dt> <dd class="zebra"><a href="{U_ADD_FOE}" data-ajax="zebra"><strong>{L_ADD_FOE}</strong></a></dd>
<!-- ENDIF -->
<!-- ENDIF -->
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html
index 4456d6b37d..1561bae26a 100644
--- a/phpBB/styles/prosilver/template/overall_footer.html
+++ b/phpBB/styles/prosilver/template/overall_footer.html
@@ -8,12 +8,12 @@
<ul class="linklist">
<li class="icon-home"><a href="{U_INDEX}" accesskey="h">{L_INDEX}</a></li>
<!-- IF not S_IS_BOT -->
- <!-- IF S_WATCH_FORUM_LINK --><li <!-- IF S_WATCHING_FORUM -->class="icon-unsubscribe"<!-- ELSE -->class="icon-subscribe"<!-- ENDIF -->><a href="{S_WATCH_FORUM_LINK}" title="{S_WATCH_FORUM_TITLE}">{S_WATCH_FORUM_TITLE}</a></li><!-- ENDIF -->
- <!-- IF U_WATCH_TOPIC --><li <!-- IF S_WATCHING_TOPIC -->class="icon-unsubscribe"<!-- ELSE -->class="icon-subscribe"<!-- ENDIF -->><a href="{U_WATCH_TOPIC}" title="{L_WATCH_TOPIC}">{L_WATCH_TOPIC}</a></li><!-- ENDIF -->
- <!-- IF U_BOOKMARK_TOPIC --><li class="icon-bookmark"><a href="{U_BOOKMARK_TOPIC}" title="{L_BOOKMARK_TOPIC}">{L_BOOKMARK_TOPIC}</a></li><!-- ENDIF -->
- <!-- IF U_BUMP_TOPIC --><li class="icon-bump"><a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}">{L_BUMP_TOPIC}</a></li><!-- ENDIF -->
+ <!-- IF S_WATCH_FORUM_LINK --><li <!-- IF S_WATCHING_FORUM -->class="icon-unsubscribe"<!-- ELSE -->class="icon-subscribe"<!-- ENDIF -->><a href="{S_WATCH_FORUM_LINK}" title="{S_WATCH_FORUM_TITLE}" data-ajax="alt_text" data-alt-text="<!-- IF S_WATCHING_FORUM -->{L_START_WATCHING_FORUM}<!-- ELSE -->{L_STOP_WATCHING_FORUM}<!-- ENDIF -->">{S_WATCH_FORUM_TITLE}</a></li><!-- ENDIF -->
+ <!-- IF U_WATCH_TOPIC --><li <!-- IF S_WATCHING_TOPIC -->class="icon-unsubscribe"<!-- ELSE -->class="icon-subscribe"<!-- ENDIF -->><a href="{U_WATCH_TOPIC}" title="{L_WATCH_TOPIC}" data-ajax="alt_text" data-alt-text="<!-- IF S_WATCHING_TOPIC -->{L_START_WATCHING_TOPIC}<!-- ELSE -->{L_STOP_WATCHING_TOPIC}<!-- ENDIF -->">{L_WATCH_TOPIC}</a></li><!-- ENDIF -->
+ <!-- IF U_BOOKMARK_TOPIC --><li class="icon-bookmark"><a href="{U_BOOKMARK_TOPIC}" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="<!-- IF S_BOOKMARKED_TOPIC -->{L_BOOKMARK_TOPIC_REAL}<!-- ELSE -->{L_BOOKMARK_TOPIC_REMOVE}<!-- ENDIF -->">{L_BOOKMARK_TOPIC}</a></li><!-- ENDIF -->
+ <!-- IF U_BUMP_TOPIC --><li class="icon-bump"><a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}" data-ajax="true">{L_BUMP_TOPIC}</a></li><!-- ENDIF -->
<!-- ENDIF -->
- <li class="rightside"><!-- IF U_TEAM --><a href="{U_TEAM}">{L_THE_TEAM}</a> &bull; <!-- ENDIF --><!-- IF not S_IS_BOT --><a href="{U_DELETE_COOKIES}">{L_DELETE_COOKIES}</a> &bull; <!-- ENDIF -->{S_TIMEZONE}</li>
+ <li class="rightside"><!-- IF U_TEAM --><a href="{U_TEAM}">{L_THE_TEAM}</a> &bull; <!-- ENDIF --><!-- IF not S_IS_BOT --><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true">{L_DELETE_COOKIES}</a> &bull; <!-- ENDIF -->{S_TIMEZONE}</li>
</ul>
<span class="corners-bottom"><span></span></span></div>
@@ -24,6 +24,22 @@
<!-- IF DEBUG_OUTPUT --><br />{DEBUG_OUTPUT}<!-- ENDIF -->
<!-- IF U_ACP --><br /><strong><a href="{U_ACP}">{L_ACP}</a></strong><!-- ENDIF -->
</div>
+
+ <div id="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}">
+ <div id="darken">&nbsp;</div>
+ <div class="jalert" id="loadingalert"><h3>{L_LOADING}</h3><p>{L_PLEASE_WAIT}</p></div>
+ </div>
+
+ <div id="phpbb_alert" class="phpbb_alert" data-l-err="{L_ERROR}" data-l-timeout-processing-req="{L_TIMEOUT_PROCESSING_REQ}">
+ <a href="#" class="alert_close"></a>
+ <h3 class="alert_title"></h3><p class="alert_text"></p>
+ </div>
+ <div id="phpbb_confirm" class="phpbb_alert">
+ <a href="#" class="alert_close"></a>
+ <p class="alert_text"></p>
+ <input type="button" class="button1" value="{L_YES}" />&nbsp;
+ <input type="button" class="button2" value="{L_NO}" />
+ </div>
</div>
</div>
@@ -35,6 +51,8 @@
<script type="text/javascript" src="{T_JQUERY_LINK}"></script>
<!-- IF S_JQUERY_FALLBACK --><script type="text/javascript">window.jQuery || document.write(unescape('%3Cscript src="{T_ASSETS_PATH}/javascript/jquery.js" type="text/javascript"%3E%3C/script%3E'));</script><!-- ENDIF -->
+<script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js"></script>
+<script type="text/javascript" src="{T_TEMPLATE_PATH}/ajax.js"></script>
</body>
</html>
diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html
index 364373f439..5e095d0a0d 100644
--- a/phpBB/styles/prosilver/template/overall_header.html
+++ b/phpBB/styles/prosilver/template/overall_header.html
@@ -84,6 +84,10 @@
<link href="{T_THEME_PATH}/bidi.css" rel="stylesheet" type="text/css" media="screen, projection" />
<!-- ENDIF -->
+<!--[if lte IE 8]>
+ <link href="{T_THEME_PATH}/tweaks.css" rel="stylesheet" type="text/css" media="screen, projection" />
+<![endif]-->
+
</head>
<body id="phpbb" class="section-{SCRIPT_NAME} {S_CONTENT_DIRECTION}">
diff --git a/phpBB/styles/prosilver/template/quickreply_editor.html b/phpBB/styles/prosilver/template/quickreply_editor.html
index ea07c2e6d8..4cd5eedd3e 100644
--- a/phpBB/styles/prosilver/template/quickreply_editor.html
+++ b/phpBB/styles/prosilver/template/quickreply_editor.html
@@ -1,51 +1,5 @@
-<script type="text/javascript">
-// <![CDATA[
- function hide_qr(show)
- {
- dE('qr_editor_div');
- dE('qr_showeditor_div');
- if (show && document.getElementById('qr_editor_div').style.display != 'none')
- {
- document.getElementsByName('message')[0].focus();
- }
- return true;
- }
-
-
- function init_qr()
- {
- dE('qr_showeditor_div');
- return true;
- }
- onload_functions.push('init_qr();');
- // ]]>
-</script>
-<noscript>
- <form method="post" action="{U_QR_ACTION}">
- <div class="panel" id="qr_ns_editor_div">
- <div class="inner"><span class="corners-top"><span></span></span>
- <h2>{L_QUICKREPLY}</h2>
- <fieldset class="fields1">
- <dl style="clear: left;">
- <dt><label for="subject">{L_SUBJECT}:</label></dt>
- <dd><input type="text" name="subject" id="subject-ns" size="45" maxlength="64" tabindex="2" value="{SUBJECT}" class="inputbox autowidth" /></dd>
- </dl>
- <div id="message-box-ns">
- <textarea style="height: 9em;" name="message" rows="7" cols="76" tabindex="3" class="inputbox"></textarea>
- </div>
- </fieldset>
- <fieldset class="submit-buttons">
- {S_FORM_TOKEN}
- {QR_HIDDEN_FIELDS}
- <input type="submit" accesskey="s" tabindex="6" name="post" value="{L_SUBMIT}" class="button1" />&nbsp;
- <input type="submit" accesskey="f" tabindex="7" name="full_editor" value="{L_FULL_EDITOR}" class="button2" />&nbsp;
- </fieldset>
- <span class="corners-bottom"><span></span></span></div>
- </div>
- </form>
-</noscript>
<form method="post" action="{U_QR_ACTION}">
- <div class="panel" style="display: none" id="qr_editor_div">
+ <div class="panel">
<div class="inner"><span class="corners-top"><span></span></span>
<h2>{L_QUICKREPLY}</h2>
<fieldset class="fields1">
@@ -61,19 +15,8 @@
{S_FORM_TOKEN}
{QR_HIDDEN_FIELDS}
<input type="submit" accesskey="s" tabindex="6" name="post" value="{L_SUBMIT}" class="button1" />&nbsp;
- <input type="submit" accesskey="f" tabindex="7" name="full_editor" value="{L_FULL_EDITOR}" class="button2" />&nbsp;
+ <input type="submit" accesskey="f" tabindex="7" name="full_editor" value="{L_FULL_EDITOR}" class="button2" data-ajax="false" />&nbsp;
</fieldset>
- <a href="" class="right-box up" onclick="hide_qr(false); return false;" title="{L_COLLAPSE_QR}">{L_COLLAPSE_QR}</a>
- <span class="corners-bottom"><span></span></span></div>
- </div>
- <div class="panel" style="display: none" id="qr_showeditor_div" >
- <div class="inner"><span class="corners-top"><span></span></span>
-
- <div class="content">
- <fieldset class="submit-buttons">
- <input type="submit" name="show_qr" tabindex="1" class="button2" value="{L_SHOW_QR}" onclick="hide_qr(true);return false;"/>
- </fieldset>
- </div>
<span class="corners-bottom"><span></span></span></div>
</div>
</form>
diff --git a/phpBB/styles/prosilver/template/simple_header.html b/phpBB/styles/prosilver/template/simple_header.html
index f71dd8d85c..f0dcbed5a4 100644
--- a/phpBB/styles/prosilver/template/simple_header.html
+++ b/phpBB/styles/prosilver/template/simple_header.html
@@ -50,6 +50,10 @@
<link href="{T_THEME_PATH}/bidi.css" rel="stylesheet" type="text/css" media="screen, projection" />
<!-- ENDIF -->
+<!--[if lte IE 8]>
+ <link href="{T_THEME_PATH}/tweaks.css" rel="stylesheet" type="text/css" media="screen, projection" />
+<![endif]-->
+
<!-- DEFINE $POPUP = 1 -->
</head>
diff --git a/phpBB/styles/prosilver/template/viewforum_body.html b/phpBB/styles/prosilver/template/viewforum_body.html
index 385d3eed71..d17203efa0 100644
--- a/phpBB/styles/prosilver/template/viewforum_body.html
+++ b/phpBB/styles/prosilver/template/viewforum_body.html
@@ -57,7 +57,7 @@
<!-- IF PAGINATION or TOTAL_POSTS or TOTAL_TOPICS -->
<div class="pagination">
- <!-- IF not S_IS_BOT and U_MARK_TOPICS --><a href="{U_MARK_TOPICS}" accesskey="m">{L_MARK_TOPICS_READ}</a> &bull; <!-- ENDIF --><!-- IF TOTAL_TOPICS -->{TOTAL_TOPICS}<!-- ENDIF -->
+ <!-- IF not S_IS_BOT and U_MARK_TOPICS --><a href="{U_MARK_TOPICS}" accesskey="m" data-ajax="true">{L_MARK_TOPICS_READ}</a> &bull; <!-- ENDIF --><!-- IF TOTAL_TOPICS -->{TOTAL_TOPICS}<!-- ENDIF -->
<!-- IF PAGE_NUMBER -->
<!-- IF PAGINATION --> &bull; <a href="#" onclick="jumpto(); return false;" title="{L_JUMP_TO_PAGE}">{PAGE_NUMBER}</a> &bull; <span>{PAGINATION}</span><!-- ELSE --> &bull; {PAGE_NUMBER}<!-- ENDIF -->
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html
index 952b986d9f..3c551b3d52 100644
--- a/phpBB/styles/prosilver/template/viewtopic_body.html
+++ b/phpBB/styles/prosilver/template/viewtopic_body.html
@@ -122,7 +122,7 @@
<!-- IF postrow.U_EDIT or postrow.U_DELETE or postrow.U_REPORT or postrow.U_WARN or postrow.U_INFO or postrow.U_QUOTE -->
<ul class="profile-icons">
<!-- IF postrow.U_EDIT --><li class="edit-icon"><a href="{postrow.U_EDIT}" title="{L_EDIT_POST}"><span>{L_EDIT_POST}</span></a></li><!-- ENDIF -->
- <!-- IF postrow.U_DELETE --><li class="delete-icon"><a href="{postrow.U_DELETE}" title="{L_DELETE_POST}"><span>{L_DELETE_POST}</span></a></li><!-- ENDIF -->
+ <!-- IF postrow.U_DELETE --><li class="delete-icon"><a href="{postrow.U_DELETE}" title="{L_DELETE_POST}" data-ajax="post_delete"<!-- IF postrow.POST_NUMBER == 1 --> data-refresh="true"<!-- ENDIF -->><span>{L_DELETE_POST}</span></a></li><!-- ENDIF -->
<!-- IF postrow.U_REPORT --><li class="report-icon"><a href="{postrow.U_REPORT}" title="{L_REPORT_POST}"><span>{L_REPORT_POST}</span></a></li><!-- ENDIF -->
<!-- IF postrow.U_WARN --><li class="warn-icon"><a href="{postrow.U_WARN}" title="{L_WARN_USER}"><span>{L_WARN_USER}</span></a></li><!-- ENDIF -->
<!-- IF postrow.U_INFO --><li class="info-icon"><a href="{postrow.U_INFO}" title="{L_INFORMATION}"><span>{L_INFORMATION}</span></a></li><!-- ENDIF -->
@@ -135,10 +135,18 @@
<p class="author"><!-- IF S_IS_BOT -->{postrow.MINI_POST_IMG}<!-- ELSE --><a href="{postrow.U_MINI_POST}">{postrow.MINI_POST_IMG}</a><!-- ENDIF -->{L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong> &raquo; {postrow.POST_DATE} </p>
<!-- IF postrow.S_POST_UNAPPROVED or postrow.S_POST_REPORTED -->
+ <form method="post" class="mcp_approve" action="{postrow.U_APPROVE_ACTION}" data-ajax="post_approve">
<p class="rules">
- <!-- IF postrow.S_POST_UNAPPROVED -->{UNAPPROVED_IMG} <a href="{postrow.U_MCP_APPROVE}"><strong>{L_POST_UNAPPROVED}</strong></a><br /><!-- ENDIF -->
+ <!-- IF postrow.S_POST_UNAPPROVED -->
+ {UNAPPROVED_IMG} <strong>{L_POST_UNAPPROVED}</strong>
+ <input class="button2" type="submit" value="{L_DISAPPROVE}" name="action[disapprove]" />
+ <input class="button1" type="submit" value="{L_APPROVE}" name="action[approve]" />
+ <input type="hidden" name="post_id_list[]" value="{postrow.POST_ID}" />
+ {S_FORM_TOKEN}
+ <br /><!-- ENDIF -->
<!-- IF postrow.S_POST_REPORTED -->{REPORTED_IMG} <a href="{postrow.U_MCP_REPORT}"><strong>{L_POST_REPORTED}</strong></a><!-- ENDIF -->
</p>
+ </form>
<!-- ENDIF -->
<div class="content">{postrow.MESSAGE}</div>
@@ -254,10 +262,16 @@
<!-- INCLUDE jumpbox.html -->
-<!-- IF S_TOPIC_MOD -->
- <form method="post" action="{S_MOD_ACTION}">
+<!-- IF .quickmod -->
+ <form method="post" action="{S_MOD_ACTION}" id="quickmodform" data-ajax="true">
<fieldset class="quickmod">
- <label for="quick-mod-select">{L_QUICK_MOD}:</label> {S_TOPIC_MOD} <input type="submit" value="{L_GO}" class="button2" />
+ <label for="quick-mod-select">{L_QUICK_MOD}:</label>
+ <select name="action" id="quick-mod-select">
+ <!-- BEGIN quickmod -->
+ <option value="{quickmod.VALUE}">{quickmod.TITLE}</option>
+ <!-- END quickmod -->
+ </select>
+ <input type="submit" value="{L_GO}" class="button2" />
{S_FORM_TOKEN}
</fieldset>
</form>
diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css
index caa85c9915..855febf4aa 100644
--- a/phpBB/styles/prosilver/theme/colours.css
+++ b/phpBB/styles/prosilver/theme/colours.css
@@ -26,10 +26,6 @@ hr {
border-top-color: #CCCCCC;
}
-hr.dashed {
- border-top-color: #CCCCCC;
-}
-
/* Search box
--------------------------------------------- */
@@ -452,6 +448,10 @@ dl.faq dt {
color: #BC2A4D;
}
+.announce, .unreadpost {
+ /* Highlight the announcements & unread posts box */
+}
+
/* Post signature */
.signature {
border-top-color: #CCCCCC;
@@ -957,7 +957,7 @@ dl.mini dt {
/* Avatar gallery */
#gallery label {
- background-color: #FFFFFF;
+ background: #FFFFFF;
border-color: #CCC;
}
@@ -992,6 +992,10 @@ dd label {
color: #333;
}
+fieldset.fields1 {
+ background-color: transparent;
+}
+
/* Hover effects */
fieldset dl:hover dt label {
color: #000000;
@@ -1070,3 +1074,17 @@ input.search {
input.disabled {
color: #666666;
}
+
+/* jQuery popups
+---------------------------------------- */
+.phpbb_alert {
+ background-color: #FFFFFF;
+ border-color: #999999;
+}
+.phpbb_alert .alert_close {
+ background-image: url("./images/alert_close.png");
+}
+#darken {
+ background-color: #000000;
+}
+
diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css
index 574e9ceb3a..31015b28f9 100644
--- a/phpBB/styles/prosilver/theme/common.css
+++ b/phpBB/styles/prosilver/theme/common.css
@@ -55,8 +55,6 @@ html {
body {
/* Text-Sizing with ems: http://www.clagnut.com/blog/348/ */
font-family: Verdana, Helvetica, Arial, sans-serif;
- color: #828282;
- background-color: #FFFFFF;
/*font-size: 62.5%; This sets the default font size to be equivalent to 10px */
font-size: 10px;
line-height: normal;
@@ -68,7 +66,6 @@ h1 {
/* Forum name */
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
margin-right: 200px;
- color: #FFFFFF;
margin-top: 15px;
font-weight: bold;
font-size: 2em;
@@ -78,7 +75,6 @@ h2 {
/* Forum header titles */
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
font-weight: normal;
- color: #3f3f3f;
font-size: 2em;
margin: 0.8em 0 0.2em 0;
}
@@ -92,11 +88,10 @@ h3 {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
text-transform: uppercase;
- border-bottom: 1px solid #CCCCCC;
+ border-bottom: 1px solid transparent;
margin-bottom: 3px;
padding-bottom: 2px;
font-size: 1.05em;
- color: #989898;
margin-top: 20px;
}
@@ -118,8 +113,8 @@ img {
hr {
/* Also see tweaks.css */
- border: 0 none #FFFFFF;
- border-top: 1px solid #CCCCCC;
+ border: 0 solid transparent;
+ border-top-width: 1px;
height: 1px;
margin: 5px 0;
display: block;
@@ -127,7 +122,7 @@ hr {
}
hr.dashed {
- border-top: 1px dashed #CCCCCC;
+ border-top-style: dashed;
margin: 10px 0;
}
@@ -209,7 +204,6 @@ a#logo:hover {
/* Search box
--------------------------------------------- */
#search-box {
- color: #FFFFFF;
position: relative;
margin-top: 30px;
margin-right: 5px;
@@ -221,11 +215,10 @@ a#logo:hover {
#search-box #keywords {
width: 95px;
- background-color: #FFF;
}
#search-box input {
- border: 1px solid #b0b0b0;
+ border: 1px solid transparent;
}
/* .button1 style defined later, just a few tweaks for the search button version */
@@ -256,26 +249,24 @@ a#logo:hover {
/* Round cornered boxes and backgrounds
---------------------------------------- */
.headerbar {
- background: #ebebeb none repeat-x 0 0;
- color: #FFFFFF;
+ background: transparent none repeat-x 0 0;
margin-bottom: 4px;
padding: 0 5px;
}
.navbar {
- background-color: #ebebeb;
padding: 0 10px;
}
.forabg {
- background: #b1b1b1 none repeat-x 0 0;
+ background: transparent none repeat-x 0 0;
margin-bottom: 4px;
padding: 0 5px;
clear: both;
}
.forumbg {
- background: #ebebeb none repeat-x 0 0;
+ background: transparent none repeat-x 0 0;
margin-bottom: 4px;
padding: 0 5px;
clear: both;
@@ -284,8 +275,6 @@ a#logo:hover {
.panel {
margin-bottom: 4px;
padding: 0 10px;
- background-color: #f3f3f3;
- color: #3f3f3f;
}
.post {
@@ -295,31 +284,10 @@ a#logo:hover {
background-position: 100% 0;
}
-.post:target .content {
- color: #000000;
-}
-
-.post:target h3 a {
- color: #000000;
-}
-
-.bg1 { background-color: #f7f7f7;}
-.bg2 { background-color: #f2f2f2; }
-.bg3 { background-color: #ebebeb; }
-
.rowbg {
margin: 5px 5px 2px 5px;
}
-.ucprowbg {
- background-color: #e2e2e2;
-}
-
-.fieldsbg {
- /*border: 1px #DBDEE2 solid;*/
- background-color: #eaeaea;
-}
-
span.corners-top, span.corners-bottom, span.corners-top span, span.corners-bottom span {
font-size: 1px;
line-height: 1px;
@@ -372,6 +340,8 @@ span.corners-bottom span {
ul.linklist {
display: block;
margin: 0;
+ height: 4%;
+ overflow: hidden;
}
ul.linklist li {
@@ -394,7 +364,7 @@ ul.linklist li.rightside, p.rightside {
ul.navlinks {
padding-bottom: 1px;
margin-bottom: 1px;
- border-bottom: 1px solid #FFFFFF;
+ border-bottom: 1px solid transparent;
font-weight: bold;
}
@@ -425,7 +395,6 @@ table.table1 {
table.table1 thead th {
font-weight: normal;
text-transform: uppercase;
- color: #FFFFFF;
line-height: 1.3em;
font-size: 1em;
padding: 0 0 4px 3px;
@@ -436,30 +405,22 @@ table.table1 thead th span {
}
table.table1 tbody tr {
- border: 1px solid #cfcfcf;
-}
-
-table.table1 tbody tr:hover, table.table1 tbody tr.hover {
- background-color: #f6f6f6;
- color: #000;
+ border: 1px solid transparent;
}
table.table1 td {
- color: #6a6a6a;
font-size: 1.1em;
}
table.table1 tbody td {
padding: 5px;
- border-top: 1px solid #FAFAFA;
+ border-top: 1px solid transparent;
}
table.table1 tbody th {
padding: 5px;
- border-bottom: 1px solid #000000;
+ border-bottom: 1px solid transparent;
text-align: left;
- color: #333333;
- background-color: #FFFFFF;
}
/* Specific column styles */
@@ -486,7 +447,6 @@ table.info tbody th {
padding: 3px;
text-align: right;
vertical-align: top;
- color: #000000;
font-weight: normal;
}
@@ -508,7 +468,7 @@ table.info tbody th {
/* Misc layout styles
---------------------------------------- */
-/* column[1-2] styles are containers for two column layouts
+/* column[1-2] styles are containers for two column layouts
Also see tweaks.css */
.column1 {
float: left;
@@ -545,7 +505,6 @@ dl.details dt {
clear: left;
width: 30%;
text-align: right;
- color: #000000;
display: block;
}
@@ -553,11 +512,15 @@ dl.details dd {
margin-left: 0;
padding-left: 5px;
margin-bottom: 5px;
- color: #828282;
float: left;
width: 65%;
}
+.clearfix, #tabs, #minitabs, fieldset dl, ul.topiclist dl, dl.polls {
+ height: 1%;
+ overflow: hidden;
+}
+
/* Pagination
---------------------------------------- */
.pagination {
@@ -584,28 +547,21 @@ li.pagination {
padding: 0 2px;
margin: 0 2px;
font-weight: normal;
- color: #FFFFFF;
- background-color: #bfbfbf;
- border: 1px solid #bfbfbf;
+ border: 1px solid transparent;
font-size: 0.9em;
}
.pagination span a, .pagination span a:link, .pagination span a:visited, .pagination span a:active {
font-weight: normal;
text-decoration: none;
- color: #747474;
margin: 0 2px;
padding: 0 2px;
- background-color: #eeeeee;
- border: 1px solid #bababa;
+ border: 1px solid transparent;
font-size: 0.9em;
line-height: 1.5em;
}
.pagination span a:hover {
- border-color: #d2d2d2;
- background-color: #d2d2d2;
- color: #FFF;
text-decoration: none;
}
@@ -632,6 +588,53 @@ li.pagination {
background-color: #d2d2d2;
}
+/* jQuery popups
+---------------------------------------- */
+.phpbb_alert {
+ border: 1px solid transparent;
+ position: fixed;
+ display: none;
+ top: 100px;
+ left: 35%;
+ width: 30%;
+ z-index: 50;
+ padding: 25px;
+ padding: 0 25px 20px 25px;
+}
+
+.phpbb_alert .alert_close {
+ display: block;
+ float: right;
+ width: 16px;
+ height: 16px;
+ overflow: hidden;
+ text-decoration: none !important;
+ background: transparent none 0 0 no-repeat;
+ margin-top: -7px;
+ margin-right: -31px;
+}
+.phpbb_alert .alert_close:hover {
+ background-position: 0 -16px;
+}
+
+.phpbb_alert p {
+ margin: 8px 0;
+ padding-bottom: 8px;
+}
+
+#darkenwrapper {
+ display: none;
+}
+
+#darken {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0.5;
+}
+
/* Miscellaneous styles
---------------------------------------- */
#forum-permissions {
@@ -646,7 +649,6 @@ li.pagination {
.copyright {
padding: 5px;
text-align: center;
- color: #555555;
}
.small {
@@ -662,22 +664,11 @@ li.pagination {
}
.error {
- color: #bcbcbc;
font-weight: bold;
font-size: 1em;
}
-.reported {
- background-color: #f7f7f7;
-}
-
-li.reported:hover {
- background-color: #ececec;
-}
-
div.rules {
- background-color: #ececec;
- color: #bcbcbc;
padding: 0 10px;
margin: 10px 0;
font-size: 1.1em;
@@ -688,13 +679,16 @@ div.rules ul, div.rules ol {
}
p.rules {
- background-color: #ececec;
background-image: none;
padding: 5px;
}
p.rules img {
vertical-align: middle;
+}
+
+p.rules strong {
+ vertical-align: middle;
padding-top: 5px;
}
@@ -715,3 +709,7 @@ p.rules a {
line-height: 1px;
background: transparent;
}
+
+.hidden {
+ display: none;
+}
diff --git a/phpBB/styles/prosilver/theme/content.css b/phpBB/styles/prosilver/theme/content.css
index adf5f2ca2a..b0872f78aa 100644
--- a/phpBB/styles/prosilver/theme/content.css
+++ b/phpBB/styles/prosilver/theme/content.css
@@ -8,13 +8,12 @@ ul.topiclist {
}
ul.forums {
- background: #f9f9f9 none repeat-x 0 0;
+ background: transparent none repeat-x 0 0;
}
ul.topiclist li {
display: block;
list-style-type: none;
- color: #777777;
margin: 0;
}
@@ -38,7 +37,7 @@ ul.topiclist dt {
ul.topiclist dd {
display: block;
float: left;
- border-left: 1px solid #FFFFFF;
+ border-left: 1px solid transparent;
padding: 4px 0;
}
@@ -65,28 +64,18 @@ ul.topiclist li.row dt a.subforum {
}
li.row {
- border-top: 1px solid #FFFFFF;
- border-bottom: 1px solid #8f8f8f;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
}
li.row strong {
font-weight: normal;
- color: #000000;
-}
-
-li.row:hover {
- background-color: #f6f6f6;
-}
-
-li.row:hover dd {
- border-left-color: #CCCCCC;
}
li.header dt, li.header dd {
line-height: 1em;
border-left-width: 0;
margin: 2px 0 4px 0;
- color: #FFFFFF;
padding-top: 2px;
padding-bottom: 2px;
font-size: 1em;
@@ -205,7 +194,6 @@ ul.topiclist dd.searchextra {
margin-left: 5px;
padding: 0.2em 0;
font-size: 1.1em;
- color: #333333;
border-left: none;
clear: both;
width: 98%;
@@ -228,7 +216,6 @@ div[class].topic-actions {
.postbody {
padding: 0;
line-height: 1.48em;
- color: #333333;
width: 76%;
float: left;
clear: both;
@@ -320,14 +307,12 @@ div[class].topic-actions {
line-height: 1.4em;
font-family: "Lucida Grande", "Trebuchet MS", Verdana, Helvetica, Arial, sans-serif;
font-size: 1em;
- color: #333333;
padding-bottom: 1px;
}
.content h2, .panel h2 {
font-weight: normal;
- color: #989898;
- border-bottom: 1px solid #CCCCCC;
+ border-bottom: 1px solid transparent;
font-size: 1.6em;
margin-top: 0.5em;
margin-bottom: 0.5em;
@@ -361,7 +346,6 @@ dl.faq {
dl.faq dt {
font-weight: bold;
- color: #333333;
}
.content dl.faq {
@@ -379,17 +363,9 @@ dl.faq dt {
}
.posthilit {
- background-color: #f3f3f3;
- color: #BCBCBC;
padding: 0 2px 1px 2px;
}
-.announce, .unreadpost {
- /* Highlight the announcements & unread posts box */
- border-left-color: #BCBCBC;
- border-right-color: #BCBCBC;
-}
-
/* Post author */
p.author {
margin: 0 15em 0.6em 0;
@@ -404,7 +380,7 @@ p.author {
margin-top: 1.5em;
padding-top: 0.2em;
font-size: 1.1em;
- border-top: 1px solid #CCCCCC;
+ border-top: 1px solid transparent;
clear: left;
line-height: 140%;
overflow: hidden;
@@ -434,7 +410,7 @@ dd .signature {
margin-top: 1.5em;
padding-top: 0.2em;
font-size: 1em;
- border-top: 1px dashed #CCCCCC;
+ border-top: 1px dashed transparent;
clear: left;
line-height: 130%;
}
@@ -450,8 +426,8 @@ ul.searchresults {
----------------------------------------*/
/* Quote block */
blockquote {
- background: #ebebeb none 6px 8px no-repeat;
- border: 1px solid #dbdbdb;
+ background: transparent none 6px 8px no-repeat;
+ border: 1px solid transparent;
font-size: 0.95em;
margin: 0.5em 1px 0 25px;
overflow: hidden;
@@ -460,16 +436,10 @@ blockquote {
blockquote blockquote {
/* Nested quotes */
- background-color: #bababa;
font-size: 1em;
margin: 0.5em 1px 0 15px;
}
-blockquote blockquote blockquote {
- /* Nested quotes */
- background-color: #e4e4e4;
-}
-
blockquote cite {
/* Username/source of quoter */
font-style: normal;
@@ -490,14 +460,13 @@ blockquote.uncited {
/* Code block */
dl.codebox {
padding: 3px;
- background-color: #FFFFFF;
- border: 1px solid #d8d8d8;
+ border: 1px solid transparent;
font-size: 1em;
}
dl.codebox dt {
text-transform: uppercase;
- border-bottom: 1px solid #CCCCCC;
+ border-bottom: 1px solid transparent;
margin-bottom: 3px;
font-size: 0.8em;
font-weight: bold;
@@ -518,17 +487,9 @@ dl.codebox code {
padding-top: 5px;
font: 0.9em Monaco, "Andale Mono","Courier New", Courier, mono;
line-height: 1.3em;
- color: #8b8b8b;
margin: 2px 0;
}
-.syntaxbg { color: #FFFFFF; }
-.syntaxcomment { color: #000000; }
-.syntaxdefault { color: #bcbcbc; }
-.syntaxhtml { color: #000000; }
-.syntaxkeyword { color: #585858; }
-.syntaxstring { color: #a7a7a7; }
-
/* Attachments
----------------------------------------*/
.attachbox {
@@ -536,15 +497,10 @@ dl.codebox code {
width: auto;
margin: 5px 5px 5px 0;
padding: 6px;
- background-color: #FFFFFF;
- border: 1px dashed #d8d8d8;
+ border: 1px dashed transparent;
clear: left;
}
-.pm-message .attachbox {
- background-color: #f3f3f3;
-}
-
.attachbox dt {
font-family: Arial, Helvetica, sans-serif;
text-transform: uppercase;
@@ -554,7 +510,7 @@ dl.codebox code {
margin-top: 4px;
padding-top: 4px;
clear: left;
- border-top: 1px solid #d8d8d8;
+ border-top: 1px solid transparent;
}
.attachbox dd dd {
@@ -563,7 +519,6 @@ dl.codebox code {
.attachbox p {
line-height: 110%;
- color: #666666;
font-weight: normal;
clear: left;
}
@@ -571,7 +526,6 @@ dl.codebox code {
.attachbox p.stats
{
line-height: 110%;
- color: #666666;
font-weight: normal;
clear: left;
}
@@ -584,7 +538,7 @@ dl.codebox code {
}
.attach-image img {
- border: 1px solid #999999;
+ border: 1px solid transparent;
/* cursor: move; */
cursor: default;
}
@@ -613,19 +567,16 @@ dl.file dt {
}
dl.file dd {
- color: #666666;
margin: 0;
padding: 0;
}
dl.thumbnail img {
padding: 3px;
- border: 1px solid #666666;
- background-color: #FFF;
+ border: 1px solid transparent;
}
dl.thumbnail dd {
- color: #666666;
font-style: italic;
font-family: Verdana, Arial, Helvetica, sans-serif;
}
@@ -634,12 +585,8 @@ dl.thumbnail dd {
font-size: 100%;
}
-dl.thumbnail dt a:hover {
- background-color: #EEEEEE;
-}
-
dl.thumbnail dt a:hover img {
- border: 1px solid #d2d2d2;
+ border: 1px solid transparent;
}
/* Post poll styles
@@ -650,15 +597,13 @@ fieldset.polls {
fieldset.polls dl {
margin-top: 5px;
- border-top: 1px solid #e2e2e2;
+ border-top: 1px solid transparent;
padding: 5px 0 0 0;
line-height: 120%;
- color: #666666;
}
fieldset.polls dl.voted {
font-weight: bold;
- color: #000000;
}
fieldset.polls dt {
@@ -692,41 +637,15 @@ fieldset.polls dd input {
fieldset.polls dd div {
text-align: right;
font-family: Arial, Helvetica, sans-serif;
- color: #FFFFFF;
font-weight: bold;
padding: 0 2px;
overflow: visible;
min-width: 2%;
}
-.pollbar1 {
- background-color: #aaaaaa;
- border-bottom: 1px solid #747474;
- border-right: 1px solid #747474;
-}
-
-.pollbar2 {
- background-color: #bebebe;
- border-bottom: 1px solid #8c8c8c;
- border-right: 1px solid #8c8c8c;
-}
-
-.pollbar3 {
- background-color: #D1D1D1;
- border-bottom: 1px solid #aaaaaa;
- border-right: 1px solid #aaaaaa;
-}
-
-.pollbar4 {
- background-color: #e4e4e4;
- border-bottom: 1px solid #bebebe;
- border-right: 1px solid #bebebe;
-}
-
-.pollbar5 {
- background-color: #f8f8f8;
- border-bottom: 1px solid #D1D1D1;
- border-right: 1px solid #D1D1D1;
+.pollbar1, .pollbar2, .pollbar3, .pollbar4, .pollbar5 {
+ border-bottom: 1px solid transparent;
+ border-right: 1px solid transparent;
}
/* Poster profile block
@@ -735,15 +654,11 @@ fieldset.polls dd div {
/* Also see tweaks.css */
margin: 5px 0 10px 0;
min-height: 80px;
- color: #666666;
- border-left: 1px solid #FFFFFF;
+ border-left: 1px solid transparent;
width: 22%;
float: right;
display: inline;
}
-.pm .postprofile {
- border-left: 1px solid #DDDDDD;
-}
.postprofile dd, .postprofile dt {
line-height: 1.2em;
@@ -752,7 +667,6 @@ fieldset.polls dd div {
.postprofile strong {
font-weight: normal;
- color: #000000;
}
.avatar {
diff --git a/phpBB/styles/prosilver/theme/cp.css b/phpBB/styles/prosilver/theme/cp.css
index aed88831a8..74f11e47a6 100644
--- a/phpBB/styles/prosilver/theme/cp.css
+++ b/phpBB/styles/prosilver/theme/cp.css
@@ -20,10 +20,6 @@
padding: 0;
}
-#cp-main h3, #cp-main hr, #cp-menu hr {
- border-color: #bfbfbf;
-}
-
#cp-main .panel p {
font-size: 1.1em;
}
@@ -34,17 +30,16 @@
}
#cp-main .panel li.row {
- border-bottom: 1px solid #cbcbcb;
- border-top: 1px solid #F9F9F9;
+ border-bottom: 1px solid transparent;
+ border-top: 1px solid transparent;
}
ul.cplist {
margin-bottom: 5px;
- border-top: 1px solid #cbcbcb;
+ border-top: 1px solid transparent;
}
#cp-main .panel li.header dd, #cp-main .panel li.header dt {
- color: #000000;
margin-bottom: 2px;
}
@@ -53,9 +48,8 @@ ul.cplist {
}
#cp-main table.table1 thead th {
- color: #333333;
font-weight: bold;
- border-bottom: 1px solid #333333;
+ border-bottom: 1px solid transparent;
padding: 5px;
}
@@ -76,9 +70,8 @@ ul.cplist {
}
#cp-main .pm-message {
- border: 1px solid #e2e2e2;
+ border: 1px solid transparent;
margin: 10px 0;
- background-color: #FFFFFF;
width: auto;
float: none;
}
@@ -141,23 +134,17 @@ ul.cplist {
display: block;
background: none no-repeat 100% -35px;
padding: 6px 10px 6px 5px;
- color: #828282;
white-space: nowrap;
}
-#tabs a:hover span {
- color: #bcbcbc;
-}
-
#tabs .activetab a {
background-position: 0 0;
- border-bottom: 1px solid #ebebeb;
+ border-bottom: 1px solid transparent;
}
#tabs .activetab a span {
background-position: 100% 0;
padding-bottom: 7px;
- color: #333333;
}
#tabs a:hover {
@@ -173,7 +160,6 @@ ul.cplist {
}
#tabs .activetab a:hover span {
- color: #000000;
background-position: 100% 0;
}
@@ -196,7 +182,6 @@ ul.cplist {
padding: 0 10px 4px 10px;
font-size: 1em;
font-weight: bold;
- background-color: #f2f2f2;
margin-left: 2px;
}
@@ -207,14 +192,6 @@ ul.cplist {
text-decoration: none;
}
-#minitabs li.activetab {
- background-color: #F9F9F9;
-}
-
-#minitabs li.activetab a, #minitabs li.activetab a:hover {
- color: #333333;
-}
-
/* UCP navigation menu
----------------------------------------*/
/* Container for sub-navigation list */
@@ -242,43 +219,25 @@ ul.cplist {
margin: 1px 0;
text-decoration: none;
font-weight: bold;
- color: #333;
- background: #cfcfcf none repeat-y 100% 0;
+ background: transparent none repeat-y 100% 0;
}
#navigation a:hover {
text-decoration: none;
- background-color: #c6c6c6;
- color: #bcbcbc;
background-image: none;
}
#navigation #active-subsection a {
display: block;
- color: #d3d3d3;
- background-color: #F9F9F9;
background-image: none;
}
-#navigation #active-subsection a:hover {
- color: #d3d3d3;
-}
-
/* Preferences pane layout
----------------------------------------*/
#cp-main h2 {
border-bottom: none;
padding: 0;
margin-left: 10px;
- color: #333333;
-}
-
-#cp-main .panel {
- background-color: #F9F9F9;
-}
-
-#cp-main .pm {
- background-color: #FFFFFF;
}
#cp-main span.corners-top, #cp-menu span.corners-top {
@@ -316,7 +275,6 @@ ul.cplist {
/* Friends list */
.cp-mini {
- background-color: #f9f9f9;
padding: 0 5px;
margin: 10px 15px 10px 5px;
}
@@ -327,7 +285,6 @@ ul.cplist {
dl.mini dt {
font-weight: bold;
- color: #676767;
}
dl.mini dd {
@@ -362,11 +319,6 @@ dl.mini dd {
padding-top: 5px;
}
-/* PM Message history */
-.current {
- color: #999999;
-}
-
/* Defined rules list for PM options */
ol.def-rules {
padding-left: 0;
@@ -387,31 +339,16 @@ ol.def-rules li {
}
.pmlist li.pm_message_reported_colour, .pm_message_reported_colour {
- border-left-color: #bcbcbc;
- border-right-color: #bcbcbc;
-}
-
-.pmlist li.pm_marked_colour, .pm_marked_colour {
- padding: 0;
- border: solid 3px #ffffff;
- border-width: 0 3px;
-}
-
-.pmlist li.pm_replied_colour, .pm_replied_colour {
- padding: 0;
- border: solid 3px #c2c2c2;
- border-width: 0 3px;
-}
-
-.pmlist li.pm_friend_colour, .pm_friend_colour {
- padding: 0;
- border: solid 3px #bdbdbd;
- border-width: 0 3px;
+ border-left-color: transparent;
+ border-right-color: transparent;
}
+.pmlist li.pm_marked_colour, .pm_marked_colour,
+.pmlist li.pm_replied_colour, .pm_replied_colour,
+.pmlist li.pm_friend_colour, .pm_friend_colour,
.pmlist li.pm_foe_colour, .pm_foe_colour {
padding: 0;
- border: solid 3px #000000;
+ border: solid 3px transparent;
border-width: 0 3px;
}
@@ -430,11 +367,6 @@ ol.def-rules li {
margin: 10px;
padding: 5px;
width: auto;
- background: #FFFFFF;
- border: 1px solid #CCC;
+ border: 1px solid transparent;
text-align: center;
}
-
-#gallery label:hover {
- background-color: #EEE;
-}
diff --git a/phpBB/styles/prosilver/theme/forms.css b/phpBB/styles/prosilver/theme/forms.css
index 43888733cc..77b3be5cfa 100644
--- a/phpBB/styles/prosilver/theme/forms.css
+++ b/phpBB/styles/prosilver/theme/forms.css
@@ -23,9 +23,8 @@ select {
font-weight: normal;
cursor: pointer;
vertical-align: middle;
- border: 1px solid #666666;
+ border: 1px solid transparent;
padding: 1px;
- background-color: #FAFAFA;
font-size: 1em;
}
@@ -33,10 +32,6 @@ option {
padding-right: 1em;
}
-option.disabled-option {
- color: graytext;
-}
-
textarea {
font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif;
width: 60%;
@@ -48,7 +43,6 @@ textarea {
label {
cursor: default;
padding-right: 5px;
- color: #676767;
}
label input {
@@ -89,10 +83,6 @@ fieldset.fields1 dd {
border-left-width: 0;
}
-fieldset.fields1 {
- background-color: transparent;
-}
-
fieldset.fields1 div {
margin-bottom: 3px;
}
@@ -121,7 +111,6 @@ dt label {
dd label {
white-space: nowrap;
- color: #333;
}
dd input, dd textarea {
@@ -137,22 +126,10 @@ dd textarea {
}
/* Hover effects */
-fieldset dl:hover dt label {
- color: #000000;
-}
-
-fieldset.fields2 dl:hover dt label {
- color: inherit;
-}
-
#timezone {
width: 95%;
}
-* html #timezone {
- width: 50%;
-}
-
/* Quick-login on index page */
fieldset.quick-login {
margin-top: 5px;
@@ -166,7 +143,6 @@ fieldset.quick-login input.inputbox {
width: 15%;
vertical-align: middle;
margin-right: 5px;
- background-color: #f3f3f3;
}
fieldset.quick-login label {
@@ -268,7 +244,6 @@ fieldset.submit-buttons input {
min-width: 100%;
max-width: 100%;
font-size: 1.2em;
- color: #333333;
}
/* Emoticons panel */
@@ -284,20 +259,13 @@ fieldset.submit-buttons input {
/* Input field styles
---------------------------------------- */
.inputbox {
- background-color: #FFFFFF;
- border: 1px solid #c0c0c0;
- color: #333333;
+ border: 1px solid transparent;
padding: 2px;
cursor: text;
}
-.inputbox:hover {
- border: 1px solid #eaeaea;
-}
-
-.inputbox:focus {
- border: 1px solid #eaeaea;
- color: #4b4b4b;
+.inputbox:hover, .inputbox:focus {
+ border: 1px solid transparent;
}
input.inputbox { width: 85%; }
@@ -324,13 +292,12 @@ a.button1, input.button1, input.button3, a.button2, input.button2 {
padding-top: 1px;
padding-bottom: 1px;
font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif;
- color: #000;
- background: #FAFAFA none repeat-x top left;
+ background: transparent none repeat-x top left;
}
a.button1, input.button1 {
font-weight: bold;
- border: 1px solid #666666;
+ border: 1px solid transparent;
}
input.button3 {
@@ -344,13 +311,12 @@ input.button3 {
/* Alternative button */
a.button2, input.button2, input.button3 {
- border: 1px solid #666666;
+ border: 1px solid transparent;
}
/* <a> button in the style of the form buttons */
a.button1, a.button1:link, a.button1:visited, a.button1:active, a.button2, a.button2:link, a.button2:visited, a.button2:active {
text-decoration: none;
- color: #000000;
padding: 2px 8px;
line-height: 250%;
vertical-align: text-bottom;
@@ -359,14 +325,12 @@ a.button1, a.button1:link, a.button1:visited, a.button1:active, a.button2, a.but
/* Hover states */
a.button1:hover, input.button1:hover, a.button2:hover, input.button2:hover, input.button3:hover {
- border: 1px solid #BCBCBC;
+ border: 1px solid transparent;
background-position: 0 100%;
- color: #BCBCBC;
}
input.disabled {
font-weight: normal;
- color: #666666;
}
/* Topic and forum Search */
diff --git a/phpBB/styles/prosilver/theme/images/alert_close.png b/phpBB/styles/prosilver/theme/images/alert_close.png
new file mode 100644
index 0000000000..79750a013c
--- /dev/null
+++ b/phpBB/styles/prosilver/theme/images/alert_close.png
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/links.css b/phpBB/styles/prosilver/theme/links.css
index c6a7cb4559..3cb6e928b5 100644
--- a/phpBB/styles/prosilver/theme/links.css
+++ b/phpBB/styles/prosilver/theme/links.css
@@ -7,10 +7,17 @@ a {
unicode-bidi: embed;
}
-a:link { color: #898989; text-decoration: none; }
-a:visited { color: #898989; text-decoration: none; }
-a:hover { color: #d3d3d3; text-decoration: underline; }
-a:active { color: #d2d2d2; text-decoration: none; }
+a:link, a:visited {
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a:active {
+ text-decoration: none;
+}
/* Coloured usernames */
.username-coloured {
@@ -21,22 +28,18 @@ a:active { color: #d2d2d2; text-decoration: none; }
/* Links on gradient backgrounds */
#search-box a:link, .navbg a:link, .forumbg .header a:link, .forabg .header a:link, th a:link {
- color: #FFFFFF;
text-decoration: none;
}
#search-box a:visited, .navbg a:visited, .forumbg .header a:visited, .forabg .header a:visited, th a:visited {
- color: #FFFFFF;
text-decoration: none;
}
#search-box a:hover, .navbg a:hover, .forumbg .header a:hover, .forabg .header a:hover, th a:hover {
- color: #ffffff;
text-decoration: underline;
}
#search-box a:active, .navbg a:active, .forumbg .header a:active, .forabg .header a:active, th a:active {
- color: #ffffff;
text-decoration: none;
}
@@ -45,96 +48,65 @@ a.forumtitle {
font-family: "Trebuchet MS", Helvetica, Arial, Sans-serif;
font-size: 1.2em;
font-weight: bold;
- color: #898989;
text-decoration: none;
}
-/* a.forumtitle:visited { color: #898989; } */
-
a.forumtitle:hover {
- color: #bcbcbc;
text-decoration: underline;
}
-a.forumtitle:active {
- color: #898989;
-}
-
a.topictitle {
font-family: "Trebuchet MS", Helvetica, Arial, Sans-serif;
font-size: 1.2em;
font-weight: bold;
- color: #898989;
text-decoration: none;
}
-/* a.topictitle:visited { color: #d2d2d2; } */
-
a.topictitle:hover {
- color: #bcbcbc;
text-decoration: underline;
}
-a.topictitle:active {
- color: #898989;
-}
-
/* Post body links */
.postlink {
text-decoration: none;
- color: #d2d2d2;
- border-bottom: 1px solid #d2d2d2;
+ border-bottom: 1px solid transparent;
padding-bottom: 0;
}
-/* .postlink:visited { color: #bdbdbd; } */
-
-.postlink:active {
- color: #d2d2d2;
-}
-
.postlink:hover {
- background-color: #f6f6f6;
text-decoration: none;
- color: #404040;
}
.signature a, .signature a:visited, .signature a:hover, .signature a:active {
border: none;
text-decoration: underline;
- background-color: transparent;
}
/* Profile links */
.postprofile a:link, .postprofile a:visited, .postprofile dt.author a {
font-weight: bold;
- color: #898989;
text-decoration: none;
}
.postprofile a:hover, .postprofile dt.author a:hover {
text-decoration: underline;
- color: #d3d3d3;
}
/* CSS spec requires a:link, a:visited, a:hover and a:active rules to be specified in this order. */
/* See http://www.phpbb.com/bugs/phpbb3/59685 */
.postprofile a:active {
font-weight: bold;
- color: #898989;
text-decoration: none;
}
/* Profile searchresults */
.search .postprofile a {
- color: #898989;
text-decoration: none;
font-weight: normal;
}
.search .postprofile a:hover {
- color: #d3d3d3;
text-decoration: underline;
}
@@ -177,7 +149,6 @@ a.up, a.up:link, a.up:active, a.up:visited {
a.up:hover {
background-position: left top;
- background-color: transparent;
}
a.down, a.down:link, a.down:active, a.down:visited {
@@ -194,7 +165,6 @@ a.left, a.left:active, a.left:visited {
}
a.left:hover {
- color: #d2d2d2;
text-decoration: none;
background-position: 0 60%;
}
@@ -204,7 +174,6 @@ a.right, a.right:active, a.right:visited {
}
a.right:hover {
- color: #d2d2d2;
text-decoration: none;
background-position: 100% 60%;
}
diff --git a/phpBB/styles/prosilver/theme/stylesheet.css b/phpBB/styles/prosilver/theme/stylesheet.css
index 3cf60ea494..f7b526780f 100644
--- a/phpBB/styles/prosilver/theme/stylesheet.css
+++ b/phpBB/styles/prosilver/theme/stylesheet.css
@@ -13,6 +13,5 @@
@import url("buttons.css");
@import url("cp.css");
@import url("forms.css");
-@import url("tweaks.css");
@import url("colours.css");
@import url("imageset.css");
diff --git a/phpBB/styles/prosilver/theme/tweaks.css b/phpBB/styles/prosilver/theme/tweaks.css
index ae724e1419..416c4a5510 100644
--- a/phpBB/styles/prosilver/theme/tweaks.css
+++ b/phpBB/styles/prosilver/theme/tweaks.css
@@ -1,97 +1,31 @@
/* Style Sheet Tweaks
-These style definitions are mainly IE specific
+These style definitions are IE 7 and 8 specific
tweaks required due to its poor CSS support.
-------------------------------------------------*/
-* html table, * html select, * html input { font-size: 100%; }
-* html hr { margin: 0; }
-* html span.corners-top, * html span.corners-bottom { background-image: url("./images/corners_left.gif"); }
-* html span.corners-top span, * html span.corners-bottom span { background-image: url("./images/corners_right.gif"); }
-
table.table1 {
- width: 99%; /* IE < 6 browsers */
- /* Tantek hack */
- voice-family: "\"}\"";
- voice-family: inherit;
width: 100%;
}
-html>body table.table1 { width: 100%; } /* Reset 100% for opera */
-
-* html ul.topiclist li { position: relative; }
-* html .postbody h3 img { vertical-align: middle; }
-
-/* Form styles */
-html>body dd label input { vertical-align: text-bottom; } /* Align checkboxes/radio buttons nicely */
-
-* html input.button1, * html input.button2 {
- padding-bottom: 0;
- margin-bottom: 1px;
-}
-/* Misc layout styles */
-* html .column1, * html .column2 { width: 45%; }
-
-/* Nice method for clearing floated blocks without having to insert any extra markup (like spacer above)
- From http://www.positioniseverything.net/easyclearing.html
-#tabs:after, #minitabs:after, .post:after, .navbar:after, fieldset dl:after, ul.topiclist dl:after, ul.linklist:after, dl.polls:after {
- content: ".";
- display: block;
- height: 0;
- clear: both;
- visibility: hidden;
-}*/
-
-.clearfix, #tabs, #minitabs, fieldset dl, ul.topiclist dl, dl.polls {
- height: 1%;
- overflow: hidden;
+/* Align checkboxes/radio buttons nicely */
+dd label input {
+ vertical-align: text-bottom;
+ *vertical-align: middle;
}
-/* viewtopic fix */
-* html .post {
- height: 25%;
- overflow: hidden;
-}
-
-/* navbar fix */
-* html .clearfix, * html .navbar, ul.linklist {
- height: 4%;
- overflow: hidden;
-}
-
-/* Simple fix so forum and topic lists always have a min-height set, even in IE6
- From http://www.dustindiaz.com/min-height-fast-hack */
+/* Simple fix so forum and topic lists always have a height set */
dl.icon {
- min-height: 35px;
- height: auto !important;
- height: 35px;
-}
-
-* html li.row dl.icon dt {
- height: 35px;
- overflow: visible;
-}
-
-* html #search-box {
- width: 25%;
+ *height: 35px;
}
/* Correctly clear floating for details on profile view */
-*:first-child+html dl.details dd {
- margin-left: 30%;
- float: none;
-}
-
-* html dl.details dd {
- margin-left: 30%;
- float: none;
-}
-
-/* Headerbar height fix for IE7 and below */
-* html #site-description p {
- margin-bottom: 1.0em;
+dl.details dd {
+ *margin-left: 30%;
+ *float: none;
}
-*:first-child+html #site-description p {
- margin-bottom: 1.0em;
+/* Headerbar height fix for IE7 */
+#site-description p {
+ *margin-bottom: 1.0em;
} \ No newline at end of file
diff --git a/phpBB/styles/subsilver2/template/viewtopic_body.html b/phpBB/styles/subsilver2/template/viewtopic_body.html
index b8387482bf..2c5351b926 100644
--- a/phpBB/styles/subsilver2/template/viewtopic_body.html
+++ b/phpBB/styles/subsilver2/template/viewtopic_body.html
@@ -347,7 +347,19 @@
<table width="100%" cellspacing="1">
<tr>
- <td width="40%" valign="top" nowrap="nowrap" align="{S_CONTENT_FLOW_BEGIN}"><!-- IF S_TOPIC_MOD --><form method="post" action="{S_MOD_ACTION}"><span class="gensmall">{L_QUICK_MOD}:</span> {S_TOPIC_MOD} <input class="btnlite" type="submit" value="{L_GO}" /></form><!-- ENDIF --></td>
+ <td width="40%" valign="top" nowrap="nowrap" align="{S_CONTENT_FLOW_BEGIN}">
+ <!-- IF .quickmod -->
+ <form method="post" action="{S_MOD_ACTION}">
+ <span class="gensmall">{L_QUICK_MOD}:</span>
+ <select name="action" id="quick-mod-select">
+ <!-- BEGIN quickmod -->
+ <option value="{quickmod.VALUE}">{quickmod.TITLE}</option>
+ <!-- END quickmod -->
+ </select>
+ <input class="btnlite" type="submit" value="{L_GO}" />
+ </form>
+ <!-- ENDIF -->
+ </td>
<td align="{S_CONTENT_FLOW_END}" valign="top" nowrap="nowrap"><span class="gensmall"><!-- BEGIN rules -->{rules.RULE}<br /><!-- END rules --></span></td>
</tr>
</table>
diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php
index 7cb6df3660..a43edee5da 100644
--- a/phpBB/viewtopic.php
+++ b/phpBB/viewtopic.php
@@ -517,19 +517,31 @@ gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status']);
// Quick mod tools
$allow_change_type = ($auth->acl_get('m_', $forum_id) || ($user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'])) ? true : false;
-$topic_mod = '';
-$topic_mod .= ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'] && $topic_data['topic_status'] == ITEM_UNLOCKED)) ? (($topic_data['topic_status'] == ITEM_UNLOCKED) ? '<option value="lock">' . $user->lang['LOCK_TOPIC'] . '</option>' : '<option value="unlock">' . $user->lang['UNLOCK_TOPIC'] . '</option>') : '';
-$topic_mod .= ($auth->acl_get('m_delete', $forum_id)) ? '<option value="delete_topic">' . $user->lang['DELETE_TOPIC'] . '</option>' : '';
-$topic_mod .= ($auth->acl_get('m_move', $forum_id) && $topic_data['topic_status'] != ITEM_MOVED) ? '<option value="move">' . $user->lang['MOVE_TOPIC'] . '</option>' : '';
-$topic_mod .= ($auth->acl_get('m_split', $forum_id)) ? '<option value="split">' . $user->lang['SPLIT_TOPIC'] . '</option>' : '';
-$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge">' . $user->lang['MERGE_POSTS'] . '</option>' : '';
-$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge_topic">' . $user->lang['MERGE_TOPIC'] . '</option>' : '';
-$topic_mod .= ($auth->acl_get('m_move', $forum_id)) ? '<option value="fork">' . $user->lang['FORK_TOPIC'] . '</option>' : '';
-$topic_mod .= ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', $forum_id) && $topic_data['topic_type'] != POST_NORMAL) ? '<option value="make_normal">' . $user->lang['MAKE_NORMAL'] . '</option>' : '';
-$topic_mod .= ($allow_change_type && $auth->acl_get('f_sticky', $forum_id) && $topic_data['topic_type'] != POST_STICKY) ? '<option value="make_sticky">' . $user->lang['MAKE_STICKY'] . '</option>' : '';
-$topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_ANNOUNCE) ? '<option value="make_announce">' . $user->lang['MAKE_ANNOUNCE'] . '</option>' : '';
-$topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL) ? '<option value="make_global">' . $user->lang['MAKE_GLOBAL'] . '</option>' : '';
-$topic_mod .= ($auth->acl_get('m_', $forum_id)) ? '<option value="topic_logs">' . $user->lang['VIEW_TOPIC_LOGS'] . '</option>' : '';
+$quickmod_array = array(
+// 'key' => array('LANG_KEY', $userHasPermissions),
+
+ 'lock' => array('LOCK_TOPIC', ($topic_data['topic_status'] == ITEM_UNLOCKED) && ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'] && $topic_data['topic_status'] == ITEM_UNLOCKED))),
+ 'unlock' => array('UNLOCK_TOPIC', ($topic_data['topic_status'] != ITEM_UNLOCKED) && ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'] && $topic_data['topic_status'] == ITEM_UNLOCKED))),
+ 'delete_topic' => array('DELETE_TOPIC', $auth->acl_get('m_delete', $forum_id)),
+ 'move' => array('MOVE_TOPIC', $auth->acl_get('m_move', $forum_id) && $topic_data['topic_status'] != ITEM_MOVED),
+ 'split' => array('SPLIT_TOPIC', $auth->acl_get('m_split', $forum_id)),
+ 'merge' => array('MERGE_POSTS', $auth->acl_get('m_merge', $forum_id)),
+ 'merge_topic' => array('MERGE_TOPIC', $auth->acl_get('m_merge', $forum_id)),
+ 'fork' => array('FORK_TOPIC', $auth->acl_get('m_move', $forum_id)),
+ 'make_normal' => array('MAKE_NORMAL', ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', $forum_id) && $topic_data['topic_type'] != POST_NORMAL)),
+ 'make_sticky' => array('MAKE_STICKY', ($allow_change_type && $auth->acl_get('f_sticky', $forum_id) && $topic_data['topic_type'] != POST_STICKY)),
+ 'make_announce' => array('MAKE_ANNOUNCE', ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_ANNOUNCE)),
+ 'make_global' => array('MAKE_GLOBAL', ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL)),
+ 'topic_logs' => array('VIEW_TOPIC_LOGS', $auth->acl_get('m_', $forum_id)),
+);
+
+foreach($quickmod_array as $option => $qm_ary)
+{
+ if (!empty($qm_ary[1]))
+ {
+ phpbb_add_quickmod_option($option, $qm_ary[0]);
+ }
+}
// If we've got a hightlight set pass it on to pagination.
$pagination = generate_pagination(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : '') . (($highlight_match) ? "&amp;hilit=$highlight" : '')), $total_posts, $config['posts_per_page'], $start);
@@ -617,7 +629,6 @@ $template->assign_vars(array(
'S_SELECT_SORT_DAYS' => $s_limit_days,
'S_SINGLE_MODERATOR' => (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true,
'S_TOPIC_ACTION' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start")),
- 'S_TOPIC_MOD' => ($topic_mod != '') ? '<select name="action" id="quick-mod-select">' . $topic_mod . '</select>' : '',
'S_MOD_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start") . "&amp;quickmod=1&amp;redirect=" . urlencode(str_replace('&amp;', '&', $viewtopic_url)), true, $user->session_id),
'S_VIEWTOPIC' => true,
@@ -644,6 +655,8 @@ $template->assign_vars(array(
'U_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks']) ? $viewtopic_url . '&amp;bookmark=1&amp;hash=' . generate_link_hash("topic_$topic_id") : '',
'L_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'],
+ 'L_BOOKMARK_TOPIC_REAL' => $user->lang['BOOKMARK_TOPIC'],
+ 'S_BOOKMARKED_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? true : false,
'U_POST_NEW_TOPIC' => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=post&amp;f=$forum_id") : '',
'U_POST_REPLY_TOPIC' => ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&amp;f=$forum_id&amp;t=$topic_id") : '',
@@ -1523,6 +1536,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
'U_YIM' => $user_cache[$poster_id]['yim'],
'U_JABBER' => $user_cache[$poster_id]['jabber'],
+ 'U_APPROVE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p={$row['post_id']}&amp;f=$forum_id"),
'U_REPORT' => ($auth->acl_get('f_report', $forum_id)) ? append_sid("{$phpbb_root_path}report.$phpEx", 'f=' . $forum_id . '&amp;p=' . $row['post_id']) : '',
'U_MCP_REPORT' => ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
'U_MCP_APPROVE' => ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
diff --git a/tests/event/dispatcher_test.php b/tests/event/dispatcher_test.php
new file mode 100644
index 0000000000..f8fe060d99
--- /dev/null
+++ b/tests/event/dispatcher_test.php
@@ -0,0 +1,29 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+class phpbb_event_dispatcher_test extends phpbb_test_case
+{
+ public function test_trigger_event()
+ {
+ $dispatcher = new phpbb_event_dispatcher();
+
+ $dispatcher->addListener('core.test_event', function (phpbb_event_data $event) {
+ $event['foo'] = $event['foo'] . '2';
+ $event['bar'] = $event['bar'] . '2';
+ });
+
+ $foo = 'foo';
+ $bar = 'bar';
+
+ $vars = array('foo', 'bar');
+ $result = $dispatcher->trigger_event('core.test_event', compact($vars));
+
+ $this->assertSame(array('foo' => 'foo2', 'bar' => 'bar2'), $result);
+ }
+}
diff --git a/tests/functional/fixtures/ext/error/class/controller.php b/tests/functional/fixtures/ext/error/class/controller.php
index eb2ae362a6..74bbbee540 100644
--- a/tests/functional/fixtures/ext/error/class/controller.php
+++ b/tests/functional/fixtures/ext/error/class/controller.php
@@ -1,13 +1,10 @@
<?php
-class phpbb_ext_foobar_controller implements phpbb_extension_controller_interface
+class phpbb_ext_foobar_controller extends phpbb_extension_controller
{
public function handle()
{
- global $template;
- $template->set_ext_dir_prefix($phpbb_root_path . 'ext/error/class/');
-
- $template->set_filenames(array(
+ $this->template->set_filenames(array(
'body' => 'index_body.html'
));
diff --git a/tests/functional/fixtures/ext/error/classtype/controller.php b/tests/functional/fixtures/ext/error/classtype/controller.php
index 2276548b55..55ac651bdf 100644
--- a/tests/functional/fixtures/ext/error/classtype/controller.php
+++ b/tests/functional/fixtures/ext/error/classtype/controller.php
@@ -5,8 +5,6 @@ class phpbb_ext_error_classtype_controller
public function handle()
{
global $template;
- $template->set_ext_dir_prefix($phpbb_root_path . 'ext/error/classtype/');
-
$template->set_filenames(array(
'body' => 'index_body.html'
));
diff --git a/tests/functional/fixtures/ext/error/disabled/controller.php b/tests/functional/fixtures/ext/error/disabled/controller.php
index b83a949020..57b913f377 100644
--- a/tests/functional/fixtures/ext/error/disabled/controller.php
+++ b/tests/functional/fixtures/ext/error/disabled/controller.php
@@ -1,13 +1,10 @@
<?php
-class phpbb_ext_error_disabled_controller implements phpbb_extension_controller_interface
+class phpbb_ext_error_disabled_controller extends phpbb_extension_controller
{
public function handle()
- {
- global $template;
- $template->set_ext_dir_prefix($phpbb_root_path . 'ext/error/disabled/');
-
- $template->set_filenames(array(
+ {
+ $this->template->set_filenames(array(
'body' => 'index_body.html'
));
diff --git a/tests/functional/fixtures/ext/foo/bar/controller.php b/tests/functional/fixtures/ext/foo/bar/controller.php
index 24d218c412..3375e317b3 100644
--- a/tests/functional/fixtures/ext/foo/bar/controller.php
+++ b/tests/functional/fixtures/ext/foo/bar/controller.php
@@ -1,13 +1,10 @@
<?php
-class phpbb_ext_foo_bar_controller implements phpbb_extension_controller_interface
+class phpbb_ext_foo_bar_controller extends phpbb_extension_controller
{
public function handle()
{
- global $template;
- $template->set_ext_dir_prefix($phpbb_root_path . 'ext/foo/bar/');
-
- $template->set_filenames(array(
+ $this->template->set_filenames(array(
'body' => 'foobar_body.html'
));
diff --git a/tests/functional/fixtures/ext/foobar/controller.php b/tests/functional/fixtures/ext/foobar/controller.php
index bf8d8139ae..ff35f12ee0 100644
--- a/tests/functional/fixtures/ext/foobar/controller.php
+++ b/tests/functional/fixtures/ext/foobar/controller.php
@@ -1,13 +1,10 @@
<?php
-class phpbb_ext_foobar_controller implements phpbb_extension_controller_interface
+class phpbb_ext_foobar_controller extends phpbb_extension_controller
{
public function handle()
{
- global $template;
- $template->set_ext_dir_prefix($phpbb_root_path . 'ext/foobar/');
-
- $template->set_filenames(array(
+ $this->template->set_filenames(array(
'body' => 'foobar_body.html'
));