diff options
49 files changed, 1203 insertions, 70 deletions
diff --git a/phpBB/adm/images/alert_close.png b/phpBB/adm/images/alert_close.png Binary files differnew file mode 100644 index 0000000000..79750a013c --- /dev/null +++ b/phpBB/adm/images/alert_close.png 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>» {L_ALLOWED_IN_PM_POST}</span><!-- ENDIF -->  				</td>  				<td>{groups.CATEGORY}</td> -				<td align="center" valign="middle" style="white-space: nowrap;"> <a href="{groups.U_EDIT}">{ICON_EDIT}</a>  <a href="{groups.U_DELETE}">{ICON_DELETE}</a> </td> +				<td align="center" valign="middle" style="white-space: nowrap;"> <a href="{groups.U_EDIT}">{ICON_EDIT}</a>  <a href="{groups.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a> </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"> {bots.LAST_VISIT} </td> -			<td style="text-align: center;"> <a href="{bots.U_ACTIVATE_DEACTIVATE}">{bots.L_ACTIVATE_DEACTIVATE}</a> </td> +			<td style="text-align: center;"> <a href="{bots.U_ACTIVATE_DEACTIVATE}" data-ajax="activate_deactivate">{bots.L_ACTIVATE_DEACTIVATE}</a> </td>  			<td style="text-align: center;"> <a href="{bots.U_EDIT}">{L_EDIT}</a> </td> -			<td style="text-align: center;"> <a href="{bots.U_DELETE}">{L_DELETE}</a> </td> +			<td style="text-align: center;"> <a href="{bots.U_DELETE}" data-ajax="row_delete">{L_DELETE}</a> </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 -->   				<!-- 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 --> -				 <a href="{items.U_EDIT}">{ICON_EDIT}</a> <a href="{items.U_DELETE}">{ICON_DELETE}</a> +				 <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 63ca3a1c79..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> </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> </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,7 +188,7 @@  			</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> @@ -196,7 +196,7 @@  			</form>  			<!-- ENDIF --> -			<form id="action_purge_cache_form" method="post" action="{U_ACTION}"> +			<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> 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 -->  -  <!-- ENDIF --></td>  		<td style="text-align: center;">{ranks.RANK_TITLE}</td>  		<td style="text-align: center;"><!-- IF ranks.S_SPECIAL_RANK -->  -  <!-- 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_styles.html b/phpBB/adm/style/acp_styles.html index dc89aa247a..3532e8c7d9 100644 --- a/phpBB/adm/style/acp_styles.html +++ b/phpBB/adm/style/acp_styles.html @@ -288,7 +288,7 @@  		</td>  		<td style="text-align: center;">  			<!-- IF S_STYLE --> -				<a href="{installed.U_STYLE_ACT_DEACT}">{installed.L_STYLE_ACT_DEACT}</a> | +				<a href="{installed.U_STYLE_ACT_DEACT}" data-ajax="activate_deactivate">{installed.L_STYLE_ACT_DEACT}</a> |  			<!-- ENDIF -->  			{installed.S_ACTIONS}  			<!-- IF S_STYLE --> 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> <a href="{words.U_EDIT}">{ICON_EDIT}</a>  <a href="{words.U_DELETE}">{ICON_DELETE}</a> </td> +		<td> <a href="{words.U_EDIT}">{ICON_EDIT}</a>  <a href="{words.U_DELETE}" data-ajax="row_delete">{ICON_DELETE}</a> </td>  	</tr>  	<!-- BEGINELSE -->  	<tr class="row3"> diff --git a/phpBB/adm/style/admin.css b/phpBB/adm/style/admin.css index ceda824e5a..d5dc957ac5 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; @@ -1070,6 +1074,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"> </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}" />  +			<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('&', '&'); +			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/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 4c9ee85982..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,6 +346,11 @@ class acp_main  						}  						add_log('admin', 'LOG_RESYNC_POST_MARKING'); +						 +						if ($request->is_ajax()) +						{ +							trigger_error('RESYNC_POST_MARKING_SUCCESS'); +						}  					break;  					case 'purge_cache': @@ -338,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': @@ -384,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/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php index 7b449d3b35..26939080bc 100644 --- a/phpBB/includes/acp/acp_styles.php +++ b/phpBB/includes/acp/acp_styles.php @@ -28,7 +28,7 @@ class acp_styles  	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;  		// Hardcoded template bitfield to add for new templates @@ -185,6 +185,19 @@ inherit_from = {INHERIT_FROM}  									WHERE forum_style = ' . $style_id;  								$db->sql_query($sql);  							} + +							if ($request->is_ajax()) +							{ +								$json_response = new phpbb_json_response; +								$json_response->send(array( +									'text'	=> $user->lang['STYLE_' . (($action == 'activate') ? 'DE' : '') . 'ACTIVATE'], +									'MESSAGE_TITLE'	=> $user->lang['INFORMATION'], +									'MESSAGE_TEXT'	=> $user->lang['STYLE_' . strtoupper($action) . 'D'], +									'REFRESH_DATA'	=> array( +										'time'	=> 3 +									) +								)); +							}  						}  						else if ($action == 'deactivate')  						{ @@ -335,7 +348,8 @@ inherit_from = {INHERIT_FROM}  			$s_actions = array();  			foreach ($actions as $option)  			{ -				$s_actions[] = '<a href="' . $this->u_action . "&action=$option&id=" . $row[$mode . '_id'] . '">' . $user->lang[strtoupper($option)] . '</a>'; +				$data_ajax = ($option == 'refresh') ? ' data-ajax="true"' : ''; +				$s_actions[] = '<a href="' . $this->u_action . "&action=$option&id=" . $row[$mode . '_id'] . '"' . $data_ajax . '>' . $user->lang[strtoupper($option)] . '</a>';  			}  			$template->assign_block_vars('installed', array( diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 7a96dd3609..afd901a296 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('&', '&', $url); +	if ($request->is_ajax()) +	{ +		$refresh_data = array( +			'time'	=> $time, +			'url'		=> str_replace('&', '&', $url) +		); +	} +	else +	{ +		$url = redirect($url, true, $disable_cd_check); +		$url = str_replace('&', '&', $url); -	// For XHTML compatibility we change back & to & -	$template->assign_vars(array( -		'META' => '<meta http-equiv="refresh" content="' . $time . ';url=' . $url . '" />') -	); +		// For XHTML compatibility we change back & to & +		$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('&', '&', $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); 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/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/language/en/acp/common.php b/phpBB/language/en/acp/common.php index 242329a041..f96947b580 100644 --- a/phpBB/language/en/acp/common.php +++ b/phpBB/language/en/acp/common.php @@ -368,25 +368,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/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 59df82477e..3a96100947 100644 --- a/phpBB/language/en/acp/styles.php +++ b/phpBB/language/en/acp/styles.php @@ -295,9 +295,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_DELETED'				=> 'Style deleted successfully.',  	'STYLE_DETAILS_UPDATED'		=> 'Style edited successfully.', 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 f47f8a076b..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.', @@ -49,6 +50,7 @@ $lang = array_merge($lang, array(  	'CODE'					=> 'Code',  	'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( 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(' ').prev().html(' '); +	} +}); + + + +$('[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 --> • <a href="{U_SEARCH_UNREAD}">{L_SEARCH_UNREAD}</a><!-- ENDIF --><!-- IF S_USER_LOGGED_IN --> • <a href="{U_SEARCH_NEW}">{L_SEARCH_NEW}</a><!-- ENDIF --> • <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> </dt> <dd><a href="{U_REMOVE_FRIEND}"><strong>{L_REMOVE_FRIEND}</strong></a></dd> +				<dt> </dt> <dd class="zebra"><a href="{U_REMOVE_FRIEND}" data-ajax="zebra"><strong>{L_REMOVE_FRIEND}</strong></a></dd>  			<!-- ELSEIF U_REMOVE_FOE --> -				<dt> </dt> <dd><a href="{U_REMOVE_FOE}"><strong>{L_REMOVE_FOE}</strong></a></dd> +				<dt> </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> </dt> <dd><a href="{U_ADD_FRIEND}"><strong>{L_ADD_FRIEND}</strong></a></dd> +					<dt> </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> </dt> <dd><a href="{U_ADD_FOE}"><strong>{L_ADD_FOE}</strong></a></dd> +					<dt> </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> • <!-- ENDIF --><!-- IF not S_IS_BOT --><a href="{U_DELETE_COOKIES}">{L_DELETE_COOKIES}</a> • <!-- ENDIF -->{S_TIMEZONE}</li> +			<li class="rightside"><!-- IF U_TEAM --><a href="{U_TEAM}">{L_THE_TEAM}</a> • <!-- ENDIF --><!-- IF not S_IS_BOT --><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true">{L_DELETE_COOKIES}</a> • <!-- 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"> </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}" />  +		<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/quickreply_editor.html b/phpBB/styles/prosilver/template/quickreply_editor.html index f61cc49c0b..4cd5eedd3e 100644 --- a/phpBB/styles/prosilver/template/quickreply_editor.html +++ b/phpBB/styles/prosilver/template/quickreply_editor.html @@ -15,7 +15,7 @@  					{S_FORM_TOKEN}  					{QR_HIDDEN_FIELDS}  					<input type="submit" accesskey="s" tabindex="6" name="post" value="{L_SUBMIT}" class="button1" />  -					<input type="submit" accesskey="f" tabindex="7" name="full_editor" value="{L_FULL_EDITOR}" class="button2" />  +					<input type="submit" accesskey="f" tabindex="7" name="full_editor" value="{L_FULL_EDITOR}" class="button2" data-ajax="false" />   				</fieldset>  		<span class="corners-bottom"><span></span></span></div>  	</div> 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> • <!-- 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> • <!-- ENDIF --><!-- IF TOTAL_TOPICS -->{TOTAL_TOPICS}<!-- ENDIF -->  			<!-- IF PAGE_NUMBER -->  				<!-- IF PAGINATION --> • <a href="#" onclick="jumpto(); return false;" title="{L_JUMP_TO_PAGE}">{PAGE_NUMBER}</a> • <span>{PAGINATION}</span><!-- ELSE --> • {PAGE_NUMBER}<!-- ENDIF -->  			<!-- ENDIF --> diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html index 59e464d22e..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> » {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> @@ -255,7 +263,7 @@  <!-- INCLUDE jumpbox.html -->  <!-- IF .quickmod --> -	<form method="post" action="{S_MOD_ACTION}"> +	<form method="post" action="{S_MOD_ACTION}" id="quickmodform" data-ajax="true">  	<fieldset class="quickmod">  		<label for="quick-mod-select">{L_QUICK_MOD}:</label>  		<select name="action" id="quick-mod-select"> diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css index 42f6efc5b1..855febf4aa 100644 --- a/phpBB/styles/prosilver/theme/colours.css +++ b/phpBB/styles/prosilver/theme/colours.css @@ -1074,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 27a55caf7a..31015b28f9 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -468,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; @@ -580,6 +580,61 @@ li.pagination {  	background: none 0 50% no-repeat;  } +.row .pagination span a, li.pagination span a { +	background-color: #FFFFFF; +} + +.row .pagination span a:hover, li.pagination span a:hover { +	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 { @@ -630,6 +685,10 @@ p.rules {  p.rules img {  	vertical-align: middle; +} + +p.rules strong { +	vertical-align: middle;  	padding-top: 5px;  } @@ -650,3 +709,7 @@ p.rules a {  	line-height: 1px;  	background: transparent;  } + +.hidden { +	display: none; +} diff --git a/phpBB/styles/prosilver/theme/images/alert_close.png b/phpBB/styles/prosilver/theme/images/alert_close.png Binary files differnew file mode 100644 index 0000000000..79750a013c --- /dev/null +++ b/phpBB/styles/prosilver/theme/images/alert_close.png diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 8a95851b7e..a43edee5da 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -655,6 +655,8 @@ $template->assign_vars(array(  	'U_BOOKMARK_TOPIC'		=> ($user->data['is_registered'] && $config['allow_bookmarks']) ? $viewtopic_url . '&bookmark=1&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&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&f=$forum_id&t=$topic_id") : '', @@ -1534,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&p={$row['post_id']}&f=$forum_id"),  		'U_REPORT'			=> ($auth->acl_get('f_report', $forum_id)) ? append_sid("{$phpbb_root_path}report.$phpEx", 'f=' . $forum_id . '&p=' . $row['post_id']) : '',  		'U_MCP_REPORT'		=> ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&mode=report_details&f=' . $forum_id . '&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&mode=approve_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '',  | 
