Browse Source

Merge branch 'release-2.1' of git://github.com/SimpleMachines/SMF2.1.git into fixes

Suki 10 years ago
parent
commit
89664480e1
38 changed files with 529 additions and 178 deletions
  1. 18 1
      Sources/Class-BrowserDetect.php
  2. 1 2
      Sources/Display.php
  3. 1 0
      Sources/Load.php
  4. 7 2
      Sources/ManageNews.php
  5. 0 8
      Sources/ManagePermissions.php
  6. 1 1
      Sources/MessageIndex.php
  7. 0 5
      Sources/Notify.php
  8. 2 2
      Sources/Post.php
  9. 145 3
      Sources/Profile-View.php
  10. 28 0
      Sources/Profile.php
  11. 1 2
      Sources/Recent.php
  12. 2 2
      Sources/Search.php
  13. 5 3
      Sources/Subs.php
  14. 1 1
      Themes/default/GenericControls.template.php
  15. 6 18
      Themes/default/ManageBoards.template.php
  16. 2 2
      Themes/default/ManageLanguages.template.php
  17. 10 0
      Themes/default/ManageNews.template.php
  18. 1 1
      Themes/default/Post.template.php
  19. 44 2
      Themes/default/Profile.template.php
  20. 2 1
      Themes/default/Register.template.php
  21. 9 10
      Themes/default/css/index.css
  22. 8 0
      Themes/default/index.template.php
  23. 14 0
      Themes/default/languages/Alerts.english.php
  24. 0 2
      Themes/default/languages/Errors.english.php
  25. 0 2
      Themes/default/languages/ManageBoards.english.php
  26. 0 6
      Themes/default/languages/ManagePermissions.english.php
  27. 3 2
      Themes/default/languages/ManageSettings.english.php
  28. 2 2
      Themes/default/languages/Packages.english.php
  29. 0 2
      Themes/default/languages/Reports.english.php
  30. 2 0
      Themes/default/languages/index.english.php
  31. 2 0
      Themes/default/scripts/script.js
  32. 21 24
      other/install_2-1_mysql.sql
  33. 31 24
      other/install_2-1_postgresql.sql
  34. 26 24
      other/install_2-1_sqlite.sql
  35. 26 24
      other/install_2-1_sqlite3.sql
  36. 31 0
      other/upgrade_2-1_mysql.sql
  37. 34 0
      other/upgrade_2-1_postgresql.sql
  38. 43 0
      other/upgrade_2-1_sqlite.sql

+ 18 - 1
Sources/Class-BrowserDetect.php

@@ -72,6 +72,9 @@ class browser_detector
 		// Just a few mobile checks
 		$this->isOperaMini();
 		$this->isOperaMobi();
+		
+		// IE11 seems to be fine by itself without being lumped into the "is_ie" category
+		$this->isIe11();
 
 		// Be you robot or human?
 		if ($user_info['possibly_robot'])
@@ -118,6 +121,19 @@ class browser_detector
 			$this->_browsers['is_ie'] = !$this->isOpera() && !$this->isGecko() && !$this->isWebTv() && preg_match('~MSIE \d+~', $_SERVER['HTTP_USER_AGENT']) === 1;
 		return $this->_browsers['is_ie'];
 	}
+	
+	/**
+	* Determine if the browser is IE11 or not
+	* @return boolean true if the browser is IE11 otherwise false
+	*/
+	function isIe11()
+	{
+		// IE11 is a bit different than earlier versions
+		// The isGecko() part is to ensure we get this right...
+		if (!isset($this->_browsers['is_ie11']))
+			$this->_browsers['is_ie11'] = strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false && $this->isGecko();
+		return $this->_browsers['is_ie11'];
+ 	}
 
 	/**
 	* Determine if the browser is a Webkit based one or not
@@ -257,7 +273,7 @@ class browser_detector
 			$this->_browsers['is_ie' . $msie_match[1]] = true;
 		}
 
-		// "modern" ie uses trident 4=ie8, 5=ie9, 6=ie10, even in compatability view
+		// "modern" ie uses trident 4=ie8, 5=ie9, 6=ie10, 7=ie11 even in compatability view
 		if (preg_match('~Trident/([0-9.])~i', $_SERVER['HTTP_USER_AGENT'], $trident_match) === 1)
 		{
 			$this->_browsers['is_ie' . ((int) $trident_match[1] + 4)] = true;
@@ -341,6 +357,7 @@ class browser_detector
 				'is_ie8' => 'ie8',
 				'is_ie9' => 'ie9',
 				'is_ie10' => 'ie10',
+				'is_ie11' => 'ie11',
 				'is_ie' => 'ie',
 				'is_firefox' => 'firefox',
 				'is_chrome' => 'chrome',

+ 1 - 2
Sources/Display.php

@@ -1063,7 +1063,6 @@ function Display()
 		'can_merge' => 'merge_any',
 		'can_split' => 'split_any',
 		'calendar_post' => 'calendar_post',
-		'can_mark_notify' => 'mark_any_notify',
 		'can_send_topic' => 'send_topic',
 		'can_send_pm' => 'pm_send',
 		'can_send_email' => 'send_email_to_members',
@@ -1100,7 +1099,7 @@ function Display()
 	}
 
 	// Cleanup all the permissions with extra stuff...
-	$context['can_mark_notify'] &= !$context['user']['is_guest'];
+	$context['can_mark_notify'] = !$context['user']['is_guest'];
 	$context['calendar_post'] &= !empty($modSettings['cal_enabled']);
 	$context['can_add_poll'] &= $modSettings['pollMode'] == '1' && $topicinfo['id_poll'] <= 0;
 	$context['can_remove_poll'] &= $modSettings['pollMode'] == '1' && $topicinfo['id_poll'] > 0;

+ 1 - 0
Sources/Load.php

@@ -432,6 +432,7 @@ function loadUserSettings()
 		'smiley_set' => isset($user_settings['smiley_set']) ? $user_settings['smiley_set'] : '',
 		'messages' => empty($user_settings['instant_messages']) ? 0 : $user_settings['instant_messages'],
 		'unread_messages' => empty($user_settings['unread_messages']) ? 0 : $user_settings['unread_messages'],
+		'alerts' => empty($user_settings['alerts']) ? 0 : $user_settings['alerts'],
 		'total_time_logged_in' => empty($user_settings['total_time_logged_in']) ? 0 : $user_settings['total_time_logged_in'],
 		'buddies' => !empty($modSettings['enable_buddylist']) && !empty($user_settings['buddy_list']) ? explode(',', $user_settings['buddy_list']) : array(),
 		'ignoreboards' => !empty($user_settings['ignore_boards']) && !empty($modSettings['allow_ignore_boards']) ? explode(',', $user_settings['ignore_boards']) : array(),

+ 7 - 2
Sources/ManageNews.php

@@ -106,6 +106,8 @@ function EditNews()
 		// Update the database.
 		updateSettings(array('news' => implode("\n", $temp_news)));
 
+		$context['saved_successful'] = true;
+
 		logAction('news');
 	}
 	// The 'Save' button was pressed.
@@ -127,6 +129,8 @@ function EditNews()
 		// Send the new news to the database.
 		updateSettings(array('news' => implode("\n", $_POST['news'])));
 
+		$context['saved_successful'] = true;
+
 		// Log this into the moderation log.
 		logAction('news');
 	}
@@ -261,8 +265,9 @@ function EditNews()
 	// Create the request list.
 	createList($listOptions);
 
-	$context['sub_template'] = 'show_list';
-	$context['default_list'] = 'news_lists';
+	// And go!
+	loadTemplate('ManageNews');
+	$context['sub_template'] = 'news_lists';
 }
 
 /**

+ 0 - 8
Sources/ManagePermissions.php

@@ -1110,8 +1110,6 @@ function setPermissionLevel($level, $group, $profile = 'null')
 		'post_reply_any',
 		'delete_own',
 		'modify_own',
-		'mark_any_notify',
-		'mark_notify',
 		'report_any',
 		'send_topic',
 	);
@@ -1200,7 +1198,6 @@ function setPermissionLevel($level, $group, $profile = 'null')
 	// Locked - just that, you can't post here.
 	$boardLevels['locked'] = array(
 		'poll_view',
-		'mark_notify',
 		'report_any',
 		'send_topic',
 		'view_attachments',
@@ -1213,7 +1210,6 @@ function setPermissionLevel($level, $group, $profile = 'null')
 		'post_reply_any',
 		'delete_own',
 		'modify_own',
-		'mark_any_notify',
 		'delete_replies',
 		'modify_replies',
 		'poll_vote',
@@ -1536,8 +1532,6 @@ function loadAllPermissions($loadType = 'classic')
 			'poll_edit' => array(true, 'poll', 'modify', 'moderate'),
 			'poll_lock' => array(true, 'poll', 'moderate', 'moderate'),
 			'poll_remove' => array(true, 'poll', 'modify', 'moderate'),
-			'mark_any_notify' => array(false, 'notification', 'notification'),
-			'mark_notify' => array(false, 'notification', 'notification'),
 			'view_attachments' => array(false, 'attachment', 'participate'),
 			'post_unapproved_attachments' => array(false, 'attachment', 'make_unapproved_posts'),
 			'post_attachment' => array(false, 'attachment', 'attach'),
@@ -2258,8 +2252,6 @@ function loadIllegalGuestPermissions()
 		'manage_membergroups',
 		'manage_permissions',
 		'manage_smileys',
-		'mark_any_notify',
-		'mark_notify',
 		'merge_any',
 		'moderate_board',
 		'moderate_forum',

+ 1 - 1
Sources/MessageIndex.php

@@ -211,7 +211,7 @@ function MessageIndex()
 	$context['page_title'] = strip_tags($board_info['name']);
 
 	// Set the variables up for the template.
-	$context['can_mark_notify'] = allowedTo('mark_notify') && !$user_info['is_guest'];
+	$context['can_mark_notify'] = !$user_info['is_guest'];
 	$context['can_post_new'] = allowedTo('post_new') || ($modSettings['postmod_active'] && allowedTo('post_unapproved_topics'));
 	$context['can_post_poll'] = $modSettings['pollMode'] == '1' && allowedTo('poll_post') && $context['can_post_new'];
 	$context['can_moderate_forum'] = allowedTo('moderate_forum');

+ 0 - 5
Sources/Notify.php

@@ -21,7 +21,6 @@ if (!defined('SMF'))
  * Turn off/on notification for a particular topic.
  * Must be called with a topic specified in the URL.
  * The sub-action can be 'on', 'off', or nothing for what to do.
- * Requires the mark_any_notify permission.
  * Upon successful completion of action will direct user back to topic.
  * Accessed via ?action=notify.
  *
@@ -33,7 +32,6 @@ function Notify()
 
 	// Make sure they aren't a guest or something - guests can't really receive notifications!
 	is_not_guest();
-	isAllowedTo('mark_any_notify');
 
 	// Make sure the topic has been specified.
 	if (empty($topic))
@@ -103,7 +101,6 @@ function Notify()
  * Turn off/on notification for a particular board.
  * Must be called with a board specified in the URL.
  * Only uses the template if no sub action is used. (on/off)
- * Requires the mark_notify permission.
  * Redirects the user back to the board after it is done.
  * Accessed via ?action=notifyboard.
  *
@@ -115,7 +112,6 @@ function BoardNotify()
 
 	// Permissions are an important part of anything ;).
 	is_not_guest();
-	isAllowedTo('mark_notify');
 
 	// You have to specify a board to turn notifications on!
 	if (empty($board))
@@ -188,7 +184,6 @@ function BoardNotify()
  * Turn off/on unread replies subscription for a topic
  * Must be called with a topic specified in the URL.
  * The sub-action can be 'on', 'off', or nothing for what to do.
- * Requires the mark_any_notify permission.
  * Upon successful completion of action will direct user back to topic.
  * Accessed via ?action=unwatchtopic.
  */

