]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.8.x' into userdesign
authorZach Copley <zach@controlyourself.ca>
Wed, 17 Jun 2009 21:40:52 +0000 (21:40 +0000)
committerZach Copley <zach@controlyourself.ca>
Wed, 17 Jun 2009 21:40:52 +0000 (21:40 +0000)
20 files changed:
README
actions/block.php
actions/featured.php
actions/groupblock.php
actions/peopletag.php
actions/twitapifavorites.php
classes/File.php
classes/File_oembed.php
classes/Notice.php
classes/Notice_inbox.php
config.php.sample
js/util.js
lib/common.php
lib/noticeform.php
lib/router.php
lib/twitterapi.php
theme/base/css/display.css
theme/base/images/icons/twotone/green/admin.gif [new file with mode: 0644]
theme/default/css/display.css
theme/identica/css/display.css

diff --git a/README b/README
index 57ff72f665828f6f76ea40e7c5aa0b60b0967bc1..5aa7270eece7c2bf6ea98823c223e9c62b4e6668 100644 (file)
--- a/README
+++ b/README
@@ -178,8 +178,8 @@ and the URLs are listed here for your convenience.
 - Facebook library. Used for the Facebook application.
 - PEAR Services_oEmbed. Used for some multimedia integration.
 - PEAR HTTP_Request is an oEmbed dependency.
-- PEAR Validat is an oEmbed dependency.e
-- PEAR Net_URL is an oEmbed dependency.2
+- PEAR Validate is an oEmbed dependency.
+- PEAR Net_URL2 is an oEmbed dependency.
 
 A design goal of Laconica is that the basic Web functionality should
 work on even the most restrictive commercial hosting services.
@@ -1223,6 +1223,7 @@ supported: an array of mime types you accept to store and distribute,
            like 'image/gif', 'video/mpeg', 'audio/mpeg', etc. Make sure you
            setup your server to properly reckognize the types you want to
            support.
+uploads:   false to disable uploading files with notices (true by default).
 
 For quotas, be sure you've set the upload_max_filesize and post_max_size
 in php.ini to be large enough to handle your upload. In httpd.conf
@@ -1246,6 +1247,14 @@ Options for group functionality.
 maxaliases: maximum number of aliases a group can have. Default 3. Set
             to 0 or less to prevent aliases in a group.
 
+
+oohembed
+--------
+
+oEmbed endpoint for multimedia attachments (links in posts).
+
+endpoint: oohembed endpoint using http://oohembed.com/ software.
+
 Troubleshooting
 ===============
 
index 0efee5932c101901d6945eb11d08681881d2f08f..441016d4e999490760936e5286e90d09196252bc 100644 (file)
@@ -125,16 +125,18 @@ class BlockAction extends Action
     function areYouSureForm()
     {
         $id = $this->profile->id;
+        $this->elementStart('form', array('id' => 'block-' . $id,
+                                           'method' => 'post',
+                                           'class' => 'form_settings form_entity_block',
+                                           'action' => common_local_url('block')));
+        $this->elementStart('fieldset');
+        $this->hidden('token', common_session_token());
+        $this->element('legend', _('Block user'));
         $this->element('p', null,
                        _('Are you sure you want to block this user? '.
                          'Afterwards, they will be unsubscribed from you, '.
                          'unable to subscribe to you in the future, and '.
                          'you will not be notified of any @-replies from them.'));
-        $this->elementStart('form', array('id' => 'block-' . $id,
-                                           'method' => 'post',
-                                           'class' => 'block',
-                                           'action' => common_local_url('block')));
-        $this->hidden('token', common_session_token());
         $this->element('input', array('id' => 'blockto-' . $id,
                                       'name' => 'blockto',
                                       'type' => 'hidden',
@@ -144,8 +146,9 @@ class BlockAction extends Action
                 $this->hidden($k, $v);
             }
         }
-        $this->submit('no', _('No'));
-        $this->submit('yes', _('Yes'));
+        $this->submit('form_action-no', _('No'), 'submit form_action-primary', 'no', _("Do not block this user from this group"));
+        $this->submit('form_action-yes', _('Yes'), 'submit form_action-secondary', 'yes', _('Block this user from this group'));
+        $this->elementEnd('fieldset');
         $this->elementEnd('form');
     }
 
