aboutsummaryrefslogtreecommitdiff
path: root/mod/notifications
diff options
context:
space:
mode:
Diffstat (limited to 'mod/notifications')
-rw-r--r--mod/notifications/actions/groupsave.php49
-rw-r--r--mod/notifications/actions/save.php43
-rw-r--r--mod/notifications/graphics/icon_notifications_email.gifbin0 -> 1416 bytes
-rw-r--r--mod/notifications/graphics/icon_notifications_site.gifbin0 -> 456 bytes
-rw-r--r--mod/notifications/groups.php46
-rw-r--r--mod/notifications/index.php50
-rw-r--r--mod/notifications/languages/en.php26
-rw-r--r--mod/notifications/manifest.xml16
-rw-r--r--mod/notifications/start.php206
-rw-r--r--mod/notifications/views/default/forms/notificationsettings/groupsave.php111
-rw-r--r--mod/notifications/views/default/forms/notificationsettings/save.php21
-rw-r--r--mod/notifications/views/default/notifications/css.php87
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/collections.php164
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/form.php12
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/forminternals.php337
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/groupsform.php4
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/jsfuncs.php54
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/personal.php73
18 files changed, 1299 insertions, 0 deletions
diff --git a/mod/notifications/actions/groupsave.php b/mod/notifications/actions/groupsave.php
new file mode 100644
index 000000000..2dd2a6db3
--- /dev/null
+++ b/mod/notifications/actions/groupsave.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * Elgg notifications group save
+ *
+ * @package ElggNotifications
+ */
+
+$current_user = elgg_get_logged_in_user_entity();
+
+$guid = (int) get_input('guid', 0);
+if (!$guid || !($user = get_entity($guid))) {
+ forward();
+}
+if (($user->guid != $current_user->guid) && !$current_user->isAdmin()) {
+ forward();
+}
+
+// Get group memberships and condense them down to an array of guids
+$groups = array();
+$options = array(
+ 'relationship' => 'member',
+ 'relationship_guid' => $user->guid,
+ 'types' => 'group',
+ 'limit' => 9999,
+);
+if ($groupmemberships = elgg_get_entities_from_relationship($options)) {
+ foreach($groupmemberships as $groupmembership) {
+ $groups[] = $groupmembership->guid;
+ }
+}
+
+if (!empty($groups)) {
+ global $NOTIFICATION_HANDLERS;
+ foreach ($NOTIFICATION_HANDLERS as $method => $foo) {
+ $subscriptions[$method] = get_input($method.'subscriptions', array());
+ foreach ($groups as $group) {
+ if (in_array($group, $subscriptions[$method])) {
+ add_entity_relationship($user->guid, 'notify'.$method, $group);
+ } else {
+ remove_entity_relationship($user->guid, 'notify'.$method, $group);
+ }
+ }
+ }
+}
+
+system_message(elgg_echo('notifications:subscriptions:success'));
+
+forward(REFERER);
diff --git a/mod/notifications/actions/save.php b/mod/notifications/actions/save.php
new file mode 100644
index 000000000..3fe0001a3
--- /dev/null
+++ b/mod/notifications/actions/save.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Elgg notifications
+ *
+ * @package ElggNotifications
+ */
+
+$current_user = elgg_get_logged_in_user_entity();
+
+$guid = (int) get_input('guid', 0);
+if (!$guid || !($user = get_entity($guid))) {
+ forward();
+}
+if (($user->guid != $current_user->guid) && !$current_user->isAdmin()) {
+ forward();
+}
+
+global $NOTIFICATION_HANDLERS;
+$subscriptions = array();
+foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ $subscriptions[$method] = get_input($method.'subscriptions');
+ $personal[$method] = get_input($method.'personal');
+ $collections[$method] = get_input($method.'collections');
+
+ $metaname = 'collections_notifications_preferences_' . $method;
+ $user->$metaname = $collections[$method];
+ set_user_notification_setting($user->guid, $method, ($personal[$method] == '1') ? true : false);
+ remove_entity_relationships($user->guid, 'notify' . $method, false, 'user');
+}
+
+// Add new ones
+foreach($subscriptions as $key => $subscription) {
+ if (is_array($subscription) && !empty($subscription)) {
+ foreach($subscription as $subscriptionperson) {
+ add_entity_relationship($user->guid, 'notify' . $key, $subscriptionperson);
+ }
+ }
+}
+
+system_message(elgg_echo('notifications:subscriptions:success'));
+
+forward(REFERER);
diff --git a/mod/notifications/graphics/icon_notifications_email.gif b/mod/notifications/graphics/icon_notifications_email.gif
new file mode 100644
index 000000000..038d6e651
--- /dev/null
+++ b/mod/notifications/graphics/icon_notifications_email.gif
Binary files differ
diff --git a/mod/notifications/graphics/icon_notifications_site.gif b/mod/notifications/graphics/icon_notifications_site.gif
new file mode 100644
index 000000000..d12ca08b1
--- /dev/null
+++ b/mod/notifications/graphics/icon_notifications_site.gif
Binary files differ
diff --git a/mod/notifications/groups.php b/mod/notifications/groups.php
new file mode 100644
index 000000000..3347d4054
--- /dev/null
+++ b/mod/notifications/groups.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Elgg notifications plugin group index
+ *
+ * @package ElggNotifications
+ *
+ * @uses $user ElggUser
+ */
+
+if (!isset($user) || !($user instanceof ElggUser)) {
+ $url = 'notifications/group/' . elgg_get_logged_in_user_entity()->username;
+ forward($url);
+}
+
+elgg_set_page_owner_guid($user->guid);
+
+// Set the context to settings
+elgg_set_context('settings');
+
+$title = elgg_echo('notifications:subscriptions:changesettings:groups');
+
+elgg_push_breadcrumb(elgg_echo('settings'), "settings/user/$user->username");
+elgg_push_breadcrumb($title);
+
+// Get the form
+$people = array();
+
+$groupmemberships = elgg_get_entities_from_relationship(array(
+ 'relationship' => 'member',
+ 'relationship_guid' => $user->guid,
+ 'types' => 'group',
+ 'limit' => 9999,
+));
+
+$body = elgg_view_form('notificationsettings/groupsave', array(), array(
+ 'groups' => $groupmemberships,
+ 'user' => $user,
+));
+
+$params = array(
+ 'content' => $body,
+ 'title' => $title,
+);
+$body = elgg_view_layout('one_sidebar', $params);
+
+echo elgg_view_page($title, $body);
diff --git a/mod/notifications/index.php b/mod/notifications/index.php
new file mode 100644
index 000000000..cd1857f04
--- /dev/null
+++ b/mod/notifications/index.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Elgg notifications plugin index
+ *
+ * @package ElggNotifications
+ *
+ * @uses $user ElggUser
+ */
+
+if (!isset($user) || !($user instanceof ElggUser)) {
+ $url = 'notifications/personal/' . elgg_get_logged_in_user_entity()->username;
+ forward($url);
+}
+
+elgg_set_page_owner_guid($user->guid);
+
+// Set the context to settings
+elgg_set_context('settings');
+
+$title = elgg_echo('notifications:subscriptions:changesettings');
+
+elgg_push_breadcrumb(elgg_echo('settings'), "settings/user/$user->username");
+elgg_push_breadcrumb($title);
+
+// Get the form
+$people = array();
+if ($people_ents = elgg_get_entities_from_relationship(array(
+ 'relationship' => 'notify',
+ 'relationship_guid' => $user->guid,
+ 'types' => 'user',
+ 'limit' => 99999,
+ ))) {
+
+ foreach($people_ents as $ent) {
+ $people[] = $ent->guid;
+ }
+}
+
+$body = elgg_view('notifications/subscriptions/form', array(
+ 'people' => $people,
+ 'user' => $user,
+));
+
+$params = array(
+ 'content' => $body,
+ 'title' => $title,
+);
+$body = elgg_view_layout('one_sidebar', $params);
+
+echo elgg_view_page($title, $body);
diff --git a/mod/notifications/languages/en.php b/mod/notifications/languages/en.php
new file mode 100644
index 000000000..0f2ba2304
--- /dev/null
+++ b/mod/notifications/languages/en.php
@@ -0,0 +1,26 @@
+<?php
+
+$english = array(
+
+ 'friends:all' => 'All friends',
+
+ 'notifications:subscriptions:personal:description' => 'Receive notifications when actions are performed on your content',
+ 'notifications:subscriptions:personal:title' => 'Personal notifications',
+
+ 'notifications:subscriptions:friends:title' => 'Friends',
+ 'notifications:subscriptions:friends:description' => 'Below are collections of your friends. Selecting a collection turns on notifications for the users in that collection.',
+ 'notifications:subscriptions:collections:edit' => 'To edit your shared access notifications, click here.',
+
+ 'notifications:subscriptions:changesettings' => 'Notifications',
+ 'notifications:subscriptions:changesettings:groups' => 'Group notifications',
+
+ 'notifications:subscriptions:title' => 'Notifications per user',
+ 'notifications:subscriptions:description' => 'To receive notifications from your friends (on an individual basis) when they create new content, find them below and select the notification method you would like to use.',
+
+ 'notifications:subscriptions:groups:description' => 'To receive notifications when new content is added to a group you are a member of, find it below and select the notification method(s) you would like to use.',
+
+ 'notifications:subscriptions:success' => 'Your notifications settings have been saved.',
+
+);
+
+ add_translation("en", $english);
diff --git a/mod/notifications/manifest.xml b/mod/notifications/manifest.xml
new file mode 100644
index 000000000..205476881
--- /dev/null
+++ b/mod/notifications/manifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Notifications</name>
+ <author>Core developers</author>
+ <version>1.7</version>
+ <category>bundled</category>
+ <description>Elgg notifications plugin</description>
+ <website>http://www.elgg.org/</website>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+ <activate_on_install>true</activate_on_install>
+</plugin_manifest>
diff --git a/mod/notifications/start.php b/mod/notifications/start.php
new file mode 100644
index 000000000..b76b0aa1e
--- /dev/null
+++ b/mod/notifications/start.php
@@ -0,0 +1,206 @@
+<?php
+/**
+ * Elgg notifications plugin
+ *
+ * @package ElggNotifications
+ */
+
+elgg_register_event_handler('init', 'system', 'notifications_plugin_init');
+
+function notifications_plugin_init() {
+
+ elgg_extend_view('css/elgg','notifications/css');
+
+ elgg_register_page_handler('notifications', 'notifications_page_handler');
+
+ elgg_register_event_handler('pagesetup', 'system', 'notifications_plugin_pagesetup');
+
+ // Unset the default notification settings
+ elgg_unregister_plugin_hook_handler('usersettings:save', 'user', 'notification_user_settings_save');
+ elgg_unextend_view('forms/account/settings', 'core/settings/account/notifications');
+
+ // update notifications based on relationships changing
+ elgg_register_event_handler('delete', 'member', 'notifications_relationship_remove');
+ elgg_register_event_handler('delete', 'friend', 'notifications_relationship_remove');
+
+ // update notifications when new friend or access collection membership
+ elgg_register_event_handler('create', 'friend', 'notifications_update_friend_notify');
+ elgg_register_plugin_hook_handler('access:collections:add_user', 'collection', 'notifications_update_collection_notify');
+
+ $actions_base = elgg_get_plugins_path() . 'notifications/actions';
+ elgg_register_action("notificationsettings/save", "$actions_base/save.php");
+ elgg_register_action("notificationsettings/groupsave", "$actions_base/groupsave.php");
+}
+
+/**
+ * Route page requests
+ *
+ * @param array $page Array of url parameters
+ * @return bool
+ */
+function notifications_page_handler($page) {
+
+ gatekeeper();
+ $current_user = elgg_get_logged_in_user_entity();
+
+ // default to personal notifications
+ if (!isset($page[0])) {
+ $page[0] = 'personal';
+ }
+ if (!isset($page[1])) {
+ forward("notifications/{$page[0]}/{$current_user->username}");
+ }
+
+ $user = get_user_by_username($page[1]);
+ if (($user->guid != $current_user->guid) && !$current_user->isAdmin()) {
+ forward();
+ }
+
+ $base = elgg_get_plugins_path() . 'notifications';
+
+ // note: $user passed in
+ switch ($page[0]) {
+ case 'group':
+ require "$base/groups.php";
+ break;
+ case 'personal':
+ require "$base/index.php";
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
+/**
+ * Notification settings sidebar menu
+ *
+ */
+function notifications_plugin_pagesetup() {
+ if (elgg_get_context() == "settings" && elgg_get_logged_in_user_guid()) {
+
+ $user = elgg_get_page_owner_entity();
+ if (!$user) {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ $params = array(
+ 'name' => '2_a_user_notify',
+ 'text' => elgg_echo('notifications:subscriptions:changesettings'),
+ 'href' => "notifications/personal/{$user->username}",
+ );
+ elgg_register_menu_item('page', $params);
+
+ if (elgg_is_active_plugin('groups')) {
+ $params = array(
+ 'name' => '2_group_notify',
+ 'text' => elgg_echo('notifications:subscriptions:changesettings:groups'),
+ 'href' => "notifications/group/{$user->username}",
+ );
+ elgg_register_menu_item('page', $params);
+ }
+ }
+}
+
+/**
+ * Update notifications when a relationship is deleted
+ *
+ * @param string $event
+ * @param string $object_type
+ * @param object $relationship
+ */
+function notifications_relationship_remove($event, $object_type, $relationship) {
+ global $NOTIFICATION_HANDLERS;
+
+ $user_guid = $relationship->guid_one;
+ $object_guid = $relationship->guid_two;
+
+ // loop through all notification types
+ foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ remove_entity_relationship($user_guid, "notify{$method}", $object_guid);
+ }
+}
+
+/**
+ * Turn on notifications for new friends if all friend notifications is on
+ *
+ * @param string $event
+ * @param string $object_type
+ * @param object $relationship
+ */
+function notifications_update_friend_notify($event, $object_type, $relationship) {
+ global $NOTIFICATION_HANDLERS;
+
+ $user_guid = $relationship->guid_one;
+ $friend_guid = $relationship->guid_two;
+
+ $user = get_entity($user_guid);
+
+ // loop through all notification types
+ foreach ($NOTIFICATION_HANDLERS as $method => $foo) {
+ $metaname = 'collections_notifications_preferences_' . $method;
+ $collections_preferences = $user->$metaname;
+ if ($collections_preferences) {
+ if (!empty($collections_preferences) && !is_array($collections_preferences)) {
+ $collections_preferences = array($collections_preferences);
+ }
+ if (is_array($collections_preferences)) {
+ // -1 means all friends is on - should be a define
+ if (in_array(-1, $collections_preferences)) {
+ add_entity_relationship($user_guid, 'notify' . $method, $friend_guid);
+ }
+ }
+ }
+ }
+}
+
+/**
+ * Update notifications for changes in access collection membership.
+ *
+ * This function assumes that only friends can belong to access collections.
+ *
+ * @param string $event
+ * @param string $object_type
+ * @param bool $returnvalue
+ * @param array $params
+ */
+function notifications_update_collection_notify($event, $object_type, $returnvalue, $params) {
+ global $NOTIFICATION_HANDLERS;
+
+ // only update notifications for user owned collections
+ $collection_id = $params['collection_id'];
+ $collection = get_access_collection($collection_id);
+ $user = get_entity($collection->owner_guid);
+ if (!($user instanceof ElggUser)) {
+ return $returnvalue;
+ }
+
+ $member_guid = $params['user_guid'];
+
+ // loop through all notification types
+ foreach ($NOTIFICATION_HANDLERS as $method => $foo) {
+ $metaname = 'collections_notifications_preferences_' . $method;
+ $collections_preferences = $user->$metaname;
+ if (!$collections_preferences) {
+ continue;
+ }
+ if (!is_array($collections_preferences)) {
+ $collections_preferences = array($collections_preferences);
+ }
+ if (in_array(-1, $collections_preferences)) {
+ // if "all friends" notify is on, we don't change any notifications
+ // since must be a friend to be in an access collection
+ continue;
+ }
+ if (in_array($collection_id, $collections_preferences)) {
+ // notifications are on for this collection so we add/remove
+ if ($event == 'access:collections:add_user') {
+ add_entity_relationship($user->guid, "notify$method", $member_guid);
+ } elseif ($event == 'access:collections:remove_user') {
+ // removing someone from an access collection is not a guarantee
+ // that they should be removed from notifications
+ //remove_entity_relationship($user->guid, "notify$method", $member_guid);
+ }
+ }
+ }
+}
diff --git a/mod/notifications/views/default/forms/notificationsettings/groupsave.php b/mod/notifications/views/default/forms/notificationsettings/groupsave.php
new file mode 100644
index 000000000..168639ab2
--- /dev/null
+++ b/mod/notifications/views/default/forms/notificationsettings/groupsave.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Elgg notifications groups subscription form
+ *
+ * @package ElggNotifications
+ *
+ * @uses $vars['user'] ElggUser
+ */
+
+/* @var ElggUser $user */
+$user = $vars['user'];
+
+global $NOTIFICATION_HANDLERS;
+foreach ($NOTIFICATION_HANDLERS as $method => $foo) {
+ $subsbig[$method] = elgg_get_entities_from_relationship(array(
+ 'relationship' => 'notify' . $method,
+ 'relationship_guid' => $user->guid,
+ 'types' => 'group',
+ 'limit' => 99999,
+ ));
+ $tmparray = array();
+ if ($subsbig[$method]) {
+ foreach($subsbig[$method] as $tmpent) {
+ $tmparray[] = $tmpent->guid;
+ }
+ }
+ $subsbig[$method] = $tmparray;
+}
+
+?>
+
+<div class="elgg-module elgg-module-info">
+ <div class="elgg-body">
+ <?php
+ echo elgg_view('notifications/subscriptions/jsfuncs',$vars);
+ ?>
+ <div>
+ <?php
+ echo elgg_echo('notifications:subscriptions:groups:description');
+ ?>
+ </div>
+<?php
+
+if (isset($vars['groups']) && !empty($vars['groups'])) {
+
+?>
+ <table id="notificationstable" cellspacing="0" cellpadding="4" width="100%">
+ <tr>
+ <td>&nbsp;</td>
+<?php
+
+ $i = 0;
+ foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ if ($i > 0) {
+ echo "<td class='spacercolumn'>&nbsp;</td>";
+ }
+?>
+ <td class="<?php echo $method; ?>togglefield"><?php echo elgg_echo('notification:method:'.$method); ?></td>
+<?php
+ $i++;
+ }
+?>
+ <td>&nbsp;</td>
+ </tr>
+<?php
+ foreach($vars['groups'] as $group) {
+
+ $fields = '';
+ $i = 0;
+
+ foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ if (in_array($group->guid,$subsbig[$method])) {
+ $checked[$method] = 'checked="checked"';
+ } else {
+ $checked[$method] = '';
+ }
+ if ($i > 0) {
+ $fields .= "<td class=\"spacercolumn\">&nbsp;</td>";
+ }
+ $fields .= <<< END
+ <td class="{$method}togglefield">
+ <a border="0" id="{$method}{$group->guid}" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}{$group->guid}');">
+ <input type="checkbox" name="{$method}subscriptions[]" id="{$method}checkbox" onclick="adjust{$method}('{$method}{$group->guid}');" value="{$group->guid}" {$checked[$method]} /></a></td>
+END;
+ $i++;
+ }
+
+?>
+ <tr>
+ <td class="namefield">
+ <div>
+ <?php echo $group->name; ?>
+ </div>
+ </td>
+ <?php echo $fields; ?>
+ <td>&nbsp;</td>
+ </tr>
+<?php
+ }
+?>
+ </table>
+<?php
+}
+ echo '<div class="elgg-foot mtm">';
+ echo elgg_view('input/hidden', array('name' => 'guid', 'value' => $user->guid));
+ echo elgg_view('input/submit', array('value' => elgg_echo('save')));
+ echo '</div>';
+
+?>
+ </div>
+</div>
diff --git a/mod/notifications/views/default/forms/notificationsettings/save.php b/mod/notifications/views/default/forms/notificationsettings/save.php
new file mode 100644
index 000000000..9470256ca
--- /dev/null
+++ b/mod/notifications/views/default/forms/notificationsettings/save.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Personal notifications form body
+ *
+ * @uses $vars['user'] ElggUser
+ */
+
+/* @var ElggUser $user */
+$user = $vars['user'];
+
+echo elgg_view('notifications/subscriptions/personal', $vars);
+echo elgg_view('notifications/subscriptions/collections', $vars);
+echo elgg_view('notifications/subscriptions/forminternals', $vars);
+
+?>
+<div class="elgg-foot">
+<?php
+echo elgg_view('input/hidden', array('name' => 'guid', 'value' => $user->guid));
+echo elgg_view('input/submit', array('value' => elgg_echo('save')));
+?>
+</div>
diff --git a/mod/notifications/views/default/notifications/css.php b/mod/notifications/views/default/notifications/css.php
new file mode 100644
index 000000000..385c55b0b
--- /dev/null
+++ b/mod/notifications/views/default/notifications/css.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Elgg notifications CSS
+ *
+ * @package notifications
+ */
+?>
+
+#notificationstable td.namefield {
+ width:250px;
+ text-align: left;
+ vertical-align: middle;
+}
+#notificationstable td.namefield p {
+ margin:0;
+ vertical-align: middle;
+ line-height: 1.1em;
+ padding:5px 0 5px 0;
+}
+#notificationstable td.namefield p.namefieldlink {
+ margin:5px 0 0 0;
+}
+#notificationstable td.namefield a img {
+ float:left;
+ width:25px;
+ height:25px;
+ margin:5px 10px 5px 5px;
+}
+#notificationstable td.emailtogglefield,
+#notificationstable td.smstogglefield {
+ width:50px;
+ text-align: center;
+ vertical-align: middle;
+}
+#notificationstable td.spacercolumn {
+ width:30px;
+}
+#notificationstable td {
+ border-bottom: 1px solid silver;
+}
+#notificationstable td.emailtogglefield input {
+ margin-right:36px;
+ margin-top:5px;
+}
+#notificationstable td.emailtogglefield a {
+ width:46px;
+ height:24px;
+ cursor: pointer;
+ display: block;
+ outline: none;
+}
+#notificationstable td.sitetogglefield {
+ width:50px;
+ text-align: center;
+ vertical-align: middle;
+}
+#notificationstable td.sitetogglefield input {
+ margin-right:36px;
+ margin-top:5px;
+}
+#notificationstable td.sitetogglefield a {
+ width:46px;
+ height:24px;
+ cursor: pointer;
+ display: block;
+ outline: none;
+}
+#notificationstable td.emailtogglefield a.emailtoggleOff {
+ background: url(<?php echo elgg_get_site_url(); ?>mod/notifications/graphics/icon_notifications_email.gif) no-repeat right 2px;
+}
+#notificationstable td.emailtogglefield a.emailtoggleOn {
+ background: url(<?php echo elgg_get_site_url(); ?>mod/notifications/graphics/icon_notifications_email.gif) no-repeat right -36px;
+}
+#notificationstable td.sitetogglefield a.sitetoggleOff {
+ background: url(<?php echo elgg_get_site_url(); ?>mod/notifications/graphics/icon_notifications_site.gif) no-repeat right 2px;
+}
+#notificationstable td.sitetogglefield a.sitetoggleOn {
+ background: url(<?php echo elgg_get_site_url(); ?>mod/notifications/graphics/icon_notifications_site.gif) no-repeat right -37px;
+}
+.notification_friends,
+.notification_personal,
+.notifications_per_user {
+ margin-bottom: 25px;
+}
+
+
+
diff --git a/mod/notifications/views/default/notifications/subscriptions/collections.php b/mod/notifications/views/default/notifications/subscriptions/collections.php
new file mode 100644
index 000000000..207b2e3b9
--- /dev/null
+++ b/mod/notifications/views/default/notifications/subscriptions/collections.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ * @uses $vars['user'] ElggUser
+ */
+
+/* @var ElggUser $user */
+$user = $vars['user'];
+
+//@todo JS 1.8: no ?>
+<script type="text/javascript">
+
+ function setCollection(members, method, id) {
+ for ( var i in members ) {
+ var checked = $('#' + method + 'collections' + id).children("INPUT[type='checkbox']").attr('checked');
+ if ($("#"+method+members[i]).children("INPUT[type='checkbox']").attr('checked') != checked) {
+ $("#"+method+members[i]).children("INPUT[type='checkbox']").attr('checked', checked);
+ functioncall = 'adjust' + method + '_alt("'+method+members[i]+'");';
+ eval(functioncall);
+ }
+ }
+ }
+
+</script>
+<div class="elgg-module elgg-module-info">
+ <div class="elgg-head">
+ <h3>
+ <?php echo elgg_echo('notifications:subscriptions:friends:title'); ?>
+ </h3>
+ </div>
+<p class="margin-none">
+ <?php echo elgg_echo('notifications:subscriptions:friends:description'); ?>
+</p>
+<table id="notificationstable" cellspacing="0" cellpadding="4" width="100%">
+ <tr>
+ <td>&nbsp;</td>
+<?php
+ $i = 0;
+ global $NOTIFICATION_HANDLERS;
+ foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ if ($i > 0) {
+ echo "<td class='spacercolumn'>&nbsp;</td>";
+ }
+?>
+ <td class="<?php echo $method; ?>togglefield"><?php echo elgg_echo('notification:method:'.$method); ?></td>
+<?php
+ $i++;
+ }
+?>
+ <td>&nbsp;</td>
+ </tr>
+<?php
+ $members = array();
+ if ($friends = get_user_friends($user->guid, '', 9999, 0)) {
+ foreach($friends as $friend) {
+ $members[] = $friend->guid;
+ }
+ }
+ $memberno = sizeof($members);
+ $members = implode(',',$members);
+
+?>
+ <tr>
+ <td class="namefield">
+ <p>
+ <?php echo elgg_echo('friends:all'); ?> (<?php echo $memberno; ?>)
+ </p>
+ </td>
+<?php
+
+ $fields = '';
+ $i = 0;
+ foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ $metaname = 'collections_notifications_preferences_' . $method;
+ if ($collections_preferences = $user->$metaname) {
+ if (!empty($collections_preferences) && !is_array($collections_preferences)) {
+ $collections_preferences = array($collections_preferences);
+ }
+ if (is_array($collections_preferences)) {
+ if (in_array(-1,$collections_preferences)) {
+ $collectionschecked[$method] = 'checked="checked"';
+ } else {
+ $collectionschecked[$method] = '';
+ }
+ }
+ }
+ if ($i > 0) {
+ $fields .= "<td class='spacercolumn'>&nbsp;</td>";
+ }
+ $fields .= <<< END
+ <td class="{$method}togglefield">
+ <a border="0" id="{$method}collections-1" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}collections-1'); setCollection([{$members}],'{$method}',-1);">
+ <input type="checkbox" name="{$method}collections[]" id="{$method}checkbox" onclick="adjust{$method}('{$method}collections-1');" value="-1" {$collectionschecked[$method]} /></a></td>
+END;
+ $i++;
+ }
+ echo $fields;
+
+?>
+ <td>&nbsp;</td>
+ </tr>
+<?php
+
+ if ($collections = get_user_access_collections($user->guid)) {
+ foreach ($collections as $collection) {
+ $members = get_members_of_access_collection($collection->id, true);
+ $memberno = 0;
+ if ($members) {
+ $memberno = sizeof($members);
+ $members = implode(',', $members);
+ } else {
+ $members = '';
+ }
+
+
+?>
+ <tr>
+ <td class="namefield">
+ <p>
+ <?php echo $collection->name; ?> (<?php echo $memberno; ?>)
+ </p>
+ </td>
+
+<?php
+
+ $fields = '';
+ $i = 0;
+ foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ $metaname = 'collections_notifications_preferences_' . $method;
+ if ($collections_preferences = $user->$metaname) {
+ if (!empty($collections_preferences) && !is_array($collections_preferences)) {
+ $collections_preferences = array($collections_preferences);
+ }
+ if (is_array($collections_preferences)) {
+ if (in_array($collection->id,$collections_preferences)) {
+ $collectionschecked[$method] = 'checked="checked"';
+ } else {
+ $collectionschecked[$method] = '';
+ }
+ }
+ }
+ if ($i > 0) {
+ $fields .= "<td class='spacercolumn'>&nbsp;</td>";
+ }
+ $fields .= <<< END
+ <td class="{$method}togglefield">
+ <a border="0" id="{$method}collections{$collection->id}" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}collections{$collection->id}'); setCollection([{$members}],'{$method}',{$collection->id});">
+ <input type="checkbox" name="{$method}collections[]" id="{$method}checkbox" onclick="adjust{$method}('{$method}collections{$collection->id}');" value="{$collection->id}" {$collectionschecked[$method]} /></a></td>
+END;
+ $i++;
+ }
+ echo $fields;
+
+?>
+
+ <td>&nbsp;</td>
+ </tr>
+<?php
+
+ }
+ }
+
+?>
+</table>
+</div>
diff --git a/mod/notifications/views/default/notifications/subscriptions/form.php b/mod/notifications/views/default/notifications/subscriptions/form.php
new file mode 100644
index 000000000..559354eff
--- /dev/null
+++ b/mod/notifications/views/default/notifications/subscriptions/form.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Elgg personal notifications
+ *
+ * @uses $vars['user'] ElggUser that owns the notification settings
+ */
+
+// @todo is this a view for extensions?
+echo elgg_view('subscriptions/form/additions', $vars);
+
+$form_vars = array('class' => 'elgg-form-alt');
+echo elgg_view_form('notificationsettings/save', $form_vars, $vars);
diff --git a/mod/notifications/views/default/notifications/subscriptions/forminternals.php b/mod/notifications/views/default/notifications/subscriptions/forminternals.php
new file mode 100644
index 000000000..11f266303
--- /dev/null
+++ b/mod/notifications/views/default/notifications/subscriptions/forminternals.php
@@ -0,0 +1,337 @@
+<?php
+/**
+ * Hacked up friends picker that needs to be replaced
+ *
+ * @uses $vars['user'] ElggUser
+ */
+
+/* @var ElggUser $user */
+$user = $vars['user'];
+
+elgg_load_js('elgg.friendspicker');
+elgg_load_js('jquery.easing');
+
+?>
+<div class="elgg-module elgg-module-info">
+ <div class="elgg-head">
+ <h3>
+ <?php echo elgg_echo('notifications:subscriptions:title'); ?>
+ </h3>
+ </div>
+ <p>
+ <?php echo elgg_echo('notifications:subscriptions:description'); ?>
+ </p>
+<?php
+
+// Get friends and subscriptions
+$friends = get_user_friends($user->guid, '', 9999, 0);
+
+global $NOTIFICATION_HANDLERS;
+foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ $subsbig[$method] = elgg_get_entities_from_relationship(array(
+ 'relationship' => 'notify' . $method,
+ 'relationship_guid' => $user->guid,
+ 'types' => 'user',
+ 'limit' => 99999,
+ ));
+}
+
+$subs = array();
+foreach($subsbig as $method => $big) {
+ if (is_array($subsbig[$method]) && sizeof($subsbig[$method])) {
+ foreach($subsbig[$method] as $u) {
+ $subs[$method][] = $u->guid;
+ }
+ }
+}
+
+// Let the system know that the friends picker is in use
+global $pickerinuse;
+$pickerinuse = true;
+$chararray = elgg_echo('friendspicker:chararray');
+
+// Initialise name
+if (!isset($vars['name'])) {
+ $name = "friend";
+} else {
+ $name = $vars['name'];
+}
+
+// Initialise values
+if (!isset($vars['value'])) {
+ $vars['value'] = array();
+} else {
+ if (!is_array($vars['value'])) {
+ $vars['value'] = (int) $vars['value'];
+ $vars['value'] = array($vars['value']);
+ }
+}
+
+// Initialise whether we're calling back or not
+if (isset($vars['callback'])) {
+ $callback = $vars['callback'];
+} else {
+ $callback = false;
+}
+
+// We need to count the number of friends pickers on the page.
+if (!isset($vars['friendspicker'])) {
+ global $friendspicker;
+ if (!isset($friendspicker)) {
+ $friendspicker = 0;
+ }
+ $friendspicker++;
+} else {
+ $friendspicker = $vars['friendspicker'];
+}
+
+$users = array();
+$activeletters = array();
+
+// Are we displaying form tags and submit buttons?
+// (If we've been given a target, then yes! Otherwise, no.)
+if (isset($vars['formtarget'])) {
+ $formtarget = $vars['formtarget'];
+} else {
+ $formtarget = false;
+}
+
+// Sort users by letter
+if (is_array($friends) && sizeof($friends)) {
+ foreach($friends as $friend) {
+
+ $letter = elgg_substr($friend->name,0,1);
+ $letter = elgg_strtoupper($letter);
+ if (!elgg_substr_count($chararray,$letter)) {
+ $letter = "*";
+ }
+ if (!isset($users[$letter])) {
+ $users[$letter] = array();
+ }
+ $users[$letter][$friend->guid] = $friend;
+ }
+}
+
+if (!$callback) {
+
+?>
+
+<div class="friends-picker-main-wrapper">
+
+<?php
+
+ if (isset($vars['content'])) {
+ echo $vars['content'];
+ }
+
+?>
+
+ <div id="friends-picker_placeholder<?php echo $friendspicker; ?>">
+
+<?php
+
+}
+
+if (!isset($vars['replacement'])) {
+
+ if ($formtarget) {
+?>
+<?php //@todo JS 1.8: no ?>
+ <script language="text/javascript">
+ $(function() { // onload...do
+ $('#collectionMembersForm<?php echo $friendspicker; ?>').submit(function() {
+ var inputs = [];
+ $(':input', this).each(function() {
+ if (this.type != 'checkbox' || (this.type == 'checkbox' && this.checked != false)) {
+ inputs.push(this.name + '=' + escape(this.value));
+ }
+ });
+ jQuery.ajax({
+ type: "POST",
+ data: inputs.join('&'),
+ url: this.action,
+ success: function(){
+ $('a.collectionmembers<?php echo $friendspicker; ?>').click();
+ }
+
+ });
+ return false;
+ })
+ })
+
+ </script>
+
+<?php
+
+ }
+
+ echo elgg_view('notifications/subscriptions/jsfuncs',$vars);
+
+?>
+
+ <div class="friends-picker-wrapper">
+ <div id="friends-picker<?php echo $friendspicker; ?>">
+ <div class="friends-picker-container">
+<?php
+
+ // Initialise letters
+ $letter = elgg_substr($chararray,0,1);
+ $letpos = 0;
+ $chararray .= '*';
+ while (1 == 1) {
+?>
+ <div class="panel" title="<?php echo $letter; ?>">
+ <div class="wrapper">
+ <h3><?php echo $letter; ?></h3>
+
+<?php
+
+ if (isset($users[$letter])) {
+ ksort($users[$letter]);
+?>
+
+<table id="notificationstable" cellspacing="0" cellpadding="4" border="0" width="100%">
+<tr>
+ <td>&nbsp;</td>
+<?php
+ $i = 0;
+ foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ if ($i > 0) {
+ echo "<td class='spacercolumn'>&nbsp;</td>";
+ }
+?>
+ <td class="<?php echo $method; ?>togglefield"><?php echo elgg_echo('notification:method:'.$method); ?></td>
+<?php
+ $i++;
+ }
+?>
+ <td>&nbsp;</td>
+</tr>
+
+<?php
+
+ if (is_array($users[$letter]) && sizeof($users[$letter]) > 0) {
+ foreach($users[$letter] as $friend) {
+ if ($friend instanceof ElggUser ) {
+
+ if (!in_array($letter,$activeletters)) {
+ $activeletters[] = $letter;
+ }
+
+ $method = array();
+ $fields = '';
+ $i = 0;
+
+ foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ if (isset($subs[$method]) && in_array($friend->guid,$subs[$method])) {
+ $checked[$method] = 'checked="checked"';
+ } else {
+ $checked[$method] = '';
+ }
+ if ($i > 0) {
+ $fields .= "<td class='spacercolumn'>&nbsp;</td>";
+ }
+ $fields .= <<< END
+<td class="{$method}togglefield">
+<a border="0" id="{$method}{$friend->guid}" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}{$friend->guid}');">
+<input type="checkbox" name="{$method}subscriptions[]" id="{$method}checkbox" onclick="adjust{$method}('{$method}{$friend->guid}');" value="{$friend->guid}" {$checked[$method]} /></a></td>
+END;
+ $i++;
+ }
+?>
+
+<tr>
+ <td class="namefield">
+ <a href="<?php echo $friend->getURL(); ?>">
+<?php
+ echo elgg_view_entity_icon($friend, 'tiny', array('use_hover' => false));
+?>
+ </a>
+ <p class="namefieldlink">
+ <a href="<?php echo $friend->getURL(); ?>"><?php echo $friend->name ?></a>
+ </p>
+ </td>
+
+<?php echo $fields; ?>
+
+<td>&nbsp;</td>
+</tr>
+
+
+<?php
+ }
+ }
+ }
+
+?>
+</table>
+
+<?php
+ }
+
+?>
+
+ </div>
+ </div>
+<?php
+ $letpos++;
+ if ($letpos == elgg_strlen($chararray)) {
+ break;
+ }
+ $letter = elgg_substr($chararray,$letpos,1);
+ }
+
+?>
+ </div>
+ </div>
+ </div>
+
+<?php
+} else {
+ echo $vars['replacement'];
+}
+if (!$callback) {
+
+?>
+
+ </div>
+</div>
+
+
+<?php
+
+}
+
+?>
+<?php
+if (!isset($vars['replacement'])) {
+?>
+<?php //@todo JS 1.8: no ?>
+<script type="text/javascript">
+ // initialise picker
+ $("div#friends-picker<?php echo $friendspicker; ?>").friendsPicker(<?php echo $friendspicker; ?>);
+</script>
+<script type="text/javascript">
+ $(function () {
+ // manually add class to corresponding tab for panels that have content
+<?php
+ if (sizeof($activeletters) > 0) {
+ $chararray .= "*";
+ foreach($activeletters as $letter) {
+ $tab = elgg_strpos($chararray, $letter) + 1;
+?>
+ $("div#friends-picker-navigation<?php echo $friendspicker; ?> li.tab<?php echo $tab; ?> a").addClass("tabHasContent");
+<?php
+ }
+ }
+
+?>
+ });
+</script>
+
+<?php
+
+}
+
+?>
+</div>
diff --git a/mod/notifications/views/default/notifications/subscriptions/groupsform.php b/mod/notifications/views/default/notifications/subscriptions/groupsform.php
new file mode 100644
index 000000000..f1dbdcff8
--- /dev/null
+++ b/mod/notifications/views/default/notifications/subscriptions/groupsform.php
@@ -0,0 +1,4 @@
+<?php
+
+elgg_deprecated_notice("notifications/subscriptions/groupsform was moved to forms/notificationsettings/groupsave", 1.8);
+echo elgg_view('forms/notificationsettings/groupsave'); \ No newline at end of file
diff --git a/mod/notifications/views/default/notifications/subscriptions/jsfuncs.php b/mod/notifications/views/default/notifications/subscriptions/jsfuncs.php
new file mode 100644
index 000000000..ace622581
--- /dev/null
+++ b/mod/notifications/views/default/notifications/subscriptions/jsfuncs.php
@@ -0,0 +1,54 @@
+<?php
+
+global $NOTIFICATION_HANDLERS;
+
+?>
+<?php //@todo JS 1.8: no ?>
+<script type="text/javascript">
+
+$(document).ready(function () {
+<?php
+foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+?>
+ $('input[type=checkbox]:checked').parent("a.<?php echo $method; ?>toggleOff").each(function(){
+ $(this).removeClass('<?php echo $method; ?>toggleOff').addClass('<?php echo $method; ?>toggleOn');
+ });
+
+<?php
+}
+?>
+
+});
+
+ clickflag = 0;
+
+<?php
+foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+?>
+function adjust<?php echo $method; ?>(linkId) {
+ var obj = $(this).prev("a");
+
+ if (obj.className == "<?php echo $method; ?>toggleOff") {
+ obj.className = "<?php echo $method; ?>toggleOn";
+ } else {
+ obj.className = "<?php echo $method; ?>toggleOff";
+ }
+ return false;
+}
+function adjust<?php echo $method; ?>_alt(linkId) {
+ var obj = document.getElementById(linkId);
+
+ if (obj.className == "<?php echo $method; ?>toggleOff") {
+ obj.className = "<?php echo $method; ?>toggleOn";
+ $('#' + linkId).children("input[type='checkbox']").attr('checked', true);
+ } else {
+ obj.className = "<?php echo $method; ?>toggleOff";
+ $('#' + linkId).children("input[type='checkbox']").attr('checked', false);
+ }
+ return false;
+}
+<?php
+}
+?>
+
+</script> \ No newline at end of file
diff --git a/mod/notifications/views/default/notifications/subscriptions/personal.php b/mod/notifications/views/default/notifications/subscriptions/personal.php
new file mode 100644
index 000000000..cf05426e2
--- /dev/null
+++ b/mod/notifications/views/default/notifications/subscriptions/personal.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * @uses $vars['user'] ElggUser
+ */
+
+/* @var ElggUser $user */
+$user = $vars['user'];
+
+global $NOTIFICATION_HANDLERS;
+
+?>
+<div class="notification_personal">
+<div class="elgg-module elgg-module-info">
+ <div class="elgg-head">
+ <h3>
+ <?php echo elgg_echo('notifications:subscriptions:personal:title'); ?>
+ </h3>
+ </div>
+</div>
+<table id="notificationstable" cellspacing="0" cellpadding="4" width="100%">
+ <tr>
+ <td>&nbsp;</td>
+<?php
+$i = 0;
+foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ if ($i > 0) {
+ echo "<td class='spacercolumn'>&nbsp;</td>";
+ }
+?>
+ <td class="<?php echo $method; ?>togglefield"><?php echo elgg_echo('notification:method:'.$method); ?></td>
+<?php
+ $i++;
+}
+?>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td class="namefield">
+ <p>
+ <?php echo elgg_echo('notifications:subscriptions:personal:description') ?>
+ </p>
+ </td>
+
+<?php
+
+$fields = '';
+$i = 0;
+foreach($NOTIFICATION_HANDLERS as $method => $foo) {
+ if ($notification_settings = get_user_notification_settings($user->guid)) {
+ if ($notification_settings->$method) {
+ $personalchecked[$method] = 'checked="checked"';
+ } else {
+ $personalchecked[$method] = '';
+ }
+ }
+ if ($i > 0) {
+ $fields .= "<td class='spacercolumn'>&nbsp;</td>";
+ }
+ $fields .= <<< END
+ <td class="{$method}togglefield">
+ <a border="0" id="{$method}personal" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}personal');">
+ <input type="checkbox" name="{$method}personal" id="{$method}checkbox" onclick="adjust{$method}('{$method}personal');" value="1" {$personalchecked[$method]} /></a></td>
+END;
+ $i++;
+}
+echo $fields;
+
+?>
+
+ <td>&nbsp;</td>
+ </tr>
+</table>
+</div> \ No newline at end of file