+ 2 - 2
Sources/Post.php

@@ -160,7 +160,7 @@ function Post($post_errors = array())
 	}
 
 	// @todo These won't work if you're posting an event!
-	$context['can_notify'] = allowedTo('mark_any_notify');
+	$context['can_notify'] = !$context['user']['is_guest'];
 	$context['can_move'] = allowedTo('move_any');
 	$context['move'] = !empty($_REQUEST['move']);
 	$context['announce'] = !empty($_REQUEST['announce']);
@@ -1941,7 +1941,7 @@ function Post2()
 	}
 
 	// Turn notification on or off.  (note this just blows smoke if it's already on or off.)
-	if (!empty($_POST['notify']) && allowedTo('mark_any_notify'))
+	if (!empty($_POST['notify']) && !$context['user']['is_guest'])
 	{
 		$smcFunc['db_insert']('ignore',
 			'{db_prefix}log_notify',

+ 145 - 3
Sources/Profile-View.php

@@ -185,6 +185,150 @@ function summary($memID)
 	loadCustomFields($memID);
 }
 
+/**
+ * Fetch the alerts a user currently has.
+ *
+ * @param int $memID id_member
+ * @param bool $all Fetch all, or only fetch unread.
+ */
+function fetch_alerts($memID, $all = false)
+{
+	global $smcFunc, $txt, $scripturl, $memberContext;
+
+	$alerts = array();
+	$request = $smcFunc['db_query']('', '
+		SELECT id_alert, alert_time, mem.id_member AS sender_id, IFNULL(mem.real_name, ua.member_name) AS sender_name,
+			content_type, content_id, content_action, is_read, extra
+		FROM {db_prefix}user_alerts AS ua
+			LEFT JOIN {db_prefix}members AS mem ON (ua.id_member_started = mem.id_member)
+		WHERE ua.id_member = {int:id_member}' . (!$all ? '
+			AND is_read = 0' : '') . '
+		ORDER BY id_alert DESC',
+		array(
+			'id_member' => $memID,
+		)
+	);
+
+	$senders = array();
+	while ($row = $smcFunc['db_fetch_assoc']($request))
+	{
+		$id_alert = array_shift($row);
+		$row['time'] = timeformat($row['alert_time']);
+		$row['extra'] = !empty($row['extra']) ? @unserialize($row['extra']) : array();
+		$alerts[$id_alert] = $row;
+
+		if (!empty($row['sender_id']))
+			$senders[] = $row['sender_id'];
+	}
+	$smcFunc['db_free_result']($request);
+
+	// Hooks might want to do something snazzy around their own content types - including enforcing permissions if appropriate.
+	call_integration_hook('integrate_fetch_alerts', array(&$alerts));
+
+	if (!empty($senders))
+	{
+		$senders = loadMemberData($senders);
+		foreach ($senders as $member)
+			loadMemberContext($member);
+	}
+
+	// Now go through and actually make with the text.
+	loadLanguage('Alerts');
+
+	// For anything that wants us to check board or topic access, let's do that.
+	$boards = array();
+	$topics = array();
+	$msgs = array();
+	foreach ($alerts as $id_alert => $alert)
+	{
+		if (isset($alert['extra']['board']))
+			$boards[$alert['extra']['board']] = $txt['board_na'];
+		if (isset($alert['extra']['topic']))
+			$topics[$alert['extra']['topic']] = $txt['topic_na'];
+		if ($alert['content_type'] == 'msg')
+			$msgs[$alert['content_id']] = $txt['topic_na'];
+	}
+
+	// Having figured out what boards etc. there are, let's now get the names of them if we can see them. If not, there's already a fallback set up.
+	if (!empty($boards))
+	{
+		$request = $smcFunc['db_query']('', '
+			SELECT id_board, name
+			FROM {db_prefix}boards AS b
+			WHERE {query_see_board}
+				AND id_board IN ({array_int:boards})',
+			array(
+				'boards' => array_keys($boards),
+			)
+		);
+		while ($row = $smcFunc['db_fetch_assoc']($request))
+			$boards[$row['id_board']] = '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['name'] . '</a>';
+	}
+	if (!empty($topics))
+	{
+		$request = $smcFunc['db_query']('', '
+			SELECT t.id_topic, m.subject
+			FROM {db_prefix}topics AS t
+				INNER JOIN {db_prefix}messages AS m ON (t.id_first_msg = m.id_msg)
+				INNER JOIN {db_prefix}boards AS b ON (t.id_board = b.id_board)
+			WHERE {query_see_board}
+				AND t.id_topic IN ({array_int:topics})',
+			array(
+				'topics' => array_keys($topics),
+			)
+		);
+		while ($row = $smcFunc['db_fetch_assoc']($request))
+			$topics[$row['id_topic']] = '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.0">' . $row['subject'] . '</a>';
+	}
+	if (!empty($msgs))
+	{
+		$request = $smcFunc['db_query']('', '
+			SELECT m.id_msg, t.id_topic, m.subject
+			FROM {db_prefix}messages AS m
+				INNER JOIN {db_prefix}topics AS t ON (t.id_first_msg = m.id_msg)
+				INNER JOIN {db_prefix}boards AS b ON (m.id_board = b.id_board)
+			WHERE {query_see_board}
+				AND m.id_msg IN ({array_int:msgs})',
+			array(
+				'msgs' => array_keys($msgs),
+			)
+		);
+		while ($row = $smcFunc['db_fetch_assoc']($request))
+			$msgs[$row['id_msg']] = '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . '#msg' . $row['id_msg'] . '">' . $row['subject'] . '</a>';
+	}
+
+	// Now to go back through the alerts, reattach this extra information and then try to build the string out of it (if a hook didn't already)
+	foreach ($alerts as $id_alert => $alert)
+	{
+		if (!empty($alert['text']))
+			continue;
+		if (isset($alert['extra']['board']))
+			$alerts[$id_alert]['extra']['board_msg'] = $boards[$alert['extra']['board']];
+		if (isset($alert['extra']['topic']))
+			$alerts[$id_alert]['extra']['topic_msg'] = $topics[$alert['extra']['topic']];
+		if ($alert['content_type'] == 'msg')
+			$alerts[$id_alert]['extra']['msg_msg'] = $msgs[$alert['content_id']];
+
+		if (!empty($memberContext[$alert['sender_id']]))
+			$alerts[$id_alert]['sender'] = &$memberContext[$alert['sender_id']];
+
+		$string = 'alert_' . $alert['content_type'] . '_' . $alert['content_action'];
+		if (isset($txt[$string]))
+		{
+			$extra = $alerts[$id_alert]['extra'];
+			$search = array('{member_link}');
+			$repl = array(!empty($alert['sender_id']) ? '<a href="' . $scripturl . '?action=profile;u=' . $alert['sender_id'] . '">' . $alert['sender_name'] . '</a>' : $alert['sender_name']);
+			foreach ($extra as $k => $v)
+			{
+				$search[] = '{' . $k . '}';
+				$repl[] = $v;
+			}
+			$alerts[$id_alert]['text'] = str_replace($search, $repl, $txt[$string]);
+		}
+	}
+
+	return $alerts;
+}
 
 /**
  * Show all posts by the current user
@@ -455,7 +599,7 @@ function showPosts($memID)
 			'timestamp' => forum_time(true, $row['poster_time']),
 			'id' => $row['id_msg'],
 			'can_reply' => false,
-			'can_mark_notify' => false,
+			'can_mark_notify' => !$context['user']['is_guest'],
 			'can_delete' => false,
 			'delete_possible' => ($row['id_first_msg'] != $row['id_msg'] || $row['id_last_msg'] == $row['id_msg']) && (empty($modSettings['edit_disable_time']) || $row['poster_time'] + $modSettings['edit_disable_time'] * 60 >= time()),
 			'approved' => $row['approved'],
@@ -479,7 +623,6 @@ function showPosts($memID)
 			),
 			'any' => array(
 				'post_reply_any' => 'can_reply',
-				'mark_any_notify' => 'can_mark_notify',
 			)
 		);
 	else
@@ -490,7 +633,6 @@ function showPosts($memID)
 			),
 			'any' => array(
 				'post_reply_any' => 'can_reply',
-				'mark_any_notify' => 'can_mark_notify',
 				'delete_any' => 'can_delete',
 			)
 		);

+ 28 - 0
Sources/Profile.php

@@ -106,6 +106,14 @@ function ModifyProfile($post_errors = array())
 					),
 					'select' => 'summary',
 				),
+				'alerts_popup' => array(
+					'function' => 'alerts_popup',
+					'permission' => array(
+						'own' => 'is_not_guest',
+						'any' => array(),
+					),
+					'select' => 'summary',
+				),
 				'statistics' => array(
 					'label' => $txt['statPanel'],
 					'file' => 'Profile-View.php',
@@ -775,6 +783,26 @@ function profile_popup($memID)
 	}
 }
 
+/**
+ * Set up the requirements for the alerts popup - the area that shows all the alerts just quickly for the current user.
+ *
+ * @param int $memID
+ */
+function alerts_popup($memID)
+{
+	global $context, $scripturl, $txt, $sourcedir, $db_show_debug;
+
+	// We do not want to output debug information here.
+	$db_show_debug = false;
+
+	// We only want to output our little layer here.
+	$context['template_layers'] = array();
+
+	// Now fetch me my unread alerts, pronto!
+	require_once($sourcedir . '/Profile-View.php');
+	$context['unread_alerts'] = fetch_alerts($memID, false);
+}
+
 /**
  * Load any custom fields for this area... no area means load all, 'summary' loads all public ones.
  *

+ 1 - 2
Sources/Recent.php

@@ -352,7 +352,7 @@ function RecentPosts()
 			),
 			'message' => $row['body'],
 			'can_reply' => false,
-			'can_mark_notify' => false,
+			'can_mark_notify' => !$context['user']['is_guest'],
 			'can_delete' => false,
 			'delete_possible' => ($row['id_first_msg'] != $row['id_msg'] || $row['id_last_msg'] == $row['id_msg']) && (empty($modSettings['edit_disable_time']) || $row['poster_time'] + $modSettings['edit_disable_time'] * 60 >= time()),
 		);
@@ -371,7 +371,6 @@ function RecentPosts()
 		),
 		'any' => array(
 			'post_reply_any' => 'can_reply',
-			'mark_any_notify' => 'can_mark_notify',
 			'delete_any' => 'can_delete',
 		)
 	);

+ 2 - 2
Sources/Search.php

@@ -1727,7 +1727,7 @@ function PlushSearch2()
 	if (!empty($context['topics']))
 	{
 		// Create an array for the permissions.
-		$boards_can = boardsAllowedTo(array('post_reply_own', 'post_reply_any', 'mark_any_notify'), true, false);
+		$boards_can = boardsAllowedTo(array('post_reply_own', 'post_reply_any'), true, false);
 
 		// How's about some quick moderation?
 		if (!empty($options['display_quick_mod']))
@@ -2005,7 +2005,7 @@ function prepareSearchContext($reset = false)
 		'replies' => $message['num_replies'],
 		'can_reply' => in_array($message['id_board'], $boards_can['post_reply_any']) || in_array(0, $boards_can['post_reply_any']),
 		'can_quote' => (in_array($message['id_board'], $boards_can['post_reply_any']) || in_array(0, $boards_can['post_reply_any'])) && $quote_enabled,
-		'can_mark_notify' => in_array($message['id_board'], $boards_can['mark_any_notify']) || in_array(0, $boards_can['mark_any_notify']) && !$context['user']['is_guest'],
+		'can_mark_notify' => !$context['user']['is_guest'],
 		'first_post' => array(
 			'id' => $message['first_msg'],
 			'time' => timeformat($message['first_poster_time']),

+ 5 - 3
Sources/Subs.php

@@ -2875,6 +2875,7 @@ function setupThemeContext($forceload = false)
 	{
 		$context['user']['messages'] = &$user_info['messages'];
 		$context['user']['unread_messages'] = &$user_info['unread_messages'];
+		$context['user']['alerts'] = &$user_info['alerts'];
 
 		// Personal message popup...
 		if ($user_info['unread_messages'] > (isset($_SESSION['unread_messages']) ? $_SESSION['unread_messages'] : 0))
@@ -3785,7 +3786,8 @@ function setupMenuContext()
 	{
 		addInlineJavascript('
 	var user_menus = new smc_PopupMenu();
-	user_menus.add("profile", "' . $scripturl . '?action=profile;area=popup");', true);
+	user_menus.add("profile", "' . $scripturl . '?action=profile;area=popup");
+	user_menus.add("alerts", "' . $scripturl . '?action=profile;area=alerts_popup");', true);
 		if ($context['allow_pm'])
 			addInlineJavascript('
 	user_menus.add("pm", "' . $scripturl . '?action=pm;sa=popup");', true);
@@ -4012,8 +4014,8 @@ function setupMenuContext()
 	// There are certain exceptions to the above where we don't want anything on the menu highlighted.
 	if ($context['current_action'] == 'profile' && !empty($context['user']['is_owner']))
 	{
-		$current_action = 'self_profile';
-		$context['self_profile'] = true;
+		$current_action = !empty($_GET['area']) && $_GET['area'] == 'alerts_popup' ? 'self_alerts' : 'self_profile';
+		$context[$current_action] = true;
 	}
 	elseif ($context['current_action'] == 'pm')
 	{

+ 1 - 1
Themes/default/GenericControls.template.php

@@ -111,7 +111,7 @@ function template_control_richedit($editor_id, $smileyContainer = null, $bbcCont
 				$(".sceditor-container").width("100%").height("100%");',
 				$editor_context['rich_active'] ? '' : '
 				$("#' . $editor_id . '").data("sceditor").setTextMode();', '
-				if (!(is_ie || is_ff || is_opera || is_safari || is_chrome))
+				if (!(is_ie || is_ie11 || is_ff || is_opera || is_safari || is_chrome))
 				{
 					$("#' . $editor_id . '").data("sceditor").setTextMode();
 					$(".sceditor-button-source").hide();

+ 6 - 18
Themes/default/ManageBoards.template.php

@@ -457,6 +457,7 @@ function template_modify_board()
 					<hr class="hrcolor" />';
 
 	if (empty($context['board']['is_recycle']) && empty($context['board']['topics']))
+	{
 		echo '
 					<dl class="settings">
 						<dt>
@@ -464,24 +465,10 @@ function template_modify_board()
 							<span class="smalltext">', $txt['mboards_redirect_desc'], '</span><br />
 						</dt>
 						<dd>
-							<input type="checkbox" id="redirect_enable" name="redirect_enable"', $context['board']['topics'] ? ' disabled="disabled"' : '', $context['board']['redirect'] != '' ? ' checked="checked"' : '', ' onclick="refreshOptions();" class="input_check" />
+							<input type="checkbox" id="redirect_enable" name="redirect_enable"', $context['board']['redirect'] != '' ? ' checked="checked"' : '', ' onclick="refreshOptions();" class="input_check" />
 						</dd>
-					</dl>';
-
-	if (!empty($context['board']['is_recycle']))
-		echo '
-					<div class="information">', $txt['mboards_redirect_disabled_recycle'], '</div>';
-
-	if (empty($context['board']['is_recycle']) && !empty($context['board']['topics']))
-		echo '
-					<div class="information">
-						<strong>', $txt['mboards_redirect'],'</strong><br />
-						', $txt['mboards_redirect_disabled'], '
-					</div>';
+					</dl>
 
-	if (!$context['board']['topics'] && empty($context['board']['is_recycle']))
-	{
-		echo '
 					<div id="redirect_address_div">
 						<dl class="settings">
 							<dt>
@@ -557,7 +544,8 @@ function template_modify_board()
 					</div>';
 
 	if (!empty($context['board']['is_recycle']))
-		echo '<div class="information">', $txt['mboards_recycle_disabled_delete'], '</div>';
+		echo '
+					<div class="noticebox">', $txt['mboards_recycle_disabled_delete'], '</div>';
 
 	echo '
 					<input type="hidden" name="rid" value="', $context['redirect_location'], '" />
@@ -579,7 +567,7 @@ function template_modify_board()
 
 	if (!isset($context['board']['is_new']) && empty($context['board']['is_recycle']))
 		echo '
-					<span', $context['board']['is_recycle'] ? ' style="visibility:hidden">' : '>', '<input type="submit" name="delete" value="', $txt['mboards_delete_board'], '" onclick="return confirm(\'', $txt['boardConfirm'], '\');"', ' class="button_submit" /></span>';
+					<input type="submit" name="delete" value="', $txt['mboards_delete_board'], '" onclick="return confirm(\'', $txt['boardConfirm'], '\');"', ' class="button_submit" />';
 	echo '
 				</div>
 			</div>

+ 2 - 2
Themes/default/ManageLanguages.template.php

@@ -459,10 +459,10 @@ function template_add_language()
 		';
 
 	// Had some results?
-	if (!empty($context['smf_languages']))
+	if (!empty($context['smf_languages']['rows']))
 	{
 		echo '
-			<div class="information">', $txt['add_language_smf_found'], '</div>';
+			<div class="cat_bar"><h3 class="catbg">', $txt['add_language_found_title'], '</div><div class="information">', $txt['add_language_smf_found'], '</div>';
 
 		template_show_list('smf_languages');
 	}

+ 10 - 0
Themes/default/ManageNews.template.php

@@ -455,4 +455,14 @@ function template_email_members_send()
 	// ]]></script>';
 }
 
+function template_news_lists()
+{
+	global $context, $txt;
+
+	if (!empty($context['saved_successful']))
+		echo '
+					<div class="infobox">', $txt['settings_saved'], '</div>';
+
+	template_show_list('news_lists');
+}
 ?>

+ 1 - 1
Themes/default/Post.template.php

@@ -358,7 +358,7 @@ function template_main()
 					', template_control_richedit($context['post_box_name'], 'smileyBox_message', 'bbcBox_message');
 
 	// If we're editing and displaying edit details, show a box where they can say why
-	if (isset($context['editing']) && $settings['show_last_edit'])
+	if (isset($context['editing']) && $settings['show_modify'])
 		echo '
 					<dl>
 						<dt class="clear">

+ 44 - 2
Themes/default/Profile.template.php

@@ -87,6 +87,48 @@ function template_profile_popup()
 		</div>';
 }
 
+function template_alerts_popup()
+{
+	global $context, $txt, $scripturl, $settings;
+
+	// Unlike almost every other template, this is designed to be included into the HTML directly via $().load()
+	echo '
+		<div class="alert_bar">
+			<div class="alerts_opts floatright">
+				<a href="' . $scripturl . '?action=pm;sa=send">', $txt['mark_alerts_read'], '</a>
+				| <a href="', $scripturl, '?action=pm;sa=settings">', $txt['alert_settings'], '</a>
+			</div>
+			<div class="alerts_box floatleft">
+				', $txt['unread_alerts'], '
+				| <a href="', $scripturl, '?action=pm">', $txt['all_alerts'], '</a>
+			</div>
+		</div>
+		<div class="alerts_unread">';
+
+	if (empty($context['unread_alerts']))
+	{
+		echo '
+			<div class="no_unread">', $txt['alerts_no_unread'], '</div>';
+	}
+	else
+	{
+		foreach ($context['unread_alerts'] as $id_alert => $details)
+		{
+			echo '
+			<div class="unread">
+				<div class="avatar floatleft">', !empty($details['sender']) ? $details['sender']['avatar']['image'] : '', '</div>
+				<div class="details floatleft">
+					', !empty($details['icon']) ? $details['icon'] : '', $details['text'], ' - ', $details['time'], '
+				</div>
+				<br class="clear" />
+			</div>';
+		}	
+	}
+
+	echo '
+		</div>';
+}
+
 // This template displays users details without any option to edit them.
 function template_summary()
 {
@@ -107,12 +149,12 @@ function template_summary()
 	// What about if we allow email only via the forum??
 	if ($context['member']['show_email'] === 'yes' || $context['member']['show_email'] === 'no_through_forum' || $context['member']['show_email'] === 'yes_permission_override' && $context['can_send_email'])
 		echo '
-					<li><a href="', $scripturl, '?action=emailuser;sa=email;uid=', $context['member']['id'], '" title="', $context['member']['show_email'] == 'yes' || $context['member']['show_email'] == 'yes_permission_override' ? $context['member']['email'] : '', '" rel="nofollow"><img src="', $settings['images_url'], '/email_sm.png" alt="', $txt['email'], '" class="centericon" /></a></li>';
+					<li><a href="', $scripturl, '?action=emailuser;sa=email;uid=', $context['member']['id'], '" title="', $context['member']['show_email'] == 'yes' || $context['member']['show_email'] == 'yes_permission_override' ? $context['member']['email'] : '', '" rel="nofollow"><img src="', $settings['images_url'], '/email_sm.png" alt="', $txt['email'], '" /></a></li>';
 
 	// Don't show an icon if they haven't specified a website.
 	if ($context['member']['website']['url'] !== '' && !isset($context['disabled_fields']['website']))
 		echo '
-					<li><a href="', $context['member']['website']['url'], '" title="' . $context['member']['website']['title'] . '" target="_blank" class="new_win">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/www_sm.png" alt="' . $context['member']['website']['title'] . '" class="centericon" />' : $txt['www']), '</a></li>';
+					<li><a href="', $context['member']['website']['url'], '" title="' . $context['member']['website']['title'] . '" target="_blank" class="new_win">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/www_sm.png" alt="' . $context['member']['website']['title'] . '" />' : $txt['www']), '</a></li>';
 
 	// Are there any custom profile fields for the summary?
 	if (!empty($context['custom_fields']))

+ 2 - 1
Themes/default/Register.template.php

@@ -479,7 +479,7 @@ function template_verification_sound()
 	</head>
 	<body style="margin: 1ex;">
 		<div class="windowbg description" style="text-align: center;">';
-	if (isBrowser('is_ie'))
+	if (isBrowser('is_ie') || isBrowser('is_ie11'))
 		echo '
 			<object classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" type="audio/x-wav">
 				<param name="AutoStart" value="1" />
@@ -490,6 +490,7 @@ function template_verification_sound()
 			<object type="audio/x-wav" data="', $context['verification_sound_href'], '">
 				<a href="', $context['verification_sound_href'], '" rel="nofollow">', $context['verification_sound_href'], '</a>
 			</object>';
+
 	echo '
 		<br />
 		<a href="', $context['verification_sound_href'], ';sound" rel="nofollow">', $txt['visual_verification_sound_again'], '</a><br />

+ 9 - 10
Themes/default/css/index.css

@@ -1147,7 +1147,6 @@ img.sort, .sort {
 	max-width: 70%;
 }
 #profile_menu .profile_username {
-	max-width: 95%;
 	overflow: hidden;
 	font-size: 150%;
 }
@@ -1161,26 +1160,26 @@ img.sort, .sort {
 #profile_menu .profile_user_links li img {
 	margin-bottom: -1px;
 }
-#pm_menu .pm_unread {
+#pm_menu .pm_unread, #alerts_menu .alerts_unread {
 	margin-top: 2px;
 	padding-top: 3px;
 	border-top: 1px solid #ddd;
 	clear: both;
 }
-#pm_menu .pm_unread .no_unread {
+#pm_menu .no_unread, #alerts_menu .no_unread {
 	padding-top: 3px;
 	text-align: center;
 }
-#pm_menu .pm_unread .windowbg, #pm_menu .pm_unread .windowbg2 {
+#pm_menu .windowbg, #pm_menu .windowbg2, #alerts_menu .windowbg, #alerts_menu .windowbg2 {
 	clear: both;
 	padding: 2px;
 }
-#pm_menu .pm_unread div > .avatar {
+#pm_menu .pm_unread div > .avatar, #alerts_menu .alerts_unread div > .avatar {
 	width: 40px;
 	height: 40px;
 	margin: 1px 6px 0 1px;
 }
-#pm_menu .pm_unread .avatar img {
+#pm_menu .pm_unread .avatar img, #alerts_menu .alerts_unread .avatar img {
 	width: 100%;
 	height: 100%;
 	max-width: 40px;
@@ -1189,16 +1188,16 @@ img.sort, .sort {
 #pm_menu .unread .subject {
 	font-weight: bold;
 }
-#pm_menu .unread {
+#pm_menu .unread, #alerts_menu .unread {
 	border-bottom: 1px solid #ddd;
 }
-#pm_menu .unread:hover {
+#pm_menu .unread:hover, #alerts_menu .unread:hover  {
 	background: #eee;
 }
-#pm_menu .unread:last-of-type {
+#pm_menu .unread:last-of-type, #alerts_menu .unread:last-of-type {
 	border-bottom: 1px solid transparent;
 }
-#pm_menu .details {
+#pm_menu .details, #alerts_menu .details {
 	max-width: 80%;
 }
 /* This CSS is for adding top level subsection indicators, just in case anyone wants them. */

+ 8 - 0
Themes/default/index.template.php

@@ -201,6 +201,14 @@ function template_body_above()
 				</li>';
 		}
 