index 79eba2aa67b9985372a2e23a1e977306a62439ca..04365687d763c3e3b3dac39c60e5e3ff5266791f 100644 (file)
@@ -32,7 +32,7 @@ if (!defined('LACONICA')) {
     exit(1);
 }
 
-require_once(INSTALLDIR.'/lib/profilelist.php');
+require_once INSTALLDIR.'/lib/profilelist.php';
 require_once INSTALLDIR.'/lib/publicgroupnav.php';
 
 /**
@@ -107,7 +107,6 @@ class FeaturedAction extends Action
 
         $featured_nicks = common_config('nickname', 'featured');
 
-
         if (count($featured_nicks) > 0) {
 
             $quoted = array();
@@ -136,7 +135,7 @@ class FeaturedAction extends Action
             $cnt = $profile->find();
 
             if ($cnt > 0) {
-                $featured = new ProfileList($profile, null, $this);
+                $featured = new ProfileList($profile, $this);
                 $featured->show();
             }
 
index 93662da799af8977590a5be690928d7494406210..28685b1d56fffb4e5876b58cd88482b8f885bcbb 100644 (file)
@@ -151,17 +151,19 @@ class GroupblockAction extends Action
     function areYouSureForm()
     {
         $id = $this->profile->id;
+        $this->elementStart('form', array('id' => 'block-' . $id,
+                                           'method' => 'post',
+                                           'class' => 'form_settings form_entity_block',
+                                           'action' => common_local_url('groupblock')));
+        $this->elementStart('fieldset');
+        $this->hidden('token', common_session_token());
+        $this->element('legend', null, _('Block user'));
         $this->element('p', null,
                        sprintf(_('Are you sure you want to block user "%s" from the group "%s"? '.
                                  'They will be removed from the group, unable to post, and '.
                                  'unable to subscribe to the group in the future.'),
                                $this->profile->getBestName(),
                                $this->group->getBestName()));
-        $this->elementStart('form', array('id' => 'block-' . $id,
-                                           'method' => 'post',
-                                           'class' => 'block',
-                                           'action' => common_local_url('groupblock')));
-        $this->hidden('token', common_session_token());
         $this->hidden('blockto-' . $this->profile->id,
                       $this->profile->id,
                       'blockto');
@@ -173,8 +175,9 @@ class GroupblockAction extends Action
                 $this->hidden($k, $v);
             }
         }
-        $this->submit('no', _('No'));
-        $this->submit('yes', _('Yes'));
+        $this->submit('form_action-no', _('No'), 'submit form_action-primary', 'no', _("Do not block this user from this group"));
+        $this->submit('form_action-yes', _('Yes'), 'submit form_action-secondary', 'yes', _('Block this user from this group'));
+        $this->elementEnd('fieldset');
         $this->elementEnd('form');
     }
 
index 5add75485808d08f704fa6dfa73faa34593605d6..dd3c1c0899a7befec824afeae83e4c8f19434633 100644 (file)
@@ -124,7 +124,7 @@ class PeopletagAction extends Action
 
         $profile->query(sprintf($qry, $this->tag, $lim));
 
-        $pl  = new ProfileList($profile, null, $this);
+        $pl  = new ProfileList($profile, $this);
         $cnt = $pl->show();
 
         $this->pagination($this->page > 1,
index 8656adbe862d5a8419852ea1980dfd7bb9e81b8f..2266ba11c2126cf40c1aaaab9067d0fea9574609 100644 (file)
@@ -34,6 +34,11 @@ class TwitapifavoritesAction extends TwitterapiAction
         $user = $this->get_user($apidata['api_arg'], $apidata);
 
         if (empty($user)) {
+        if ($apidata['content-type'] == 'xml') {
+            $this->show_single_xml_status($notice);
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->show_single_json_status($notice);
+        }
             $this->clientError('Not Found', 404, $apidata['content-type']);
             return;
         }
@@ -91,7 +96,6 @@ class TwitapifavoritesAction extends TwitterapiAction
 
         // Check for RESTfulness
         if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
-            // XXX: Twitter just prints the err msg, no XML / JSON.
             $this->clientError(_('This method requires a POST or DELETE.'),
                 400, $apidata['content-type']);
             return;
@@ -102,10 +106,9 @@ class TwitapifavoritesAction extends TwitterapiAction
             return;
         }
 
-        $user = $apidata['user']; // Always the auth user
-
+        $user      = $apidata['user']; // Always the auth user
         $notice_id = $apidata['api_arg'];
-        $notice = Notice::staticGet($notice_id);
+        $notice    = Notice::staticGet($notice_id);
 
         if (empty($notice)) {
             $this->clientError(_('No status found with that ID.'),
@@ -115,7 +118,7 @@ class TwitapifavoritesAction extends TwitterapiAction
 
         // XXX: Twitter lets you fave things repeatedly via api.
         if ($user->hasFave($notice)) {
-            $this->clientError(_('This notice is already a favorite!'),
+            $this->clientError(_('This status is already a favorite!'),
                 403, $apidata['content-type']);
             return;
         }
@@ -123,7 +126,7 @@ class TwitapifavoritesAction extends TwitterapiAction
         $fave = Fave::addNew($user, $notice);
 
         if (empty($fave)) {
-            $this->serverError(_('Could not create favorite.'));
+            $this->clientError(_('Could not create favorite.'));
             return;
         }
 
@@ -141,7 +144,55 @@ class TwitapifavoritesAction extends TwitterapiAction
     function destroy($args, $apidata)
     {
         parent::handle($args);
-        $this->serverError(_('API method under construction.'), $code=501);
+
+        // Check for RESTfulness
+        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+            $this->clientError(_('This method requires a POST or DELETE.'),
+                400, $apidata['content-type']);
+            return;
+        }
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            $this->clientError(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        $user      = $apidata['user']; // Always the auth user
+        $notice_id = $apidata['api_arg'];
+        $notice    = Notice::staticGet($notice_id);
+
+        if (empty($notice)) {
+            $this->clientError(_('No status found with that ID.'),
+                404, $apidata['content-type']);
+            return;
+        }
+
+        $fave            = new Fave();
+        $fave->user_id   = $this->id;
+        $fave->notice_id = $notice->id;
+
+        if (!$fave->find(true)) {
+            $this->clientError(_('That status is not a favorite!'),
+                403, $apidata['content-type']);
+            return;
+        }
+
+        $result = $fave->delete();
+
+        if (!$result) {
+            common_log_db_error($fave, 'DELETE', __FILE__);
+            $this->clientError(_('Could not delete favorite.'), 404);
+            return;
+        }
+
+        $user->blowFavesCache();
+
+        if ($apidata['content-type'] == 'xml') {
+            $this->show_single_xml_status($notice);
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->show_single_json_status($notice);
+        }
+
     }
 
     // XXX: these two funcs swiped from faves.
index 24ab11b8eb12d595469c08aa2092dca65d013a6b..08320faf8f11fda1af215b127e890c303b0fb9c8 100644 (file)
@@ -79,7 +79,6 @@ class File extends Memcached_DataObject
             && ('text/html' === substr($redir_data['type'], 0, 9))
             && ($oembed_data = File_oembed::_getOembed($given_url))
             && isset($oembed_data['json'])) {
-
             File_oembed::saveNew($oembed_data['json'], $file_id);
         }
         return $x;
@@ -98,7 +97,6 @@ class File extends Memcached_DataObject
                 if ($redir_url === $given_url) {
                     $x = File::saveNew($redir_data, $given_url);
                     $file_id = $x->id;
-
                 } else {
                     $x = File::processNew($redir_url, $notice_id);
                     $file_id = $x->id;
index f1b2cb13c02d90a0b50f2c8bf7e2b0c4d522ebda..6bf972f8fe4678a5c6498b0da907148a2b6a4f71 100644 (file)
@@ -53,7 +53,7 @@ class File_oembed extends Memcached_DataObject
 
 
     function _getOembed($url, $maxwidth = 500, $maxheight = 400, $format = 'json') {
-        $cmd = 'http://oohembed.com/oohembed/?url=' . urlencode($url);
+        $cmd = common_config('oohembed', 'endpoint') . '?url=' . urlencode($url);
         if (is_int($maxwidth)) $cmd .= "&maxwidth=$maxwidth";
         if (is_int($maxheight)) $cmd .= "&maxheight=$maxheight";
         if (is_string($format)) $cmd .= "&format=$format";
index 770b5d78b7020ab76a321216a516dd80054796e0..18f3f654ec3987ad1910205e9c0d4fe78bdad622 100644 (file)
@@ -29,6 +29,11 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 
 define('NOTICE_CACHE_WINDOW', 61);
 
+define('NOTICE_LOCAL_PUBLIC', 1);
+define('NOTICE_REMOTE_OMB', 0);
+define('NOTICE_LOCAL_NONPUBLIC', -1);
+define('NOTICE_GATEWAY', -2);
+
 class Notice extends Memcached_DataObject
 {
     ###START_AUTOCODE
@@ -218,6 +223,12 @@ class Notice extends Memcached_DataObject
             $notice->addToInboxes();
             $notice->saveGroups();
             $notice->saveUrls();
+            $orig2 = clone($notice);
+               $notice->rendered = common_render_content($final, $notice);
+            if (!$notice->update($orig2)) {
+                common_log_db_error($notice, 'UPDATE', __FILE__);
+                return _('Problem saving notice.');
+            }
 
             $notice->query('COMMIT');
 
@@ -237,8 +248,6 @@ class Notice extends Memcached_DataObject
      * follow redirects and save all available file information
      * (mimetype, date, size, oembed, etc.)
      *
-     * @param class $notice Notice to pull URLs from
-     *
      * @return void
      */
     function saveUrls() {
@@ -812,7 +821,7 @@ class Notice extends Memcached_DataObject
         $inbox = new Notice_inbox();
         $UT = common_config('db','type')=='pgsql'?'"user"':'user';
         $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created, source) ' .