+		// Thirdly, alerts
+		echo '
+				<li>
+					<a href="', $scripturl, '?action=alerts"', !empty($context['self_alerts']) ? ' class="active"' : '', ' id="alerts_menu_top">', $txt['alerts'], !empty($context['user']['alerts']) ? ' <span class="amt">' . $context['user']['alerts'] . '</span>' : '', '</a>
+					<div id="alerts_menu" class="top_menu"></div>
+				</li>';
+
+		// And now we're done.
 		echo '
 			</ul>';
 	}

+ 14 - 0
Themes/default/languages/Alerts.english.php

@@ -0,0 +1,14 @@
+<?php
+// Version: 2.1 Alpha 1; Alerts
+
+$txt['topic_na'] = '(private topic)';
+$txt['board_na'] = '(private board)';
+
+$txt['unread_alerts'] = 'Unread';
+$txt['all_alerts'] = 'All alerts';
+$txt['mark_alerts_read'] = 'Mark read';
+$txt['alert_settings'] = 'Settings';
+$txt['alerts_no_unread'] = 'No unread alerts.';
+
+$txt['alert_msg_like'] = '{member_link} liked your post {msg_msg}';
+?>

+ 0 - 2
Themes/default/languages/Errors.english.php

@@ -85,8 +85,6 @@ $txt['cannot_manage_boards'] = 'You are not allowed to manage boards and categor
 $txt['cannot_manage_membergroups'] = 'You don\'t have permission to modify or assign membergroups.';
 $txt['cannot_manage_permissions'] = 'You don\'t have permission to manage permissions.';
 $txt['cannot_manage_smileys'] = 'You\'re not allowed to manage smileys and message icons.';
-$txt['cannot_mark_any_notify'] = 'You don\'t have the permissions necessary to get notifications from this topic.';
-$txt['cannot_mark_notify'] = 'Sorry, but you are not permitted to request notifications from this board.';
 $txt['cannot_merge_any'] = 'You aren\'t allowed to merge topics on one of the selected board(s).';
 $txt['cannot_moderate_forum'] = 'You are not allowed to moderate this forum.';
 $txt['cannot_moderate_board'] = 'You are not allowed to moderate this board.';

+ 0 - 2
Themes/default/languages/ManageBoards.english.php

@@ -72,8 +72,6 @@ $txt['mboards_redirect_url_desc'] = 'For example: &quot;http://www.simplemachine
 $txt['mboards_redirect_reset'] = 'Reset redirect count';
 $txt['mboards_redirect_reset_desc'] = 'Selecting this will reset the redirection count for this board to zero.';
 $txt['mboards_current_redirects'] = 'Currently: %1$s';
-$txt['mboards_redirect_disabled'] = 'Note: Board must be empty of topics to enable this option.';
-$txt['mboards_redirect_disabled_recycle'] = 'Note: You cannot set the recycle bin board to be a redirection board.';
 
 $txt['mboards_order_before'] = 'Before';
 $txt['mboards_order_child_of'] = 'Sub-board of';