-          "SELECT $UT.id, " . $this->id . ", '" . $this->created . "', 2 " .
+          "SELECT $UT.id, " . $this->id . ", '" . $this->created . "', " . NOTICE_INBOX_SOURCE_GROUP . " " .
           "FROM $UT JOIN group_member ON $UT.id = group_member.profile_id " .
           'WHERE group_member.group_id = ' . $group->id . ' ' .
           'AND NOT EXISTS (SELECT user_id, notice_id ' .
index 673e187c7296694bbd228ef02f0e9ae3d6671298..367a35f1f7b96a65565bccc250792e2aa800dce3 100644 (file)
@@ -25,6 +25,10 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 
 define('INBOX_CACHE_WINDOW', 101);
 
+define('NOTICE_INBOX_SOURCE_SUB', 1);
+define('NOTICE_INBOX_SOURCE_GROUP', 2);
+define('NOTICE_INBOX_SOURCE_GATEWAY', -1);
+
 class Notice_inbox extends Memcached_DataObject
 {
     ###START_AUTOCODE
index 636f4cf8e22255322c0452e154727f1ff3cb0f41..7649c52623ca09ba1d7dc3fdda16dc9ad90239b3 100644 (file)
@@ -222,4 +222,6 @@ $config['sphinx']['port'] = 3312;
 // $config['attachments']['file_quota'] = 5000000;
 // $config['attachments']['user_quota'] = 50000000;
 // $config['attachments']['monthly_quota'] = 15000000;
+// $config['attachments']['uploads'] = true;
 
+// $config['oohembed']['endpoint'] = 'http://oohembed.com/oohembed/';
index fd2500d44710a5552f2c5d00771589eb14b9dc08..ce0c20d31ba05b5a243dc777ee0a6e834e09f7ce 100644 (file)
@@ -230,21 +230,10 @@ $(document).ready(function(){
                                           };
        $("#form_notice").ajaxForm(PostNotice);
        $("#form_notice").each(addAjaxHidden);
-    NoticeHover();
     NoticeReply();
     NoticeAttachments();
 });
 