+ 0 - 6
Themes/default/languages/ManagePermissions.english.php

@@ -288,12 +288,6 @@ $txt['permissionhelp_post_unapproved_topics'] = 'This permission allows a user t
 $txt['permissionname_post_unapproved_attachments'] = 'Post attachments, but hide until approved';
 $txt['permissionhelp_post_unapproved_attachments'] = 'This permission allows a user to attach files to their posts. The attached files will then require approval before being shown to other users.';
 
-$txt['permissiongroup_notification'] = 'Notifications';
-$txt['permissionname_mark_any_notify'] = 'Request notification on replies';
-$txt['permissionhelp_mark_any_notify'] = 'This feature allows users to receive a notification whenever someone replies to a topic they subscribed to.';
-$txt['permissionname_mark_notify'] = 'Request notification on new topics';
-$txt['permissionhelp_mark_notify'] = 'Notification on new topics is a feature that allows a user to receive an email every time a new topic is created on the board they subscribe to.';
-
 $txt['permissiongroup_attachment'] = 'Attachments';
 $txt['permissionname_view_attachments'] = 'View attachments';
 $txt['permissionhelp_view_attachments'] = 'Attachments are files that are attached to posted messages. This feature can be enabled and configured in \'Attachments and avatars\'. Since attachments are not directly accessed, you can protect them from being downloaded by users that don\'t have this permission.';

+ 3 - 2
Themes/default/languages/ManageSettings.english.php