-
-function NoticeHover() {
-    function mouseHandler(e) {
-        $(e.target).closest('li.hentry')[(e.type === 'mouseover') ? 'addClass' : 'removeClass']('hover');
-    };
-    $('#content .notices').mouseover(mouseHandler);
-    $('#content .notices').mouseout(mouseHandler);
-}
-
-
 function NoticeReply() {
     if ($('#notice_data-text').length > 0) {
         $('#content .notice').each(function() {
@@ -319,4 +308,4 @@ function NoticeAttachments() {
             $(this).closest(".entry-title").removeClass('ov');
         }
     );
-}
+}
\ No newline at end of file
index bcf2e5d0c7dfaefa0bc8e3ab266cc50ed7007888..eb8a2b8736cab98b153d217c73bcf075d390e9f1 100644 (file)
@@ -213,9 +213,11 @@ $config =
         'file_quota' => 5000000,
         'user_quota' => 50000000,
         'monthly_quota' => 15000000,
+        'uploads' => true,
         ),
         'group' =>
         array('maxaliases' => 3),
+        'oohembed' => array('endpoint' => 'http://oohembed.com/oohembed/')
         );
 
 $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options');
index 0ad36585662c3f9bf83baf730231b14b16150031..a36b7f31f752047e733f9d5fd41865923e283522 100644 (file)
@@ -90,7 +90,9 @@ class NoticeForm extends Form
             $this->user = common_current_user();
         }
 