@@ -301,7 +301,8 @@ $txt['add_language'] = 'Add Language';
 $txt['add_language_smf'] = 'Download from Simple Machines';
 $txt['add_language_smf_browse'] = 'Type name of language to search for or leave blank to search for all.';
 $txt['add_language_smf_install'] = 'Install';
-$txt['add_language_smf_found'] = 'The following languages were found. Click the install link next to the language you wish to install, you will then be taken to the package manager to install.';
+$txt['add_language_found_title'] = 'Found Languages';
+$txt['add_language_smf_found'] = 'The following languages were found. Click the install link next to the language you wish to install. You will then be taken to the package manager to install.';
 $txt['add_language_error_no_response'] = 'The Simple Machines site is not responding. Please try again later.';
 $txt['add_language_error_no_files'] = 'No files could be found.';
 $txt['add_language_smf_desc'] = 'Description';
@@ -334,7 +335,7 @@ $txt['languages_download_filename'] = 'File Name';
 $txt['languages_download_dest'] = 'Destination';
 $txt['languages_download_writable'] = 'Writable';
 $txt['languages_download_version'] = 'Version';
-$txt['languages_download_older'] = 'You have a newer version of this file installed, overwriting is not recommended.';
+$txt['languages_download_older'] = 'You have a newer version of this file installed. Overwriting is not recommended.';
 $txt['languages_download_exists'] = 'Already Exists';
 $txt['languages_download_exists_same'] = 'Identical';
 $txt['languages_download_exists_different'] = 'Different';

+ 2 - 2
Themes/default/languages/Packages.english.php

@@ -52,8 +52,8 @@ $txt['remove'] = 'Remove';
 $txt['package_type'] = 'Package Type';
 $txt['archiving'] = 'Archiving';
 $txt['extracting'] = 'Extracting';
-$txt['avatars_extracted'] = 'The avatars have been installed, you should now be able to use them.';
-$txt['language_extracted'] = 'The language pack has been installed, you can now enable its use in the language settings area of your admin control panel.';
+$txt['avatars_extracted'] = 'The avatars have been installed. You should now be able to use them.';
+$txt['language_extracted'] = 'The language pack has been installed. You can now enable its use in the language settings area of your admin control panel.';
 
 $txt['mod_name'] = 'Mod Name';
 $txt['mod_version'] = 'Version';

+ 0 - 2
Themes/default/languages/Reports.english.php

@@ -31,8 +31,6 @@ $txt['board_perms_name_delete_replies'] = 'Delete replies to own topics';
 $txt['board_perms_name_lock_any'] = 'Lock any topic';
 $txt['board_perms_name_lock_own'] = 'Lock own topic';
 $txt['board_perms_name_make_sticky'] = 'Make topics sticky';
-$txt['board_perms_name_mark_any_notify'] = 'Request notification on any topic';
-$txt['board_perms_name_mark_notify'] = 'Request notification on own topics';
 $txt['board_perms_name_merge_any'] = 'Merge topics';
 $txt['board_perms_name_moderate_board'] = 'Moderate the board';
 $txt['board_perms_name_modify_any'] = 'Modify any post';

+ 2 - 0
Themes/default/languages/index.english.php

@@ -740,6 +740,8 @@ $txt['split_reset_selection'] = 'reset selection';
 $txt['modify_cancel'] = 'Cancel';
 $txt['mark_read_short'] = 'Mark Read';
 
+$txt['alerts'] = 'Alerts';
+
 $txt['pm_short'] = 'My Messages';
 $txt['pm_menu_read'] = 'Read your messages';
 $txt['pm_menu_send'] = 'Send a message';

+ 2 - 0
Themes/default/scripts/script.js

@@ -14,6 +14,8 @@ var is_safari = ua.indexOf('applewebkit') != -1 && !is_chrome;
 var is_webkit = ua.indexOf('applewebkit') != -1;
 
 var is_ie = ua.indexOf('msie') != -1 && !is_opera;
+// Stupid Microsoft...
+var is_ie11 = ua.indexOf('trident') != -1 && ua.indexOf('gecko') != -1;
 var is_iphone = ua.indexOf('iphone') != -1 || ua.indexOf('ipod') != -1;
 var is_android = ua.indexOf('android') != -1;
 

+ 21 - 24
other/install_2-1_mysql.sql

@@ -149,8 +149,6 @@ INSERT INTO {$db_prefix}board_permissions
 VALUES (-1, 1, 'poll_view'),
 	(0, 1, 'remove_own'),
 	(0, 1, 'lock_own'),
-	(0, 1, 'mark_any_notify'),
-	(0, 1, 'mark_notify'),
 	(0, 1, 'modify_own'),
 	(0, 1, 'poll_add_own'),
 	(0, 1, 'poll_edit_own'),
@@ -192,8 +190,6 @@ VALUES (-1, 1, 'poll_view'),
 	(2, 1, 'report_any'),
 	(2, 1, 'lock_own'),
 	(2, 1, 'send_topic'),
-	(2, 1, 'mark_any_notify'),
-	(2, 1, 'mark_notify'),
 	(2, 1, 'delete_own'),
 	(2, 1, 'modify_own'),
 	(2, 1, 'make_sticky'),
@@ -227,8 +223,6 @@ VALUES (-1, 1, 'poll_view'),
 	(3, 1, 'report_any'),
 	(3, 1, 'lock_own'),
 	(3, 1, 'send_topic'),
-	(3, 1, 'mark_any_notify'),
-	(3, 1, 'mark_notify'),
 	(3, 1, 'delete_own'),
 	(3, 1, 'modify_own'),
 	(3, 1, 'make_sticky'),
@@ -245,8 +239,6 @@ VALUES (-1, 1, 'poll_view'),
 	(-1, 2, 'poll_view'),
 	(0, 2, 'remove_own'),
 	(0, 2, 'lock_own'),
-	(0, 2, 'mark_any_notify'),
-	(0, 2, 'mark_notify'),
 	(0, 2, 'modify_own'),
 	(0, 2, 'poll_view'),
 	(0, 2, 'poll_vote'),
@@ -284,8 +276,6 @@ VALUES (-1, 1, 'poll_view'),
 	(2, 2, 'report_any'),
 	(2, 2, 'lock_own'),
 	(2, 2, 'send_topic'),
-	(2, 2, 'mark_any_notify'),
-	(2, 2, 'mark_notify'),
 	(2, 2, 'delete_own'),
 	(2, 2, 'modify_own'),
 	(2, 2, 'make_sticky'),
@@ -319,8 +309,6 @@ VALUES (-1, 1, 'poll_view'),
 	(3, 2, 'report_any'),
 	(3, 2, 'lock_own'),
 	(3, 2, 'send_topic'),
-	(3, 2, 'mark_any_notify'),
-	(3, 2, 'mark_notify'),
 	(3, 2, 'delete_own'),
 	(3, 2, 'modify_own'),
 	(3, 2, 'make_sticky'),
@@ -337,8 +325,6 @@ VALUES (-1, 1, 'poll_view'),
 	(-1, 3, 'poll_view'),
 	(0, 3, 'remove_own'),
 	(0, 3, 'lock_own'),
-	(0, 3, 'mark_any_notify'),
-	(0, 3, 'mark_notify'),
 	(0, 3, 'modify_own'),
 	(0, 3, 'poll_view'),
 	(0, 3, 'poll_vote'),
@@ -372,8 +358,6 @@ VALUES (-1, 1, 'poll_view'),
 	(2, 3, 'report_any'),
 	(2, 3, 'lock_own'),
 	(2, 3, 'send_topic'),
-	(2, 3, 'mark_any_notify'),
-	(2, 3, 'mark_notify'),
 	(2, 3, 'delete_own'),
 	(2, 3, 'modify_own'),
 	(2, 3, 'make_sticky'),
@@ -407,8 +391,6 @@ VALUES (-1, 1, 'poll_view'),
 	(3, 3, 'report_any'),
 	(3, 3, 'lock_own'),
 	(3, 3, 'send_topic'),
-	(3, 3, 'mark_any_notify'),
-	(3, 3, 'mark_notify'),
 	(3, 3, 'delete_own'),
 	(3, 3, 'modify_own'),
 	(3, 3, 'make_sticky'),
@@ -423,8 +405,6 @@ VALUES (-1, 1, 'poll_view'),
 	(3, 3, 'post_attachment'),
 	(3, 3, 'view_attachments'),
 	(-1, 4, 'poll_view'),