-        $this->enctype = 'multipart/form-data';
+        if (common_config('attachments', 'uploads')) {
+            $this->enctype = 'multipart/form-data';
+        }
     }
 
     /**
@@ -148,12 +150,14 @@ class NoticeForm extends Form
         $this->out->element('dd', array('id' => 'notice_text-count'),
                             '140');
         $this->out->elementEnd('dl');
-        $this->out->element('label', array('for' => 'notice_data-attach'),_('Attach'));
-        $this->out->element('input', array('id' => 'notice_data-attach',
-                                           'type' => 'file',
-                                           'name' => 'attach',
-                                           'title' => _('Attach a file')));
-        $this->out->hidden('MAX_FILE_SIZE', common_config('attachments', 'file_quota'));
+        if (common_config('attachments', 'uploads')) {
+            $this->out->hidden('MAX_FILE_SIZE', common_config('attachments', 'file_quota'));
+            $this->out->element('label', array('for' => 'notice_data-attach'),_('Attach'));
+            $this->out->element('input', array('id' => 'notice_data-attach',
+                                               'type' => 'file',
+                                               'name' => 'attach',
+                                               'title' => _('Attach a file')));
+        }
         if ($this->action) {
             $this->out->hidden('notice_return-to', $this->action, 'returnto');
         }
index 0fbaba9ed5a9d1bb00c79d4a68b3d8752ed5ad09..8b6f636182d7e5fc16168e306ad8dd71976ad2f8 100644 (file)
@@ -351,7 +351,8 @@ class Router
 
         $m->connect('api/favorites/:method/:argument',
                     array('action' => 'api',
-                          'apiaction' => 'favorites'));
+                          'apiaction' => 'favorites',
+                          array('method' => '(create|destroy)')));
 
         $m->connect('api/favorites/:argument',
                     array('action' => 'api',
index 569bc6d7a21fb55194ea333b5ba4779967439bd2..269b60efc63eafb4fe180075376adaa45a3c93ac 100644 (file)
@@ -545,7 +545,7 @@ class TwitterapiAction extends Action
             $this->init_twitter_atom();
             break;
         default:
-            $this->client_error(_('Not a supported data format.'));
+            $this->clientError(_('Not a supported data format.'));
             break;
         }
 
@@ -573,13 +573,13 @@ class TwitterapiAction extends Action
             $this->end_twitter_rss();
             break;
         default:
-            $this->client_error(_('Not a supported data format.'));
+            $this->clientError(_('Not a supported data format.'));
             break;
         }
         return;
     }
 
-    function client_error($msg, $code = 400, $content_type = 'json')
+    function clientError($msg, $code = 400, $content_type = 'json')
     {
 
         static $status = array(400 => 'Bad Request',
@@ -666,7 +666,7 @@ class TwitterapiAction extends Action
             $this->show_json_objects($profile_array);
             break;
         default:
-            $this->client_error(_('Not a supported data format.'));
+            $this->clientError(_('Not a supported data format.'));
             return;
         }
         return;
index 794fa9f643a80d69641b2ff9ac98e473921381e6..2153ce9a01e03f00866899826c38778fb26230a7 100644 (file)
@@ -155,7 +155,8 @@ font-weight:bold;
 #form_invite legend,
 #form_notice_delete legend,
 #form_password_recover legend,
-#form_password_change legend {
+#form_password_change legend,
+.form_entity_block legend {
 display:none;
 }
 
@@ -629,7 +630,8 @@ display:block;
 .entity_send-a-message a,
 .entity_edit a,
 .form_user_nudge input.submit,
-.entity_nudge p {
+.entity_nudge p,
+.form_make_admin input.submit {
 border:0;
 padding-left:20px;
 }
diff --git a/theme/base/images/icons/twotone/green/admin.gif b/theme/base/images/icons/twotone/green/admin.gif
new file mode 100644 (file)
index 0000000..10fa431
Binary files /dev/null and b/theme/base/images/icons/twotone/green/admin.gif differ
index f0d6dace8c54dcd581beb8ff4a9fe14f4a6eb1eb..935116a74fdea834b2fb934c882447d1cbda8048 100644 (file)
@@ -65,7 +65,8 @@ div.notice-options input,
 .entity_send-a-message a,
 .form_user_nudge input.submit,
 .entity_nudge p,
-.form_settings input.form_action-primary {
+.form_settings input.form_action-primary,
+.form_make_admin input.submit {
 color:#002E6E;
 }
 
@@ -166,7 +167,8 @@ background-image:url(../../base/images/icons/icon_foaf.gif);
 .form_user_unblock input.submit,
 .form_group_block input.submit,
 .form_group_unblock input.submit,
-.entity_nudge p {
+.entity_nudge p,
+.form_make_admin input.submit {
 background-position: 0 40%;
 background-repeat: no-repeat;
 background-color:transparent;
@@ -200,6 +202,9 @@ background-image:url(../../base/images/icons/twotone/green/mail.gif);
 .form_group_unblock input.submit {
 background-image:url(../../base/images/icons/twotone/green/shield.gif);
 }
+.form_make_admin input.submit {
+background-image:url(../../base/images/icons/twotone/green/admin.gif);
+}
 
 /* NOTICES */
 .notice .attachment {
@@ -226,13 +231,11 @@ background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-r
 }
 
 .notices div.entry-content,