-	(0, 4, 'mark_any_notify'),
-	(0, 4, 'mark_notify'),
 	(0, 4, 'poll_view'),
 	(0, 4, 'poll_vote'),
 	(0, 4, 'report_any'),
@@ -450,8 +430,6 @@ VALUES (-1, 1, 'poll_view'),
 	(2, 4, 'report_any'),
 	(2, 4, 'lock_own'),
 	(2, 4, 'send_topic'),
-	(2, 4, 'mark_any_notify'),
-	(2, 4, 'mark_notify'),
 	(2, 4, 'delete_own'),
 	(2, 4, 'modify_own'),
 	(2, 4, 'make_sticky'),
@@ -485,8 +463,6 @@ VALUES (-1, 1, 'poll_view'),
 	(3, 4, 'report_any'),
 	(3, 4, 'lock_own'),
 	(3, 4, 'send_topic'),
-	(3, 4, 'mark_any_notify'),
-	(3, 4, 'mark_notify'),
 	(3, 4, 'delete_own'),
 	(3, 4, 'modify_own'),
 	(3, 4, 'make_sticky'),
@@ -1246,6 +1222,7 @@ CREATE TABLE {$db_prefix}members (
   instant_messages smallint(5) NOT NULL default 0,
   unread_messages smallint(5) NOT NULL default 0,
   new_pm tinyint(3) unsigned NOT NULL default '0',
+  alerts int(10) unsigned NOT NULL default '0',
   buddy_list text NOT NULL,
   pm_ignore_list varchar(255) NOT NULL default '',
   pm_prefs mediumint(8) NOT NULL default '0',
@@ -2126,6 +2103,26 @@ INSERT INTO {$db_prefix}topics
 VALUES (1, 1, 1, 1, 0, 0);
 # --------------------------------------------------------
 
+#
+# Table structure for table `user_alerts`
+#
+
+CREATE TABLE {$db_prefix}user_alerts (
+  id_alert int(10) unsigned NOT NULL auto_increment,
+  alert_time int(10) unsigned NOT NULL default '0',
+  id_member mediumint(10) unsigned NOT NULL default '0',
+  id_member_started mediumint(10) unsigned NOT NULL default '0',
+  member_name varchar(255) NOT NULL default '',
+  content_type varchar(255) NOT NULL default '',
+  content_id int(10) unsigned NOT NULL default '0',
+  content_action varchar(255) NOT NULL default '',
+  is_read tinyint(3) unsigned NOT NULL default '0',
+  extra text NOT NULL,
+  PRIMARY KEY (id_alert),
+  KEY id_member (id_member),
+  KEY alert_time (alert_time)
+) ENGINE=MyISAM;
+
 #
 # Table structure for table `user_drafts`
 #

+ 31 - 24
other/install_2-1_postgresql.sql

@@ -327,8 +327,6 @@ CREATE TABLE {$db_prefix}board_permissions (
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 1, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'remove_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'lock_own');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'poll_add_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'poll_edit_own');
@@ -370,8 +368,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'make_sticky');
@@ -405,8 +401,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'make_sticky');
@@ -423,8 +417,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 2, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'remove_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'lock_own');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'poll_vote');
@@ -462,8 +454,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'make_sticky');
@@ -497,8 +487,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'make_sticky');
@@ -515,8 +503,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 3, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'remove_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'lock_own');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'poll_vote');
@@ -550,8 +536,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'make_sticky');
@@ -585,8 +569,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'make_sticky');
@@ -601,8 +583,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'post_attachment');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'view_attachments');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 4, 'poll_view');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'poll_vote');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'report_any');
@@ -628,8 +608,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'make_sticky');
@@ -663,8 +641,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'make_sticky');
@@ -1649,6 +1625,7 @@ CREATE TABLE {$db_prefix}members (
   instant_messages smallint NOT NULL default 0,
   unread_messages smallint NOT NULL default 0,
   new_pm smallint NOT NULL default '0',
+  alerts int NOT NULL default '0',
   buddy_list text NOT NULL,
   pm_ignore_list varchar(255) NOT NULL,
   pm_prefs int NOT NULL default '0',
@@ -2673,6 +2650,36 @@ INSERT INTO {$db_prefix}topics
 VALUES (1, 1, 1, 1, 0, 0);
 # --------------------------------------------------------
 
+#
+# Sequence for table `user_alerts`
+#
+
+CREATE SEQUENCE {$db_prefix}user_alerts_seq;
+
+#
+# Table structure for table `user_alerts`
+#
+
+CREATE TABLE {$db_prefix}user_alerts (
+  id_alert int default nextval('{$db_prefix}user_alerts_seq'),
+  alert_time int NOT NULL default '0',
+  id_member int NOT NULL default '0',
+  id_member_started int NOT NULL default '0',
+  member_name varchar(255) NOT NULL default '',
+  content_type varchar(255) NOT NULL default '',
+  content_id int NOT NULL default '0',
+  content_action varchar(255) NOT NULL default '',
+  is_read smallint NOT NULL default '0',
+  extra text NOT NULL,
+  PRIMARY KEY (id_alert)
+);
+
+#
+# Indexes for table `user_alerts`
+#
+
+CREATE INDEX {$db_prefix}user_alerts_id_member ON {$db_prefix}user_alerts (id_member);
+CREATE INDEX {$db_prefix}user_alerts_alert_time ON {$db_prefix}user_alerts (alert_time);
 
 #
 # Sequence for table `user_drafts`

+ 26 - 24
other/install_2-1_sqlite.sql

@@ -159,8 +159,6 @@ BEGIN TRANSACTION;
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 1, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'remove_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'lock_own');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'poll_add_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'poll_edit_own');
@@ -202,8 +200,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'make_sticky');
@@ -237,8 +233,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'make_sticky');
@@ -255,8 +249,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 2, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'remove_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'lock_own');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'poll_vote');
@@ -294,8 +286,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'make_sticky');
@@ -329,8 +319,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'make_sticky');
@@ -347,8 +335,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 3, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'remove_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'lock_own');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'poll_vote');
@@ -382,8 +368,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'make_sticky');
@@ -417,8 +401,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'make_sticky');
@@ -433,8 +415,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'post_attachment');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'view_attachments');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 4, 'poll_view');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'poll_vote');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'report_any');
@@ -460,8 +440,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'make_sticky');
@@ -495,8 +473,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'make_sticky');
@@ -1350,6 +1326,7 @@ CREATE TABLE {$db_prefix}members (
   instant_messages smallint NOT NULL default 0,
   unread_messages smallint NOT NULL default 0,
   new_pm smallint NOT NULL default '0',
+  alerts int NOT NULL default '0',
   buddy_list text NOT NULL,
   pm_ignore_list varchar(255) NOT NULL,
   pm_prefs int NOT NULL default '0',
@@ -2287,6 +2264,31 @@ INSERT INTO {$db_prefix}topics
 VALUES (1, 1, 1, 1, 0, 0);
 # --------------------------------------------------------
 
+#
+# Table structure for table `user_alerts`
+#
+
+CREATE TABLE {$db_prefix}user_alerts (
+  id_alert int primary key,
+  alert_time int unsigned NOT NULL default '0',
+  id_member int unsigned NOT NULL default '0',
+  id_member_started int unsigned NOT NULL default '0',
+  member_name varchar(255) NOT NULL default '',
+  content_type varchar(255) NOT NULL default '',
+  content_id int unsigned NOT NULL default '0',
+  content_action varchar(255) NOT NULL default '',
+  is_read smallint unsigned NOT NULL default '0',
+  extra text NOT NULL,
+  PRIMARY KEY (id_alert)
+);
+
+#
+# Indexes for table `user_alerts`
+#
+
+CREATE INDEX {$db_prefix}user_alerts_id_member ON {$db_prefix}user_alerts (id_member);
+CREATE INDEX {$db_prefix}user_alerts_alert_time ON {$db_prefix}user_alerts (alert_time);
+
 #
 # Table structure for table `user_drafts`
 #

+ 26 - 24
other/install_2-1_sqlite3.sql

@@ -159,8 +159,6 @@ BEGIN TRANSACTION;
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 1, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'remove_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'lock_own');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'poll_add_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 1, 'poll_edit_own');
@@ -202,8 +200,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 1, 'make_sticky');
@@ -237,8 +233,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 1, 'make_sticky');
@@ -255,8 +249,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 2, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'remove_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'lock_own');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 2, 'poll_vote');
@@ -294,8 +286,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 2, 'make_sticky');
@@ -329,8 +319,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 2, 'make_sticky');
@@ -347,8 +335,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 3, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'remove_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'lock_own');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 3, 'poll_vote');
@@ -382,8 +368,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 3, 'make_sticky');
@@ -417,8 +401,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'make_sticky');
@@ -433,8 +415,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'post_attachment');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 3, 'view_attachments');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (-1, 4, 'poll_view');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'poll_view');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'poll_vote');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (0, 4, 'report_any');
@@ -460,8 +440,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (2, 4, 'make_sticky');
@@ -495,8 +473,6 @@ INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VAL
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'report_any');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'lock_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'send_topic');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'mark_any_notify');
-INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'mark_notify');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'delete_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'modify_own');
 INSERT INTO {$db_prefix}board_permissions (id_group, id_profile, permission) VALUES (3, 4, 'make_sticky');