-.notices div.notice-options,
-.notices li.hover .notices div.entry-content,
-.notices li.hover .notices div.notice-options {
+.notices div.notice-options {
 opacity:0.4;
 }
-.notices li.hover div.entry-content,
-.notices li.hover div.notice-options {
+.notices li:hover div.entry-content,
+.notices li:hover div.notice-options {
 opacity:1;
 }
 div.entry-content {
@@ -242,9 +245,12 @@ div.notice-options a,
 div.notice-options input {
 font-family:sans-serif;
 }
-.notices li.hover {
+.notices li:hover {
 background-color:#FCFCFC;
 }
+#conversation .notices li:hover {
+background-color:transparent;
+}
 
 .notices .notices {
 background-color:rgba(200, 200, 200, 0.050);
index 25a01abe0bf89edd3bef05251dba397af62ff6b3..6845fda5f94d474ec27f6bb66edf912f1bf1fbd6 100644 (file)
@@ -65,7 +65,8 @@ div.notice-options input,
 .entity_send-a-message a,
 .form_user_nudge input.submit,
 .entity_nudge p,
-.form_settings input.form_action-primary {
+.form_settings input.form_action-primary,
+.form_make_admin input.submit {
 color:#002E6E;
 }
 
@@ -166,7 +167,8 @@ background-image:url(../../base/images/icons/icon_foaf.gif);
 .form_user_unblock input.submit,
 .form_group_block input.submit,
 .form_group_unblock input.submit,
-.entity_nudge p {
+.entity_nudge p,
+.form_make_admin input.submit {
 background-position: 0 40%;
 background-repeat: no-repeat;
 background-color:transparent;
@@ -200,6 +202,9 @@ background-image:url(../../base/images/icons/twotone/green/mail.gif);
 .form_group_unblock input.submit {
 background-image:url(../../base/images/icons/twotone/green/shield.gif);
 }
+.form_make_admin input.submit {
+background-image:url(../../base/images/icons/twotone/green/admin.gif);
+}
 
 /* NOTICES */
 .notice .attachment {
@@ -226,13 +231,11 @@ background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-r
 }
 
 .notices div.entry-content,
-.notices div.notice-options,
-.notices li.hover .notices div.entry-content,
-.notices li.hover .notices div.notice-options {
+.notices div.notice-options {
 opacity:0.4;
 }
-.notices li.hover div.entry-content,
-.notices li.hover div.notice-options {
+.notices li:hover div.entry-content,
+.notices li:hover div.notice-options {
 opacity:1;
 }
 div.entry-content {
@@ -242,9 +245,12 @@ div.notice-options a,
 div.notice-options input {
 font-family:sans-serif;
 }
-.notices li.hover {
+.notices li:hover {
 background-color:#FCFCFC;
 }
+#conversation .notices li:hover {
+background-color:transparent;
+}
 
 .notices .notices {
 background-color:rgba(200, 200, 200, 0.050);