@@ -1350,6 +1326,7 @@ CREATE TABLE {$db_prefix}members (
   instant_messages smallint NOT NULL default 0,
   unread_messages smallint NOT NULL default 0,
   new_pm smallint NOT NULL default '0',
+  alerts int NOT NULL default '0',
   buddy_list text NOT NULL,
   pm_ignore_list varchar(255) NOT NULL,
   pm_prefs int NOT NULL default '0',
@@ -2287,6 +2264,31 @@ INSERT INTO {$db_prefix}topics
 VALUES (1, 1, 1, 1, 0, 0);
 # --------------------------------------------------------
 
+#
+# Table structure for table `user_alerts`
+#
+
+CREATE TABLE {$db_prefix}user_alerts (
+  id_alert int primary key,
+  alert_time int unsigned NOT NULL default '0',
+  id_member int unsigned NOT NULL default '0',
+  id_member_started int unsigned NOT NULL default '0',
+  member_name varchar(255) NOT NULL default '',
+  content_type varchar(255) NOT NULL default '',
+  content_id int unsigned NOT NULL default '0',
+  content_action varchar(255) NOT NULL default '',
+  is_read smallint unsigned NOT NULL default '0',
+  extra text NOT NULL,
+  PRIMARY KEY (id_alert)
+);
+
+#
+# Indexes for table `user_alerts`
+#
+
+CREATE INDEX {$db_prefix}user_alerts_id_member ON {$db_prefix}user_alerts (id_member);
+CREATE INDEX {$db_prefix}user_alerts_alert_time ON {$db_prefix}user_alerts (alert_time);
+
 #
 # Table structure for table `user_drafts`
 #

+ 31 - 0
other/upgrade_2-1_mysql.sql

@@ -242,6 +242,32 @@ ALTER TABLE {$db_prefix}categories
 ADD COLUMN description text NOT NULL;
 ---#
 
+/******************************************************************************/
+--- Adding support for alerts
+/******************************************************************************/
+---# Adding the count to the members table...
+ALTER TABLE {$db_prefix}members
+ADD COLUMN alerts int(10) unsigned NOT NULL default '0';
+---#
+
+---# Adding the new table for alerts.
+CREATE TABLE {$db_prefix}user_alerts (
+  id_alert int(10) unsigned NOT NULL auto_increment,
+  alert_time int(10) unsigned NOT NULL default '0',
+  id_member mediumint(10) unsigned NOT NULL default '0',
+  id_member_started mediumint(10) unsigned NOT NULL default '0',
+  member_name varchar(255) NOT NULL default '',
+  content_type varchar(255) NOT NULL default '',
+  content_id int(10) unsigned NOT NULL default '0',
+  content_action varchar(255) NOT NULL default '',
+  is_read tinyint(3) unsigned NOT NULL default '0',
+  extra text NOT NULL,
+  PRIMARY KEY (id_alert),
+  KEY id_member (id_member),
+  KEY alert_time (alert_time)
+) ENGINE=MyISAM;
+---#
+
 /******************************************************************************/
 --- Adding support for topic unwatch
 /******************************************************************************/
@@ -556,6 +582,11 @@ SET permission = 'profile_view'
 WHERE permission = 'profile_view_any';
 ---#
 
+---# Removing the old notification permissions
+DELETE FROM {$db_prefix}board_permissions
+WHERE permission = 'mark_notify' OR permission = 'mark_any_notify';
+---#
+
 ---# Adding "profile_password_own"
 ---{
 $inserts = array();

+ 34 - 0
other/upgrade_2-1_postgresql.sql

@@ -306,6 +306,35 @@ upgrade_query("
 ---}
 ---#
 
+/******************************************************************************/
+--- Adding support for alerts
+/******************************************************************************/
+---# Adding the count to the members table...
+ALTER TABLE {$db_prefix}members
+ADD COLUMN alerts int NOT NULL default '0';
+---#
+
+---# Adding the new table for alerts.
+CREATE SEQUENCE {$db_prefix}user_alerts_seq;
+
+CREATE TABLE {$db_prefix}user_alerts (
+  id_alert int default nextval('{$db_prefix}user_alerts_seq'),
+  alert_time int NOT NULL default '0',
+  id_member int NOT NULL default '0',
+  id_member_started int NOT NULL default '0',
+  member_name varchar(255) NOT NULL default '',
+  content_type varchar(255) NOT NULL default '',
+  content_id int NOT NULL default '0',
+  content_action varchar(255) NOT NULL default '',
+  is_read smallint NOT NULL default '0',
+  extra text NOT NULL,
+  PRIMARY KEY (id_alert)
+);
+
+CREATE INDEX {$db_prefix}user_alerts_id_member ON {$db_prefix}user_alerts (id_member);
+CREATE INDEX {$db_prefix}user_alerts_alert_time ON {$db_prefix}user_alerts (alert_time);
+---#
+
 /******************************************************************************/
 --- Adding support for topic unwatch
 /******************************************************************************/
@@ -632,6 +661,11 @@ SET permission = 'profile_view'
 WHERE permission = 'profile_view_any';
 ---#
 
+---# Removing the old notification permissions
+DELETE FROM {$db_prefix}board_permissions
+WHERE permission = 'mark_notify' OR permission = 'mark_any_notify';
+---#
+
 ---# Adding "profile_password_own"
 ---{
 $inserts = array();

+ 43 - 0
other/upgrade_2-1_sqlite.sql

@@ -285,6 +285,44 @@ $smcFunc['db_alter_table']('{db_prefix}log_topics', array(
 ---}
 ---#
 
+/******************************************************************************/
+--- Adding support for alerts
+/******************************************************************************/
+---# Adding the count to the members table...
+---{
+$smcFunc['db_alter_table']('{db_prefix}members', array(
+	'add' => array(
+		'alerts' => array(
+			'name' => 'ualerts',
+			'null' => false,
+			'default' => 0,
+			'type' => 'int',
+			'auto' => false,
+		),
+	)
+));
+---}
+---#
+
+---# Adding the new table for alerts.
+CREATE TABLE {$db_prefix}user_alerts (
+  id_alert int primary key,
+  alert_time int unsigned NOT NULL default '0',
+  id_member int unsigned NOT NULL default '0',
+  id_member_started int unsigned NOT NULL default '0',
+  member_name varchar(255) NOT NULL default '',
+  content_type varchar(255) NOT NULL default '',
+  content_id int unsigned NOT NULL default '0',
+  content_action varchar(255) NOT NULL default '',
+  is_read smallint unsigned NOT NULL default '0',
+  extra text NOT NULL,
+  PRIMARY KEY (id_alert)
+);
+
+CREATE INDEX {$db_prefix}user_alerts_id_member ON {$db_prefix}user_alerts (id_member);
+CREATE INDEX {$db_prefix}user_alerts_alert_time ON {$db_prefix}user_alerts (alert_time);
+---#
+
 /******************************************************************************/
 --- Adding support for topic unwatch
 /******************************************************************************/
@@ -618,6 +656,11 @@ SET permission = 'profile_view'
 WHERE permission = 'profile_view_any';
 ---#
 
+---# Removing the old notification permissions
+DELETE FROM {$db_prefix}board_permissions
+WHERE permission = 'mark_notify' OR permission = 'mark_any_notify';
+---#
+
 ---# Adding "profile_password_own"
 ---{
 $inserts = array();