]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.7.x' into 0.8.x
authorEvan Prodromou <evan@controlyourself.ca>
Fri, 6 Feb 2009 20:38:10 +0000 (15:38 -0500)
committerEvan Prodromou <evan@controlyourself.ca>
Fri, 6 Feb 2009 20:38:10 +0000 (15:38 -0500)
80 files changed:
README
actions/all.php
actions/avatarbynickname.php
actions/avatarsettings.php
actions/deletenotice.php
actions/facebookhome.php
actions/facebookinvite.php
actions/favorited.php
actions/finishopenidlogin.php
actions/grouplogo.php
actions/login.php
actions/newnotice.php
actions/noticesearch.php
actions/openidlogin.php
actions/opensearch.php
actions/public.php
actions/replies.php
actions/showfavorites.php
actions/showgroup.php
actions/showstream.php
actions/smssettings.php
actions/tag.php
actions/tagother.php
actions/tagrss.php
actions/twitapistatuses.php
actions/twittersettings.php
actions/usergroups.php
classes/Avatar.php
classes/Channel.php
classes/Profile.php
classes/User.php
classes/User_group.php
db/laconica_pg.sql
js/facebookapp.js
lib/action.php
lib/common.php
lib/error.php
lib/facebookaction.php
lib/htmloutputter.php
lib/imagefile.php
lib/jabber.php
lib/mailbox.php
lib/noticelist.php
lib/noticesection.php
lib/personal.php
lib/popularnoticesection.php
lib/profilelist.php
lib/profileminilist.php
lib/profilesection.php
lib/rssaction.php
lib/settingsaction.php
lib/twitterapi.php
lib/util.php
scripts/enjitqueuehandler.php
theme/base/css/display.css
theme/base/css/facebookapp.css
theme/base/images/icons/icon_atom.jpg [deleted file]
theme/base/images/icons/icon_atom.png [new file with mode: 0644]
theme/base/images/icons/icon_rss.jpg [deleted file]
theme/base/images/icons/icon_rss.png [new file with mode: 0644]
theme/default/bg-body.gif [deleted file]
theme/default/bg-header.gif [deleted file]
theme/default/css/display.css
theme/default/css/ie.css [new file with mode: 0644]
theme/default/display.css [deleted file]
theme/default/icon_feed.jpg [deleted file]
theme/default/icon_foaf.gif [deleted file]
theme/default/icon_heart-01.gif [deleted file]
theme/default/icon_heart-02.gif [deleted file]
theme/default/icon_tag-01.gif [deleted file]
theme/default/ie6.css [deleted file]
theme/default/ie7.css [deleted file]
theme/default/login-bg.gif [deleted file]
theme/identica/bg-body.gif [deleted file]
theme/identica/bg-header.gif [deleted file]
theme/identica/css/display.css
theme/identica/display.css [deleted file]
theme/identica/ie6.css [deleted file]
theme/identica/ie7.css [deleted file]
theme/identica/login-bg.gif [deleted file]

diff --git a/README b/README
index 9a2dfb7574774c1aeee020e5a104ffc043b74d4c..2c9ae84d93134dd5ba3155cb14dc1d353b84f788 100644 (file)
--- a/README
+++ b/README
@@ -2,8 +2,8 @@
 README
 ------
 
-Laconica 0.7.0 ("Rockville")
-30 January 2009
+Laconica 0.7.1 ("West of the Fields")
+6 February 2009
 
 This is the README file for Laconica, the Open Source microblogging
 platform. It includes installation instructions, descriptions of
@@ -71,8 +71,27 @@ for additional terms.
 New this version
 ================
 
-This is a major feature release, and includes some bug fixes from the
-previous version (0.6.4, released December 14 2008.)
+This is a minor bug-fix release since version 0.7.0, released Jan 29
+2009. Notable changes this version:
+
+- Vast improvement in auto-linking to URLs.
+- Link to group search from user's group page
+- Improved interface in Facebook application
+- Fix bad redirects in delete notice
+- Updated PostgreSQL database creation script
+- Show filesize in avatar/logo upload
+- Vastly improved avatar/logo upload
+- Allow re-authentication with OpenID
+- Correctly link hashtabs inside parens and brackets
+- Group and avatar image transparency works
+- Better handling of commands through the Web and Ajax channels
+- Fix links for profile page feeds
+- Fixed destroy method in API
+- Fix endpoint of Connect menu when XMPP disabled
+- Show number of group members
+- Enable configuration files in /etc/laconica/
+
+Changes in version 0.7.0:
 
 - Support for groups. Users can join groups and send themed notices
   to those groups. All other members of the group receive the notices.
@@ -203,9 +222,9 @@ especially if you've previously installed PHP/MySQL packages.
 1. Unpack the tarball you downloaded on your Web server. Usually a
    command like this will work:
 
-          tar zxf laconica-0.7.0.tar.gz
+          tar zxf laconica-0.7.1.tar.gz
 
-   ...which will make a laconica-0.7.0 subdirectory in your current
+   ...which will make a laconica-0.7.1 subdirectory in your current
    directory. (If you don't have shell access on your Web server, you
    may have to unpack the tarball on your local computer and FTP the
    files to the server.)
@@ -213,7 +232,7 @@ especially if you've previously installed PHP/MySQL packages.
 2. Move the tarball to a directory of your choosing in your Web root
    directory. Usually something like this will work:
 
-          mv laconica-0.7.0 /var/www/mublog
+          mv laconica-0.7.1 /var/www/mublog
 
    This will make your Laconica instance available in the mublog path of
    your server, like "http://example.net/mublog". "microblog" or
@@ -657,7 +676,7 @@ Upgrading
 If you've been using Laconica 0.6, 0.5 or lower, or if you've been
 tracking the "git" version of the software, you will probably want
 to upgrade and keep your existing data. There is no automated upgrade
-procedure in Laconica 0.7.0. Try these step-by-step instructions; read
+procedure in Laconica 0.7.1. Try these step-by-step instructions; read
 to the end first before trying them.
 
 0. Download Laconica and set up all the prerequisites as if you were
@@ -1074,7 +1093,7 @@ repository (see below), and you get a compilation error ("unexpected
 T_STRING") in the browser, check to see that you don't have any
 conflicts in your code.
 
-If you upgraded to Laconica 0.7.0 without reading the "Notice inboxes"
+If you upgraded to Laconica 0.7.1 without reading the "Notice inboxes"
 section above, and all your users' 'Personal' tabs are empty, read the
 "Notice inboxes" section above.
 
@@ -1159,6 +1178,7 @@ if anyone's been overlooked in error.
 * Meitar Moscovitz
 * Ken Sheppardson (Trac server, man-about-town)
 * Tiago 'gouki' Faria (i18n managerx)
+* Sean Murphy
 
 Thanks also to the developers of our upstream library code and to the
 thousands of people who have tried out Identi.ca, installed Laconi.ca,
index 428466f243edb7555b8d12de3a4a99418e114f53..d75d1b94612b8f6adc42cd5f22c61490fed98a6f 100644 (file)
@@ -42,6 +42,9 @@ class AllAction extends Action
         if (!$this->page) {
             $this->page = 1;
         }
+        
+        common_set_returnto($this->selfUrl());
+        
         return true;
     }
 
@@ -101,4 +104,15 @@ class AllAction extends Action
         $this->pagination($this->page > 1, $cnt > NOTICES_PER_PAGE,
                           $this->page, 'all', array('nickname' => $this->user->nickname));
     }
+
+    function showPageTitle()
+    {
+        $user =& common_current_user();
+        if ($user && ($user->id == $this->user->id)) {
+            $this->element('h1', NULL, _("You and friends"));
+        } else { 
+            $this->element('h1', NULL, sprintf(_('%s and friends'), $this->user->nickname));
+        }
+    }
+
 }
index 9bbdecefac8c9f498cda453dfeb4662cec276d17..ca58c965374f11a4e0e5ed8a38821dfff0c6bd18 100644 (file)
@@ -90,9 +90,9 @@ class AvatarbynicknameAction extends Action
             $url = $avatar->url;
         } else {
             if ($size == 'original') {
-                $url = common_default_avatar(AVATAR_PROFILE_SIZE);
+                $url = Avatar::defaultImage(AVATAR_PROFILE_SIZE);
             } else {
-                $url = common_default_avatar($size+0);
+                $url = Avatar::defaultImage($size+0);
             }
         }
         common_redirect($url, 302);
index 19f53b882850d62e60e74c16b7b398a7c99e620f..7dd53f6eb5af40f4e959d4a79a28f6ef5f988808 100644 (file)
@@ -34,6 +34,8 @@ if (!defined('LACONICA')) {
 
 require_once INSTALLDIR.'/lib/accountsettingsaction.php';
 
+define('MAX_ORIGINAL', 480);
+
 /**
  * Upload an avatar
  *
@@ -73,7 +75,7 @@ class AvatarsettingsAction extends AccountSettingsAction
 
     function getInstructions()
     {
-        return _('You can upload your personal avatar.');
+        return sprintf(_('You can upload your personal avatar. The maximum file size is %s.'), ImageFile::maxFileSize());
     }
 
     /**
@@ -153,7 +155,7 @@ class AvatarsettingsAction extends AccountSettingsAction
         $this->element('input', array('name' => 'MAX_FILE_SIZE',
                                       'type' => 'hidden',
                                       'id' => 'MAX_FILE_SIZE',
-                                      'value' => MAX_AVATAR_SIZE));
+                                      'value' => ImageFile::maxFileSizeInt()));
         $this->elementEnd('li');
         $this->elementEnd('ul');
 
@@ -198,7 +200,7 @@ class AvatarsettingsAction extends AccountSettingsAction
                                   'class' => 'avatar_view'));
         $this->element('h2', null, _("Original"));
         $this->elementStart('div', array('id'=>'avatar_original_view'));
-        $this->element('img', array('src' => common_avatar_url($this->filedata['filename']),
+        $this->element('img', array('src' => Avatar::url($this->filedata['filename']),
                                     'width' => $this->filedata['width'],
                                     'height' => $this->filedata['height'],
                                     'alt' => $user->nickname));
@@ -210,7 +212,7 @@ class AvatarsettingsAction extends AccountSettingsAction
                                   'class' => 'avatar_view'));
         $this->element('h2', null, _("Preview"));
         $this->elementStart('div', array('id'=>'avatar_preview_view'));
-        $this->element('img', array('src' => common_avatar_url($this->filedata['filename']),
+        $this->element('img', array('src' => Avatar::url($this->filedata['filename']),
                                     'width' => AVATAR_PROFILE_SIZE,
                                     'height' => AVATAR_PROFILE_SIZE,
                                     'alt' => $user->nickname));
@@ -279,14 +281,14 @@ class AvatarsettingsAction extends AccountSettingsAction
 
         $cur = common_current_user();
 
-        $filename = common_avatar_filename($cur->id,
-                                           image_type_to_extension($imagefile->type),
-                                           null,
-                                           'tmp'.common_timestamp());
+        $filename = Avatar::filename($cur->id,
+                                     image_type_to_extension($imagefile->type),
+                                     null,
+                                     'tmp'.common_timestamp());
 
-        $filepath = common_avatar_path($filename);
+        $filepath = Avatar::path($filename);
 
-        move_uploaded_file($imagefile->filename, $filepath);
+        move_uploaded_file($imagefile->filepath, $filepath);
 
         $filedata = array('filename' => $filename,
                           'filepath' => $filepath,
@@ -312,15 +314,6 @@ class AvatarsettingsAction extends AccountSettingsAction
 
     function cropAvatar()
     {
-        $user = common_current_user();
-
-        $profile = $user->getProfile();
-
-        $x = $this->arg('avatar_crop_x');
-        $y = $this->arg('avatar_crop_y');
-        $w = $this->arg('avatar_crop_w');
-        $h = $this->arg('avatar_crop_h');
-
         $filedata = $_SESSION['FILEDATA'];
 
         if (!$filedata) {
@@ -328,68 +321,22 @@ class AvatarsettingsAction extends AccountSettingsAction
             return;
         }
 
-        $filepath = common_avatar_path($filedata['filename']);
-
-        if (!file_exists($filepath)) {
-            $this->serverError(_('Lost our file.'));
-            return;
-        }
-
-        switch ($filedata['type']) {
-        case IMAGETYPE_GIF:
-            $image_src = imagecreatefromgif($filepath);
-            break;
-        case IMAGETYPE_JPEG:
-            $image_src = imagecreatefromjpeg($filepath);
-            break;
-        case IMAGETYPE_PNG:
-            $image_src = imagecreatefrompng($filepath);
-            break;
-         default:
-            $this->serverError(_('Unknown file type'));
-            return;
-        }
-
-        common_debug("W = $w, H = $h, X = $x, Y = $y");
-
-        $image_dest = imagecreatetruecolor($w, $h);
-
-        $background = imagecolorallocate($image_dest, 0, 0, 0);
-        ImageColorTransparent($image_dest, $background);
-        imagealphablending($image_dest, false);
-
-        imagecopyresized($image_dest, $image_src, 0, 0, $x, $y, $w, $h, $w, $h);
-
-        $cur = common_current_user();
-
-        $filename = common_avatar_filename($cur->id,
-                                           image_type_to_extension($filedata['type']),
-                                           null,
-                                           common_timestamp());
-
-        $filepath = common_avatar_path($filename);
-
-        switch ($filedata['type']) {
-        case IMAGETYPE_GIF:
-            imagegif($image_dest, $filepath);
-            break;
-        case IMAGETYPE_JPEG:
-            imagejpeg($image_dest, $filepath);
-            break;
-        case IMAGETYPE_PNG:
-            imagepng($image_dest, $filepath);
-            break;
-         default:
-            $this->serverError(_('Unknown file type'));
-            return;
-        }
+        // If image is not being cropped assume pos & dimentions of original
+        $dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0;
+        $dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0;
+        $dest_w = $this->arg('avatar_crop_w') ? $this->arg('avatar_crop_w'):$filedata['width'];
+        $dest_h = $this->arg('avatar_crop_h') ? $this->arg('avatar_crop_h'):$filedata['height'];
+        $size = min($dest_w, $dest_h);
+        $size = ($size > MAX_ORIGINAL) ? MAX_ORIGINAL:$size;
 
         $user = common_current_user();
+        $profile = $user->getProfile();
 
-        $profile = $cur->getProfile();
+        $imagefile = new ImageFile($user->id, $filedata['filepath']);
+        $filename = $imagefile->resize($size, $dest_x, $dest_y, $dest_w, $dest_h);
 
-        if ($profile->setOriginal($filepath)) {
-            @unlink(common_avatar_path($filedata['filename']));
+        if ($profile->setOriginal($filename)) {
+            @unlink($filedata['filepath']);
             unset($_SESSION['FILEDATA']);
             $this->mode = 'upload';
             $this->showForm(_('Avatar updated.'), true);
@@ -426,12 +373,14 @@ class AvatarsettingsAction extends AccountSettingsAction
     {
         parent::showScripts();
 
-        $jcropPack = common_path('js/jcrop/jquery.Jcrop.pack.js');
-        $jcropGo   = common_path('js/jcrop/jquery.Jcrop.go.js');
+        if ($this->mode == 'crop') {
+            $jcropPack = common_path('js/jcrop/jquery.Jcrop.pack.js');
+            $jcropGo   = common_path('js/jcrop/jquery.Jcrop.go.js');
 
-        $this->element('script', array('type' => 'text/javascript',
-                                       'src' => $jcropPack));
-        $this->element('script', array('type' => 'text/javascript',
-                                       'src' => $jcropGo));
+            $this->element('script', array('type' => 'text/javascript',
+                                           'src' => $jcropPack));
+            $this->element('script', array('type' => 'text/javascript',
+                                           'src' => $jcropGo));
+        }
     }
 }
index d4b8e50e5e4cd5e397cec27f1279e35d9937ef8e..16e2df8899ab0338a6dcf94fc626e72c6719fbbe 100644 (file)
@@ -103,17 +103,18 @@ class DeletenoticeAction extends DeleteAction
 
     function showContent()
     {
-        $this->elementStart('form', array('id' => 'notice_delete_form',
+        $this->elementStart('form', array('id' => 'form_notice_delete',
+                                          'class' => 'form_settings',
                                           'method' => 'post',
                                           'action' => common_local_url('deletenotice')));
+        $this->elementStart('fieldset');
+        $this->element('legend', null, _('Delete notice'));
         $this->hidden('token', common_session_token());
         $this->hidden('notice', $this->trimmed('notice'));
-        $this->elementStart('p');
-        $this->element('span', array('id' => 'confirmation_text'),
-                       _('Are you sure you want to delete this notice?'));
-        $this->submit('yes', _('Yes'));
-        $this->submit('no', _('No'));
-        $this->elementEnd('p');
+        $this->element('p', null, _('Are you sure you want to delete this notice?'));
+        $this->submit('form_action-yes', _('Yes'), 'submit form_action-primary', 'yes');
+        $this->submit('form_action-no', _('No'), 'submit form_action-secondary', 'no');
+        $this->elementEnd('fieldset');
         $this->elementEnd('form');
     }
 
index d943104c2b3b6ff1038e279a98ce2b0014713d5b..5946e6c984b36190428c31c28c095f43b12180e8 100644 (file)
@@ -148,14 +148,11 @@ class FacebookhomeAction extends FacebookAction
 
     function showNoticeForm()
     {
-        
         $post_action = "$this->app_uri/index.php";
         
         $notice_form = new FacebookNoticeForm($this, $post_action, null, 
             $post_action, $this->user);
         $notice_form->show();
-    
-    
     }
 
     function title()
@@ -169,7 +166,6 @@ class FacebookhomeAction extends FacebookAction
 
     function showContent()
     {
-
         $notice = $this->user->noticesWithFriends(($this->page-1) *
             NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
         
@@ -179,7 +175,6 @@ class FacebookhomeAction extends FacebookAction
 
         $this->pagination($this->page > 1, $cnt > NOTICES_PER_PAGE,
                           $this->page, 'index.php', array('nickname' => $this->user->nickname));
-
     }
 
     function showNoticeList($notice)
index b7224783a7d7c8e0a7dd5dff338287be67f76d57..3c872f94bf2901fd5e13d3a17fa2d8fc6d82e11f 100644 (file)
@@ -73,7 +73,7 @@ class FacebookinviteAction extends FacebookAction
 
         $friend_ids = $_POST['ids']; // XXX: Hmm... is this the best way to acces the list?
 
-        $this->elementStart("ul");
+        $this->elementStart('ul', array('id' => 'facebook-friends'));
 
         foreach ($friend_ids as $friend) {
             $this->elementStart('li');
@@ -112,11 +112,11 @@ class FacebookinviteAction extends FacebookAction
 
         $this->element('h2', null, sprintf(_('Friends already using %s:'), 
             common_config('site', 'name')));
-        $this->elementStart("ul");
-
+        $this->elementStart('ul', array('id' => 'facebook-friends'));
+        
         foreach ($exclude_ids as $friend) {
             $this->elementStart('li');
-            $this->element('fb:profile-pic', array('uid' => $friend));
+            $this->element('fb:profile-pic', array('uid' => $friend, 'size' => 'square'));
             $this->element('fb:name', array('uid' => $friend,
                                             'capitalize' => 'true'));
             $this->elementEnd('li');
index 4155b3a234d22f036f16a77220ed71ea4b982cae..fd5ff413cbbfd9cc8f0ac478c7aa084a7c0d43ca 100644 (file)
@@ -104,6 +104,9 @@ class FavoritedAction extends Action
     {
         parent::prepare($args);
         $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+        
+        common_set_returnto($this->selfUrl());
+        
         return true;
     }
 
index 880a9505b4c07d7294bb64961018183c84fd3fd0..bc91511207653fd2e0ad1fa910afeba632ece3ae 100644 (file)
@@ -30,7 +30,7 @@ class FinishopenidloginAction extends Action
     function handle($args)
     {
         parent::handle($args);
-        if (common_logged_in()) {
+        if (common_is_real_login()) {
             $this->clientError(_('Already logged in.'));
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
             $token = $this->trimmed('token');
index ba9cdfe2ab2aab1404f1915a61d728c3d6f4c2fe..499db4ae8d7da865da7c5aaf037b147bbb3cab17 100644 (file)
@@ -152,7 +152,7 @@ class GrouplogoAction extends Action
 
     function getInstructions()
     {
-        return _('You can upload a logo image for your group.');
+        return sprintf(_('You can upload a logo image for your group. The maximum file size is %s.'), ImageFile::maxFileSize());
     }
 
     /**
@@ -229,7 +229,7 @@ class GrouplogoAction extends Action
         $this->element('input', array('name' => 'MAX_FILE_SIZE',
                                       'type' => 'hidden',
                                       'id' => 'MAX_FILE_SIZE',
-                                      'value' => MAX_AVATAR_SIZE));
+                                      'value' => ImageFile::maxFileSizeInt()));
         $this->elementEnd('li');
         $this->elementEnd('ul');
 
@@ -263,7 +263,7 @@ class GrouplogoAction extends Action
                                   'class' => 'avatar_view'));
         $this->element('h2', null, _("Original"));
         $this->elementStart('div', array('id'=>'avatar_original_view'));
-        $this->element('img', array('src' => common_avatar_url($this->filedata['filename']),
+        $this->element('img', array('src' => Avatar::url($this->filedata['filename']),
                                     'width' => $this->filedata['width'],
                                     'height' => $this->filedata['height'],
                                     'alt' => $this->group->nickname));
@@ -275,7 +275,7 @@ class GrouplogoAction extends Action
                                   'class' => 'avatar_view'));
         $this->element('h2', null, _("Preview"));
         $this->elementStart('div', array('id'=>'avatar_preview_view'));
-        $this->element('img', array('src' => common_avatar_url($this->filedata['filename']),
+        $this->element('img', array('src' => Avatar::url($this->filedata['filename']),
                                     'width' => AVATAR_PROFILE_SIZE,
                                     'height' => AVATAR_PROFILE_SIZE,
                                     'alt' => $this->group->nickname));
@@ -343,14 +343,14 @@ class GrouplogoAction extends Action
             return;
         }
 
-        $filename = common_avatar_filename($this->group->id,
-                                           image_type_to_extension($imagefile->type),
-                                           null,
-                                           'group-temp-'.common_timestamp());
+        $filename = Avatar::filename($this->group->id,
+                                     image_type_to_extension($imagefile->type),
+                                     null,
+                                     'group-temp-'.common_timestamp());
 
-        $filepath = common_avatar_path($filename);
+        $filepath = Avatar::path($filename);
 
-        move_uploaded_file($imagefile->filename, $filepath);
+        move_uploaded_file($imagefile->filepath, $filepath);
 
         $filedata = array('filename' => $filename,
                           'filepath' => $filepath,
@@ -364,7 +364,7 @@ class GrouplogoAction extends Action
 
         $this->mode = 'crop';
 
-        $this->showForm(_('Pick a square area of the image to be your avatar'),
+        $this->showForm(_('Pick a square area of the image to be the logo.'),
                         true);
     }
 
@@ -376,10 +376,6 @@ class GrouplogoAction extends Action
 
     function cropLogo()
     {
-        $user = common_current_user();
-
-        $profile = $user->getProfile();
-
         $filedata = $_SESSION['FILEDATA'];
 
         if (!$filedata) {
@@ -387,69 +383,19 @@ class GrouplogoAction extends Action
             return;
         }
 
-        $x = $this->arg('avatar_crop_x');
-        $y = $this->arg('avatar_crop_y');
-        $w = ($this->arg('avatar_crop_w')) ? $this->arg('avatar_crop_w') : $filedata['width'];
-        $h = ($this->arg('avatar_crop_h')) ? $this->arg('avatar_crop_h') : $filedata['height'];
+        // If image is not being cropped assume pos & dimentions of original
+        $dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0;
+        $dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0;
+        $dest_w = $this->arg('avatar_crop_w') ? $this->arg('avatar_crop_w'):$filedata['width'];
+        $dest_h = $this->arg('avatar_crop_h') ? $this->arg('avatar_crop_h'):$filedata['height'];
+        $size = min($dest_w, $dest_h);
+        $size = ($size > MAX_ORIGINAL) ? MAX_ORIGINAL:$size;
 
-        $filepath = common_avatar_path($filedata['filename']);
-
-        if (!file_exists($filepath)) {
-            $this->serverError(_('Lost our file.'));
-            return;
-        }
-
-        switch ($filedata['type']) {
-        case IMAGETYPE_GIF:
-            $image_src = imagecreatefromgif($filepath);
-            break;
-        case IMAGETYPE_JPEG:
-            $image_src = imagecreatefromjpeg($filepath);
-            break;
-        case IMAGETYPE_PNG:
-            $image_src = imagecreatefrompng($filepath);
-            break;
-         default:
-            $this->serverError(_('Unknown file type'));
-            return;
-        }
-
-        $size = ($w > MAX_ORIGINAL) ? MAX_ORIGINAL : $w;
-
-        $image_dest = imagecreatetruecolor($size, $size);
-
-        $background = imagecolorallocate($image_dest, 0, 0, 0);
-        ImageColorTransparent($image_dest, $background);
-        imagealphablending($image_dest, false);
-
-        imagecopyresized($image_dest, $image_src,
-                         0, 0, $x, $y,
-                         $size, $size, $w, $h);
-
-        $filename = common_avatar_filename($this->group->id,
-                                           image_type_to_extension($filedata['type']),
-                                           null,
-                                           'group-'.common_timestamp());
-
-        $filepath = common_avatar_path($filename);
-
-        switch ($filedata['type']) {
-        case IMAGETYPE_GIF:
-            imagegif($image_dest, $filepath);
-            break;
-        case IMAGETYPE_JPEG:
-            imagejpeg($image_dest, $filepath);
-            break;
-        case IMAGETYPE_PNG:
-            imagepng($image_dest, $filepath);
-            break;
-         default:
-            $this->serverError(_('Unknown file type'));
-            return;
-        }
+        $imagefile = new ImageFile($this->group->id, $filedata['filepath']);
+        $filename = $imagefile->resize($size, $dest_x, $dest_y, $dest_w, $dest_h);
 
-        if ($this->group->setOriginal($filename, $filedata['type'])) {
-            @unlink(common_avatar_path($filedata['filename']));
+        if ($this->group->setOriginal($filename)) {
+            @unlink($filedata['filepath']);
             unset($_SESSION['FILEDATA']);
             $this->mode = 'upload';
             $this->showForm(_('Logo updated.'), true);
index 11cf1f02a6e77b9bea67664acde0977205e34a6d..71e4679292c79102dd97f80f6683a655dfef5535 100644 (file)
@@ -78,6 +78,7 @@ class LoginAction extends Action
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
             $this->checkLogin();
         } else {
+            common_ensure_session();
             $this->showForm();
         }
     }
@@ -96,7 +97,7 @@ class LoginAction extends Action
     {
         // XXX: login throttle
 
-        // CSRF protection - token set in common_notice_form()
+        // CSRF protection - token set in NoticeForm
         $token = $this->trimmed('token');
         if (!$token || $token != common_session_token()) {
             $this->clientError(_('There was a problem with your session token. '.
@@ -106,35 +107,14 @@ class LoginAction extends Action
 
         $nickname = common_canonical_nickname($this->trimmed('nickname'));
         $password = $this->arg('password');
-        if (common_check_user($nickname, $password)) {
-            // success!
-            if (!common_set_user($nickname)) {
-                $this->serverError(_('Error setting user.'));
-                return;
-            }
-            common_real_login(true);
-            if ($this->boolean('rememberme')) {
-                common_debug('Adding rememberme cookie for ' . $nickname);
-                common_rememberme();
-            }
-            // success!
-            $url = common_get_returnto();
-            if ($url) {
-                // We don't have to return to it again
-                common_set_returnto(null);
-            } else {
-                $url = common_local_url('all',
-                                        array('nickname' =>
-                                              $nickname));
-            }
-            common_redirect($url);
-        } else {
+
+        if (!common_check_user($nickname, $password)) {
             $this->showForm(_('Incorrect username or password.'));
             return;
         }
 
         // success!
-        if (!common_set_user($user)) {
+        if (!common_set_user($nickname)) {
             $this->serverError(_('Error setting user.'));
             return;
         }
@@ -142,11 +122,11 @@ class LoginAction extends Action
         common_real_login(true);
 
         if ($this->boolean('rememberme')) {
-            common_debug('Adding rememberme cookie for ' . $nickname);
             common_rememberme($user);
         }
-        // success!
+
         $url = common_get_returnto();
+
         if ($url) {
             // We don't have to return to it again
             common_set_returnto(null);
@@ -155,6 +135,7 @@ class LoginAction extends Action
                                     array('nickname' =>
                                           $nickname));
         }
+
         common_redirect($url);
     }
 
index 5142cb5ff2894b3ac9f6e961519f9531ec8651d4..5e7691f33d1cae68442b8b18b4c643eb3deca24b 100644 (file)
@@ -90,7 +90,7 @@ class NewnoticeAction extends Action
             $this->clientError(_('Not logged in.'));
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
 
-            // CSRF protection - token set in common_notice_form()
+            // CSRF protection
             $token = $this->trimmed('token');
             if (!$token || $token != common_session_token()) {
                 $this->clientError(_('There was a problem with your session token. '.
@@ -141,9 +141,9 @@ class NewnoticeAction extends Action
 
         if ($cmd) {
             if ($this->boolean('ajax')) {
-                $cmd->execute(new AjaxWebChannel());
+                $cmd->execute(new AjaxWebChannel($this));
             } else {
-                $cmd->execute(new WebChannel());
+                $cmd->execute(new WebChannel($this));
             }
             return;
         }
@@ -195,7 +195,7 @@ class NewnoticeAction extends Action
 
     function ajaxErrorMsg($msg)
     {
-        common_start_html('text/xml;charset=utf-8', true);
+        $this->startHTML('text/xml;charset=utf-8', true);
         $this->elementStart('head');
         $this->element('title', null, _('Ajax Error'));
         $this->elementEnd('head');
index a0d723b1235d7425b31eb1d79247960f442eb4bb..a5f01350c4c732bfd1fab1e87ecb8b57873c9ee5 100644 (file)
@@ -48,6 +48,16 @@ require_once INSTALLDIR.'/lib/searchaction.php';
  */
 class NoticesearchAction extends SearchAction
 {
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        common_set_returnto($this->selfUrl());
+
+        return true;
+    }
+    
     /**
      * Get instructions
      * 
@@ -154,8 +164,9 @@ class NoticesearchAction extends SearchAction
         $this->elementStart('div', 'entry-title');
         $this->elementStart('span', 'vcard author');
         $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
-        $this->elementStart('a', array('href' => $profile->profileurl));
-        $this->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
+        $this->elementStart('a', array('href' => $profile->profileurl,
+                                       'class' => 'url'));
+        $this->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE),
                                     'class' => 'avatar photo',
                                     'width' => AVATAR_STREAM_SIZE,
                                     'height' => AVATAR_STREAM_SIZE,
@@ -223,15 +234,6 @@ class NoticesearchAction extends SearchAction
         $this->elementEnd('a');
         $this->elementEnd('dd');
         $this->elementEnd('dl');
-
-        $this->elementStart('a',
-                             array('href' => common_local_url('newnotice',
-                                                              array('replyto' => $profile->nickname)),
-                                   'onclick' => 'doreply("'.$profile->nickname.'"); return false',
-                                   'title' => _('reply'),
-                                   'class' => 'replybutton'));
-        $this->hidden('posttoken', common_session_token());
-        $this->elementEnd('a');
         $this->elementEnd('div');
         $this->elementEnd('li');
     }
index 7a267a2bdc00829dbe1ac4a444bcf9dbdd67dda7..1a4372d73e76722dfe5f60d30b220b6ba191b3f0 100644 (file)
@@ -26,7 +26,7 @@ class OpenidloginAction extends Action
     function handle($args)
     {
         parent::handle($args);
-        if (common_logged_in()) {
+        if (common_is_real_login()) {
             $this->clientError(_('Already logged in.'));
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
             $openid_url = $this->trimmed('openid_url');
@@ -59,7 +59,16 @@ class OpenidloginAction extends Action
 
     function getInstructions()
     {
-        return _('Login with an [OpenID](%%doc.openid%%) account.');
+        if (common_logged_in() && !common_is_real_login() &&
+            common_get_returnto()) {
+            // rememberme logins have to reauthenticate before
+            // changing any profile settings (cookie-stealing protection)
+            return _('For security reasons, please re-login with your ' .
+                     '[OpenID](%%doc.openid%%) ' .
+                     'before changing your settings.');
+        } else {
+            return _('Login with an [OpenID](%%doc.openid%%) account.');
+        }
     }
 
     function showPageNotice()
index 7709249bb195150e29945f5c9c6354df396b68e0..2eb8183066b062dc9111d890eeb6936656373aab 100644 (file)
@@ -67,7 +67,7 @@ class OpensearchAction extends Action
             $short_name = _('Notice Search');
         }
         header('Content-Type: text/html');
-        common_start_xml();
+        $this->startXML();
         $this->elementStart('OpenSearchDescription', array('xmlns' => 'http://a9.com/-/spec/opensearch/1.1/'));
         $short_name =  common_config('site', 'name').' '.$short_name;
         $this->element('ShortName', null, $short_name);
@@ -81,7 +81,7 @@ class OpensearchAction extends Action
         $this->element('OutputEncoding', null, 'UTF-8');
         $this->element('InputEncoding', null, 'UTF-8');
         $this->elementEnd('OpenSearchDescription');
-        common_end_xml();
+        $this->endXML();
     }
 
     function isReadOnly()
index cfdc99bb375471c7552862c3a325b2a05f2a5170..cc6537f74f8afd4731f2bd15162fbaf176bd8bc7 100644 (file)
@@ -73,6 +73,9 @@ class PublicAction extends Action
     {
         parent::prepare($args);
         $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+        
+        common_set_returnto($this->selfUrl());
+        
         return true;
     }
 
index 9ec373a96bc37575bac9dac5cc667ea57dd17113..7eff74a6691e34505ceda2aa6dccbf9bc979bf33 100644 (file)
@@ -83,6 +83,8 @@ class RepliesAction extends Action
 
         $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
 
+        common_set_returnto($this->selfUrl());
+        
         return true;
     }
 
index bb68f8d94f6d69f2336301c451b4fc2f305d2911..31479e1a7891d0933e63cb8bc5735ccc99d59345 100644 (file)
@@ -112,6 +112,8 @@ class ShowfavoritesAction extends Action
             $this->page = 1;
         }
 
+        common_set_returnto($this->selfUrl());
+        
         return true;
     }
 
index 468990e7ba1051396ddeebc935d2e14fcdb6daeb..7bc68fbc64a151ac377c414a4ace0e0d52997d26 100644 (file)
@@ -129,6 +129,8 @@ class ShowgroupAction extends Action
             return false;
         }
 
+        common_set_returnto($this->selfUrl());
+
         return true;
     }
 
index eab1fc0a2d0df9693e14274aee10171a89f2d853..28bb8453f8c1111dd04a44b9fcff947273fd146b 100644 (file)
@@ -110,6 +110,8 @@ class ShowstreamAction extends Action
 
         $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
 
+        common_set_returnto($this->selfUrl());
+        
         return true;
     }
 
@@ -140,7 +142,12 @@ class ShowstreamAction extends Action
 
     function showPageTitle()
     {
-         $this->element('h1', NULL, $this->profile->nickname._("'s profile"));
+        $user =& common_current_user();
+        if ($user && ($user->id == $this->profile->id)) {
+            $this->element('h1', NULL, _("Your profile"));
+        } else {
+            $this->element('h1', NULL, sprintf(_('%s\'s profile'), $this->profile->nickname));
+        }
     }
 
     function showPageNoticeBlock()
@@ -170,26 +177,22 @@ class ShowstreamAction extends Action
 
     function showFeeds()
     {
-        // Feeds
-        $this->element('link', array('rel' => 'alternate',
-                                     'href' => common_local_url('api',
-                                                                array('apiaction' => 'statuses',
-                                                                      'method' => 'entity_timeline.rss',
-                                                                      'argument' => $this->user->nickname)),
-                                     'type' => 'application/rss+xml',
-                                     'title' => sprintf(_('Notice feed for %s'), $this->user->nickname)));
-        $this->element('link', array('rel' => 'alternate feed',
-                                     'href' => common_local_url('api',
-                                                                array('apiaction' => 'statuses',
-                                                                      'method' => 'entity_timeline.atom',
-                                                                      'argument' => $this->user->nickname)),
-                                     'type' => 'application/atom+xml',
-                                     'title' => sprintf(_('Notice feed for %s'), $this->user->nickname)));
         $this->element('link', array('rel' => 'alternate',
-                                     'href' => common_local_url('userrss', array('nickname' =>
-                                                                               $this->user->nickname)),
-                                     'type' => 'application/rdf+xml',
-                                     'title' => sprintf(_('Notice feed for %s'), $this->user->nickname)));
+                        'type' => 'application/rss+xml',
+                        'href' => common_local_url('userrss',
+                         array('nickname' => $this->user->nickname)),
+                               'title' => sprintf(_('Notice feed for %s (RSS)'),
+                                 $this->user->nickname)));
+
+         $this->element('link',
+             array('rel' => 'alternate',
+                   'href' => common_local_url('api',
+                     array('apiaction' => 'statuses',
+                           'method' => 'user_timeline.atom',
+                           'argument' => $this->user->nickname)),
+                           'type' => 'application/atom+xml',
+                           'title' => sprintf(_('Notice feed for %s (Atom)'),
+                             $this->user->nickname)));
     }
 
     function extraHead()
@@ -239,7 +242,7 @@ class ShowstreamAction extends Action
         $this->elementStart('dl', 'entity_depiction');
         $this->element('dt', null, _('Photo'));
         $this->elementStart('dd');
-        $this->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
+        $this->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE),
                                     'class' => 'photo avatar',
                                     'width' => AVATAR_PROFILE_SIZE,
                                     'height' => AVATAR_PROFILE_SIZE,
@@ -312,14 +315,22 @@ class ShowstreamAction extends Action
         }
         $this->elementEnd('div');
 
-        //XXX: entity_actions doesn't need to be outputted if entity is looking at their own profile
         $this->elementStart('div', 'entity_actions');
         $this->element('h2', null, _('User actions'));
         $this->elementStart('ul');
-        $this->elementStart('li', array('class' => 'entity_subscribe'));
         $cur = common_current_user();
+
+        if ($cur && $cur->id == $this->profile->id) {
+            $this->elementStart('li', 'entity_edit');
+            $this->element('a', array('href' => common_local_url('profilesettings'),
+                                      'title' => _('Edit profile settings')),
+                                      _('Edit'));
+            $this->elementEnd('li');
+        }
+
         if ($cur) {
             if ($cur->id != $this->profile->id) {
+                $this->elementStart('li', 'entity_subscribe');
                 if ($cur->isSubscribed($this->profile)) {
                     $usf = new UnsubscribeForm($this, $this->profile);
                     $usf->show();
@@ -327,24 +338,24 @@ class ShowstreamAction extends Action
                     $sf = new SubscribeForm($this, $this->profile);
                     $sf->show();
                 }
+                $this->elementEnd('li');
             }
         } else {
+            $this->elementStart('li', 'entity_subscribe');
             $this->showRemoteSubscribeLink();
+            $this->elementEnd('li');
         }
-        $this->elementEnd('li');
-
-//        common_profile_new_message_nudge($cur, $this->user, $this->profile);
 
         $user = User::staticGet('id', $this->profile->id);
         if ($cur && $cur->id != $user->id && $cur->mutuallySubscribed($user)) {
-           $this->elementStart('li', array('class' => 'entity_send-a-message'));
+           $this->elementStart('li', 'entity_send-a-message');
             $this->element('a', array('href' => common_local_url('newmessage', array('to' => $user->id)),
                                       'title' => _('Send a direct message to this user')),
                            _('Message'));
             $this->elementEnd('li');
 
             if ($user->email && $user->emailnotifynudge) {
-                $this->elementStart('li', array('class' => 'entity_nudge'));
+                $this->elementStart('li', 'entity_nudge');
                 $nf = new NudgeForm($this, $user);
                 $nf->show();
                 $this->elementEnd('li');
@@ -353,7 +364,7 @@ class ShowstreamAction extends Action
 
         if ($cur && $cur->id != $this->profile->id) {
             $blocked = $cur->hasBlocked($this->profile);
-            $this->elementStart('li', array('class' => 'entity_block'));
+            $this->elementStart('li', 'entity_block');
             if ($blocked) {
                 $ubf = new UnblockForm($this, $this->profile);
                 $ubf->show();
index f89cbe1ab9dda11bec07ced6f3203ed27e28a2a3..a5f75d266c38e75577f6eb16df4fff4af13c8d6d 100644 (file)
@@ -490,4 +490,55 @@ class SmssettingsAction extends ConnectSettingsAction
         common_redirect(common_local_url('confirmaddress',
                                          array('code' => $code)));
     }
+
+    /**
+     * Handle a request to remove an incoming email address
+     *
+     * @return void
+     */
+
+    function removeIncoming()
+    {
+        $user = common_current_user();
+
+        if (!$user->incomingemail) {
+            $this->showForm(_('No incoming email address.'));
+            return;
+        }
+
+        $orig = clone($user);
+
+        $user->incomingemail = null;
+
+        if (!$user->updateKeys($orig)) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            $this->serverError(_("Couldn't update user record."));
+        }
+
+        $this->showForm(_('Incoming email address removed.'), true);
+    }
+
+    /**
+     * Generate a new incoming email address
+     *
+     * @return void
+     *
+     * @see Emailsettings::newIncoming
+     */
+
+    function newIncoming()
+    {
+        $user = common_current_user();
+
+        $orig = clone($user);
+
+        $user->incomingemail = mail_new_incoming_address();
+
+        if (!$user->updateKeys($orig)) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            $this->serverError(_("Couldn't update user record."));
+        }
+
+        $this->showForm(_('New incoming email address added.'), true);
+    }
 }
index 803026e624d574df2d2ebb9ebf3cbc8f921dd639..4401f892a94603df41e2b06748bba5cca35bcb05 100644 (file)
@@ -37,6 +37,9 @@ class TagAction extends Action
         }
 
         $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+        
+        common_set_returnto($this->selfUrl());
+        
         return true;
     }
 
index cbace5b6b5c83934848e510b19c8f7602a6542dc..3e8a12fd693d3d78a3717530dee6e31ec35795b9 100644 (file)
@@ -80,7 +80,7 @@ class TagotherAction extends Action
         $this->elementStart('dl', 'entity_depiction');
         $this->element('dt', null, _('Photo'));
         $this->elementStart('dd');
-        $this->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
+        $this->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE),
                                     'class' => 'photo avatar',
                                     'width' => AVATAR_PROFILE_SIZE,
                                     'height' => AVATAR_PROFILE_SIZE,
index b4c2dcdff72135aab2f5c3d395d1b8596eab9d1c..a77fa12c984c5a00b18037664eaa0565db15564e 100644 (file)
@@ -25,12 +25,12 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class TagrssAction extends Rss10Action
 {
+    var $tag;
 
-    function init()
-    {
-        $tag = $this->trimmed('tag');
+    function prepare($args) {
+        parent::prepare($args);
+        $tag = common_canonical_tag($this->trimmed('tag'));
         $this->tag = Notice_tag::staticGet('tag', $tag);
-
         if (!$this->tag) {
             $this->clientError(_('No such tag.'));
             return false;
@@ -39,7 +39,7 @@ class TagrssAction extends Rss10Action
         }
     }
 
-    function get_notices($limit=0)
+    function getNotices($limit=0)
     {
         $tag = $this->tag;
 
@@ -48,7 +48,6 @@ class TagrssAction extends Rss10Action
         }
 
         $notice = Notice_tag::getStream($tag->tag, 0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
-
         while ($notice->fetch()) {
             $notices[] = clone($notice);
         }
@@ -56,10 +55,9 @@ class TagrssAction extends Rss10Action
         return $notices;
     }
 
-    function get_channel()
+    function getChannel()
     {
-        $tag = $this->tag->tag;
-
+        $tagname = $this->tag->tag;
         $c = array('url' => common_local_url('tagrss', array('tag' => $tagname)),
                'title' => $tagname,
                'link' => common_local_url('tagrss', array('tag' => $tagname)),
index a35f4b12eaa4f1d3f25c4a41628e1bc1260a2c1d..18e24c0f582c1a1781dc09f058510e3c2bd32276 100644 (file)
@@ -450,7 +450,6 @@ class TwitapistatusesAction extends TwitterapiAction
         if ($user->id == $notice->profile_id) {
             $replies = new Reply;
             $replies->get('notice_id', $notice_id);
-            common_dequeue_notice($notice);
             $replies->delete();
             $notice->delete();
 
index b3bf67dc3f6b254d5b2783d018ee2f68ee8cbfe3..2d41469bba01b9c2456af282819b42d78052e96b 100644 (file)
@@ -250,8 +250,8 @@ class TwittersettingsAction extends ConnectSettingsAction
                 $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
 
                 $avatar_url = ($avatar) ?
-                  common_avatar_display_url($avatar) :
-                  common_default_avatar(AVATAR_MINI_SIZE);
+                  $avatar->displayUrl() :
+                  Avatar::defaultImage(AVATAR_MINI_SIZE);
 
                 $this->element('img', array('src' => $avatar_url,
                                             'width' => AVATAR_MINI_SIZE,
index 58cf7eeb60a2b8830074db8be99900d4227a4f60..ded4ba76b1bc1bcd7371d33d91cd318008ba6a16 100644 (file)
@@ -125,6 +125,12 @@ class UsergroupsAction extends Action
                        _('Create a new group'));
         $this->elementEnd('p');
 
+        $this->elementStart('p', array('id' => 'group_search'));
+        $this->element('a', array('href' => common_local_url('groupsearch'),
+                                  'class' => 'more'),
+                       _('Search for more groups'));
+        $this->elementEnd('p');
+
         $offset = ($this->page-1) * GROUPS_PER_PAGE;
         $limit =  GROUPS_PER_PAGE + 1;
 
index 9ae920647adfbae0c7ce6e767eca7fa7ec243c91..db9d78e47fc1e8f2c137ac6eb9a67d707b2a15fb 100644 (file)
@@ -4,18 +4,18 @@
  */
 require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 
-class Avatar extends Memcached_DataObject 
+class Avatar extends Memcached_DataObject
 {
     ###START_AUTOCODE
     /* the code below is auto generated do not remove the above tag */
 
     public $__table = 'avatar';                          // table name
     public $profile_id;                      // int(4)  primary_key not_null
-    public $original;                        // tinyint(1)  
+    public $original;                        // tinyint(1)
     public $width;                           // int(4)  primary_key not_null
     public $height;                          // int(4)  primary_key not_null
     public $mediatype;                       // varchar(32)   not_null
-    public $filename;                        // varchar(255)  
+    public $filename;                        // varchar(255)
     public $url;                             // varchar(255)  unique_key
     public $created;                         // datetime()   not_null
     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
@@ -33,109 +33,51 @@ class Avatar extends Memcached_DataObject
     {
         $filename = $this->filename;
         if (parent::delete()) {
-            @unlink(common_avatar_path($filename));
+            @unlink(Avatar::path($filename));
         }
     }
 
-    # Create and save scaled version of this avatar
-    # XXX: maybe break into different methods
-
-    function scale($size)
+    function &pkeyGet($kv)
     {
+        return Memcached_DataObject::pkeyGet('Avatar', $kv);
+    }
 
-        $image_s = imagecreatetruecolor($size, $size);
-        $image_a = $this->to_image();
-        $square = min($this->width, $this->height);
-        imagecolortransparent($image_s, imagecolorallocate($image_s, 0, 0, 0));
-        imagealphablending($image_s, false);
-        imagesavealpha($image_s, true);
-        imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
-                           $size, $size, $square, $square);
-
-        $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
-
-        $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
-
-        if ($this->mediatype == 'image/jpeg') {
-            imagejpeg($image_s, common_avatar_path($filename));
-        } else {
-            imagepng($image_s, common_avatar_path($filename));
-        }
-
-        $scaled = DB_DataObject::factory('avatar');
-        $scaled->profile_id = $this->profile_id;
-        $scaled->width = $size;
-        $scaled->height = $size;
-        $scaled->original = false;
-        $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
-        $scaled->filename = $filename;
-        $scaled->url = common_avatar_url($filename);
-        $scaled->created = DB_DataObject_Cast::dateTime(); # current time
+    // where should the avatar go for this user?
 
-        if ($scaled->insert()) {
-            return $scaled;
+    static function filename($id, $extension, $size=null, $extra=null)
+    {
+        if ($size) {
+            return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension;
         } else {
-            return null;
+            return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension;
         }
     }
 
-    function scale_and_crop($size, $x, $y, $w, $h) 
+    static function path($filename)
     {
+        return INSTALLDIR . '/avatar/' . $filename;
+    }
 
-        $image_s = imagecreatetruecolor($size, $size);
-        $image_a = $this->to_image();
-
-        # Retain alpha channel info if possible for .pngs
-        $background = imagecolorallocate($image_s, 0, 0, 0);
-        ImageColorTransparent($image_s, $background);
-        imagealphablending($image_s, false);
-
-        imagecopyresized($image_s, $image_a, 0, 0, $x, $y, $size, $size, $w, $h);
-
-        $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
-
-        $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
-
-        if ($this->mediatype == 'image/jpeg') {
-            imagejpeg($image_s, common_avatar_path($filename));
-        } else {
-            imagepng($image_s, common_avatar_path($filename));
-        }
-
-        $cropped = DB_DataObject::factory('avatar');
-        $cropped->profile_id = $this->profile_id;
-        $cropped->width = $size;
-        $cropped->height = $size;
-        $cropped->original = false;
-        $cropped->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
-        $cropped->filename = $filename;
-        $cropped->url = common_avatar_url($filename);
-        $cropped->created = DB_DataObject_Cast::dateTime(); # current time
-
-        if ($cropped->insert()) {
-            return $cropped;
-        } else {
-            return NULL;
-        }
+    static function url($filename)
+    {
+        return common_path('avatar/'.$filename);
     }
 
-    function to_image() 
+    function displayUrl()
     {
-        $filepath = common_avatar_path($this->filename);
-        if ($this->mediatype == 'image/gif') {
-            return imagecreatefromgif($filepath);
-        } else if ($this->mediatype == 'image/jpeg') {
-            return imagecreatefromjpeg($filepath);
-        } else if ($this->mediatype == 'image/png') {
-            return imagecreatefrompng($filepath);
+        $server = common_config('avatar', 'server');
+        if ($server) {
+            return 'http://'.$server.'/'.$this->filename;
         } else {
-            return NULL;
+            return $this->url;
         }
     }
-    
-    function &pkeyGet($kv) 
+
+    static function defaultImage($size)
     {
-        return Memcached_DataObject::pkeyGet('Avatar', $kv);
+        static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
+                                  AVATAR_STREAM_SIZE => 'stream',
+                                  AVATAR_MINI_SIZE => 'mini');
+        return theme_path('default-avatar-'.$sizenames[$size].'.png');
     }
-
 }
index 2e3e4e8d4a7cd5c9f44804edf9c10e195bda7189..fdeff21fc6d984107a21913b190f4bf64c8d3a3e 100644 (file)
@@ -21,7 +21,7 @@ if (!defined('LACONICA')) { exit(1); }
 
 class Channel
 {
-    
+
     function on($user)
     {
         return false;
@@ -36,12 +36,12 @@ class Channel
     {
         return false;
     }
-    
+
     function error($user, $text)
     {
         return false;
     }
-    
+
     function source()
     {
         return null;
@@ -52,22 +52,22 @@ class XMPPChannel extends Channel
 {
 
     var $conn = null;
-    
+
     function source()
     {
         return 'xmpp';
     }
-    
+
     function __construct($conn)
     {
         $this->conn = $conn;
     }
-    
+
     function on($user)
     {
         return $this->set_notify($user, 1);
     }
-    
+
     function off($user)
     {
         return $this->set_notify($user, 0);
@@ -78,13 +78,13 @@ class XMPPChannel extends Channel
         $text = '['.common_config('site', 'name') . '] ' . $text;
         jabber_send_message($user->jabber, $text);
     }
-    
+
     function error($user, $text)
     {
         $text = '['.common_config('site', 'name') . '] ' . $text;
         jabber_send_message($user->jabber, $text);
     }
-    
+
     function set_notify(&$user, $notify)
     {
         $orig = clone($user);
@@ -105,20 +105,25 @@ class XMPPChannel extends Channel
     }
 }
 
-
 class WebChannel extends Channel
 {
+    var $out = null;
+
+    function __construct($out=null)
+    {
+        $this->out = $out;
+    }
 
     function source()
     {
         return 'web';
     }
-    
+
     function on($user)
     {
         return false;
     }
-    
+
     function off($user)
     {
         return false;
@@ -129,47 +134,49 @@ class WebChannel extends Channel
         # XXX: buffer all output and send it at the end
         # XXX: even better, redirect to appropriate page
         #      depending on what command was run
-        common_show_header(_('Command results'));
-        common_element('p', null, $text);
-        common_show_footer();
+        $this->out->startHTML();
+        $this->out->elementStart('head');
+        $this->out->element('title', null, _('Command results'));
+        $this->out->elementEnd('head');
+        $this->out->elementStart('body');
+        $this->out->element('p', array('id' => 'command_result'), $text);
+        $this->out->elementEnd('body');
+        $this->out->endHTML();
     }
-    
+
     function error($user, $text)
     {
         common_user_error($text);
     }
 }
 
-
 class AjaxWebChannel extends WebChannel
 {
-
     function output($user, $text)
     {
-        common_start_html('text/xml;charset=utf-8', true);
-        common_element_start('head');
-        common_element('title', null, _('Command results'));
-        common_element_end('head');
-        common_element_start('body');
-        common_element('p', array('id' => 'command_result'), $text);
-        common_element_end('body');
-        common_element_end('html');
+        $this->out->startHTML('text/xml;charset=utf-8');
+        $this->out->elementStart('head');
+        $this->out->element('title', null, _('Command results'));
+        $this->out->elementEnd('head');
+        $this->out->elementStart('body');
+        $this->out->element('p', array('id' => 'command_result'), $text);
+        $this->out->elementEnd('body');
+        $this->out->endHTML();
     }
 
     function error($user, $text)
     {
-        common_start_html('text/xml;charset=utf-8', true);
-        common_element_start('head');
-        common_element('title', null, _('Ajax Error'));
-        common_element_end('head');
-        common_element_start('body');
-        common_element('p', array('id' => 'error'), $text);
-        common_element_end('body');
-        common_element_end('html');
+        $this->out->startHTML('text/xml;charset=utf-8');
+        $this->out->elementStart('head');
+        $this->out->element('title', null, _('Ajax Error'));
+        $this->out->elementEnd('head');
+        $this->out->elementStart('body');
+        $this->out->element('p', array('id' => 'error'), $text);
+        $this->out->elementEnd('body');
+        $this->out->endHTML();
     }
 }
 
-
 class MailChannel extends Channel
 {
 
@@ -179,17 +186,17 @@ class MailChannel extends Channel
     {
         return 'mail';
     }
-    
+
     function __construct($addr=null)
     {
         $this->addr = $addr;
     }
-    
+
     function on($user)
     {
         return $this->set_notify($user, 1);
     }
-    
+
     function off($user)
     {
         return $this->set_notify($user, 0);
@@ -200,23 +207,23 @@ class MailChannel extends Channel
 
         $headers['From'] = $user->incomingemail;
         $headers['To'] = $this->addr;
-        
+
         $headers['Subject'] = _('Command complete');
 
         return mail_send(array($this->addr), $headers, $text);
     }
-    
+
     function error($user, $text)
     {
-        
+
         $headers['From'] = $user->incomingemail;
         $headers['To'] = $this->addr;
-        
+
         $headers['Subject'] = _('Command failed');
 
         return mail_send(array($this->addr), $headers, $text);
     }
-    
+
     function set_notify($user, $value)
     {
         $orig = clone($user);
index ab5a48e57f986ef6315c2aab89a97b85ca0c960c..f3bfe299cfb8d474dfae3ad57e29f2b8517f29cd 100644 (file)
@@ -69,74 +69,51 @@ class Profile extends Memcached_DataObject
         }
     }
 
-    function setOriginal($source)
+    function setOriginal($filename)
     {
-
-        $info = @getimagesize($source);
-
-        if (!$info) {
-            return null;
-        }
-
-        $filename = common_avatar_filename($this->id,
-                                           image_type_to_extension($info[2]),
-                                           null, common_timestamp());
-        $filepath = common_avatar_path($filename);
-
-        copy($source, $filepath);
+        $imagefile = new ImageFile($this->id, Avatar::path($filename));
 
         $avatar = new Avatar();
-
         $avatar->profile_id = $this->id;
-        $avatar->width = $info[0];
-        $avatar->height = $info[1];
-        $avatar->mediatype = image_type_to_mime_type($info[2]);
+        $avatar->width = $imagefile->width;
+        $avatar->height = $imagefile->height;
+        $avatar->mediatype = image_type_to_mime_type($imagefile->type);
         $avatar->filename = $filename;
         $avatar->original = true;
-        $avatar->url = common_avatar_url($filename);
+        $avatar->url = Avatar::url($filename);
         $avatar->created = DB_DataObject_Cast::dateTime(); # current time
 
         # XXX: start a transaction here
 
-        if (!$this->delete_avatars()) {
-            @unlink($filepath);
-            return null;
-        }
-
-        if (!$avatar->insert()) {
-            @unlink($filepath);
+        if (!$this->delete_avatars() || !$avatar->insert()) {
+            @unlink(Avatar::path($filename));
             return null;
         }
 
         foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
             # We don't do a scaled one if original is our scaled size
             if (!($avatar->width == $size && $avatar->height == $size)) {
-                $s = $avatar->scale($size);
-                if (!$s) {
-                    return null;
-                }
-            }
-        }
 
-        return $avatar;
-    }
-
-    function crop_avatars($x, $y, $w, $h)
-    {
+                $scaled_filename = $imagefile->resize($size);
 
-        $avatar = $this->getOriginalAvatar();
-        $this->delete_avatars(false); # don't delete original
+                //$scaled = DB_DataObject::factory('avatar');
+                $scaled = new Avatar();
+                $scaled->profile_id = $this->id;
+                $scaled->width = $size;
+                $scaled->height = $size;
+                $scaled->original = false;
+                $scaled->mediatype = image_type_to_mime_type($imagefile->type);
+                $scaled->filename = $scaled_filename;
+                $scaled->url = Avatar::url($scaled_filename);
+                $scaled->created = DB_DataObject_Cast::dateTime(); # current time
 
-        foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
-            # We don't do a scaled one if original is our scaled size
-            if (!($avatar->width == $size && $avatar->height == $size)) {
-                $s = $avatar->scale_and_crop($size, $x, $y, $w, $h);
-                if (!$s) {
-                    return NULL;
+                if (!$scaled->insert()) {
+                    return null;
                 }
             }
         }
-        return true;
+
+        return $avatar;
     }
 
     function delete_avatars($original=true)
@@ -217,4 +194,13 @@ class Profile extends Memcached_DataObject
         }
     }
 
+    function avatarUrl($size=AVATAR_PROFILE_SIZE)
+    {
+        $avatar = $this->getAvatar($size);
+        if ($avatar) {
+            return $avatar->displayUrl();
+        } else {
+            return Avatar::defaultImage($size);
+        }
+    }
 }
index b1c061c18fb096f59c43115813b7a6505ae0516f..a6a1b11b9f502d7a6a27d155ce840eb92154a0ae 100644 (file)
@@ -630,4 +630,15 @@ class User extends Memcached_DataObject
 
         return $profile;
     }
+
+    function hasOpenID()
+    {
+        $oid = new User_openid();
+
+        $oid->user_id = $this->id;
+
+        $cnt = $oid->find();
+
+        return ($cnt > 0);
+    }
 }
index 522dd81436f94402ba18539c9bb49a8f49bbe295..d152f9d567be0fa2996a7d7a9934c9d7cdc7f96e 100755 (executable)
@@ -88,81 +88,16 @@ class User_group extends Memcached_DataObject
         return $members;
     }
 
-    function setOriginal($filename, $type)
+    function setOriginal($filename)
     {
+        $imagefile = new ImageFile($this->id, Avatar::path($filename));
+        
         $orig = clone($this);
-        $this->original_logo = common_avatar_url($filename);
-        $this->homepage_logo = common_avatar_url($this->scale($filename,
-                                                              AVATAR_PROFILE_SIZE,
-                                                              $type));
-        $this->stream_logo = common_avatar_url($this->scale($filename,
-                                                            AVATAR_STREAM_SIZE,
-                                                            $type));
-        $this->mini_logo = common_avatar_url($this->scale($filename,
-                                                          AVATAR_MINI_SIZE,
-                                                          $type));
+        $this->original_logo = Avatar::url($filename);
+        $this->homepage_logo = Avatar::url($imagefile->resize(AVATAR_PROFILE_SIZE));
+        $this->stream_logo = Avatar::url($imagefile->resize(AVATAR_STREAM_SIZE));
+        $this->mini_logo = Avatar::url($imagefile->resize(AVATAR_MINI_SIZE));
         common_debug(common_log_objstring($this));
         return $this->update($orig);
     }
-
-    function scale($filename, $size, $type)
-    {
-        $filepath = common_avatar_path($filename);
-
-        if (!file_exists($filepath)) {
-            $this->serverError(_('Lost our file.'));
-            return;
-        }
-
-        $info = @getimagesize($filepath);
-
-        switch ($type) {
-         case IMAGETYPE_GIF:
-            $image_src = imagecreatefromgif($filepath);
-            break;
-         case IMAGETYPE_JPEG:
-            $image_src = imagecreatefromjpeg($filepath);
-            break;
-         case IMAGETYPE_PNG:
-            $image_src = imagecreatefrompng($filepath);
-            break;
-         default:
-            $this->serverError(_('Unknown file type'));
-            return;
-        }
-
-        $image_dest = imagecreatetruecolor($size, $size);
-
-        $background = imagecolorallocate($image_dest, 0, 0, 0);
-        ImageColorTransparent($image_dest, $background);
-        imagealphablending($image_dest, false);
-
-        imagecopyresized($image_dest, $image_src,
-                         0, 0, 0, 0,
-                         $size, $size, $info[0], $info[1]);
-
-        $outname = common_avatar_filename($this->id,
-                                          image_type_to_extension($type),
-                                          $size,
-                                          common_timestamp());
-
-        $outpath = common_avatar_path($outname);
-
-        switch ($type) {
-         case IMAGETYPE_GIF:
-            imagegif($image_dest, $outpath);
-            break;
-         case IMAGETYPE_JPEG:
-            imagejpeg($image_dest, $outpath);
-            break;
-         case IMAGETYPE_PNG:
-            imagepng($image_dest, $outpath);
-            break;
-         default:
-            $this->serverError(_('Unknown file type'));
-            return;
-        }
-
-        return $outname;
-    }
 }
index c3efd9daa741aa66b8c4b8dcc94addb145d1cf89..9882d091a50aed16e0f0caf068ae7c0faa89ff10 100644 (file)
@@ -50,7 +50,7 @@ create table "user" (
     emailnotifyfav integer default 1 /* comment 'Notify by email of favorites' */,\r
     emailnotifynudge integer default 1 /* comment 'Notify by email of nudges' */,\r
     emailnotifymsg integer default 1 /* comment 'Notify by email of direct messages' */,\r
-emailmicroid integer default 1 /* comment 'whether to publish email microid' */,\r
+    emailmicroid integer default 1 /* comment 'whether to publish email microid' */,\r
     language varchar(50) /* comment 'preferred language' */,\r
     timezone varchar(50) /* comment 'timezone' */,\r
     emailpost integer default 1 /* comment 'Post by email' */,\r
@@ -146,7 +146,6 @@ create table fave (
     notice_id integer not null /* comment 'notice that is the favorite' */ references notice (id),\r
     user_id integer not null /* comment 'user who likes this notice' */ references "user" (id) ,\r
     modified timestamp not null /* comment 'date this record was modified' */,\r
-\r
     primary key (notice_id, user_id)\r
 \r
 );\r
@@ -288,6 +287,7 @@ create table foreign_link (
      credentials varchar(255) /* comment 'authc credentials, typically a password' */,\r
      noticesync int not null default 1 /* comment 'notice synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies' */,\r
      friendsync int not null default 2 /* comment 'friend synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming */, \r
+     profilesync int not null default 1 /* comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming' */,\r
      created timestamp not null /* comment 'date this record was created' */,\r
      modified timestamp not null /* comment 'date this record was modified' */,\r
 \r
@@ -367,6 +367,59 @@ create table profile_block (
 \r
 );\r
 \r
+create table user_group (\r
+\r
+    id serial primary key /* comment 'unique identifier' */,\r
+\r
+    nickname varchar(64) unique /* comment 'nickname for addressing' */,\r
+    fullname varchar(255) /* comment 'display name' */,\r
+    homepage varchar(255) /* comment 'URL, cached so we dont regenerate' */,\r
+    description varchar(140) /* comment 'descriptive biography' */,\r
+    location varchar(255) /* comment 'related physical location, if any' */,\r
+\r
+    original_logo varchar(255) /* comment 'original size logo' */,\r
+    homepage_logo varchar(255) /* comment 'homepage (profile) size logo' */,\r
+    stream_logo varchar(255) /* comment 'stream-sized logo' */,\r
+    mini_logo varchar(255) /* comment 'mini logo' */,\r
+\r
+    created timestamp not null /* comment 'date this record was created' */,\r
+    modified timestamp /* comment 'date this record was modified' */\r
+\r
+);\r
+create index user_group_nickname_idx on user_group using btree(nickname);\r
+\r
+create table group_member (\r
+\r
+    group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id),\r
+    profile_id integer not null /* comment 'foreign key to profile table' */ references profile (id),\r
+    is_admin integer default 0 /* comment 'is this user an admin?' */,\r
+\r
+    created timestamp not null /* comment 'date this record was created' */,\r
+    modified timestamp /* comment 'date this record was modified' */,\r
+\r
+    primary key (group_id, profile_id)\r
+);\r
+\r
+create table related_group (\r
+\r
+    group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id) ,\r
+    related_group_id integer not null /* comment 'foreign key to user_group' */ references user_group (id),\r
+\r
+    created timestamp not null /* comment 'date this record was created' */,\r
+\r
+    primary key (group_id, related_group_id)\r
+\r
+);\r
+\r
+create table group_inbox (\r
+    group_id integer not null /* comment 'group receiving the message' references user_group (id) */,\r
+    notice_id integer not null /* comment 'notice received' references notice (id) */,\r
+    created timestamp not null /* comment 'date the notice was created' */,\r
+\r
+    primary key (group_id, notice_id)\r
+);\r
+create index group_inbox_created_idx on group_inbox using btree(created);\r
+\r
 /* Textsearch stuff */\r
 \r
 create index textsearch_idx on profile using gist(textsearch);\r
index 8ef9aa532bf79f5f3f330a1c8a882594dd2ce111..f0696c19e92618aaaa8de72975892a1c318bfcde 100644 (file)
 var max = 140;
 var noticeBox = document.getElementById('notice_data-text'); 
 
-noticeBox.addEventListener('keyup', keypress);
-noticeBox.addEventListener('keydown', keypress);
-noticeBox.addEventListener('keypress', keypress);
-noticeBox.addEventListener('change', keypress);
+if (noticeBox) {
+    noticeBox.addEventListener('keyup', keypress);
+    noticeBox.addEventListener('keydown', keypress);
+    noticeBox.addEventListener('keypress', keypress);
+    noticeBox.addEventListener('change', keypress);
+}
 
 // Do our the countdown
 function keypress(evt) {  
index 587d2ab13a409be4c9efd8215b914e58c98fc76a..c4172ada1135293fd2ce5a5d7c3487cfb7184c8a 100644 (file)
@@ -73,7 +73,6 @@ class Action extends HTMLOutputter // lawsuit
         parent::__construct($output, $indent);
     }
 
-
     /**
      * For initializing members of the class.
      *
@@ -162,15 +161,15 @@ class Action extends HTMLOutputter // lawsuit
                                      'media' => 'screen, projection, tv'));
         $this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
                        'href="'.theme_path('css/ie.css', 'base').'?version='.LACONICA_VERSION.'" /><![endif]');
-        $this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
-                       'href="'.theme_path('css/ie.css', null).'?version='.LACONICA_VERSION.'" /><![endif]');
         foreach (array(6,7) as $ver) {
-            if (file_exists(theme_file('ie'.$ver.'.css'))) {
+            if (file_exists(theme_file('css/ie'.$ver.'.css', 'base'))) {
                 // Yes, IE people should be put in jail.
                 $this->comment('[if lte IE '.$ver.']><link rel="stylesheet" type="text/css" '.
                                'href="'.theme_path('css/ie'.$ver.'.css', 'base').'?version='.LACONICA_VERSION.'" /><![endif]');
             }
         }
+        $this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
+                       'href="'.theme_path('css/ie.css', null).'?version='.LACONICA_VERSION.'" /><![endif]');
     }
 
     /**
@@ -246,7 +245,6 @@ class Action extends HTMLOutputter // lawsuit
         // does nothing by default
     }
 
-    
     /**
      * Show body.
      *
@@ -257,7 +255,7 @@ class Action extends HTMLOutputter // lawsuit
     function showBody()
     {
         $this->elementStart('body', array('id' => $this->trimmed('action')));
-        $this->elementStart('div', 'wrap');
+        $this->elementStart('div', array('id' => 'wrap'));
         $this->showHeader();
         $this->showCore();
         $this->showFooter();
@@ -354,7 +352,7 @@ class Action extends HTMLOutputter // lawsuit
         $this->elementEnd('dd');
         $this->elementEnd('dl');
     }
-    
+
     /**
      * Show site notice.
      *
@@ -368,7 +366,9 @@ class Action extends HTMLOutputter // lawsuit
             $this->elementStart('dl', array('id' => 'site_notice',
                                             'class' => 'system_notice'));
             $this->element('dt', null, _('Site notice'));
-            $this->element('dd', null, $text);
+            $this->elementStart('dd', null);
+            $this->raw($text);
+            $this->elementEnd('dd');
             $this->elementEnd('dl');
         }
     }
@@ -385,7 +385,7 @@ class Action extends HTMLOutputter // lawsuit
         $notice_form = new NoticeForm($this);
         $notice_form->show();
     }
-    
+
     /**
      * Show anonymous message.
      *
@@ -761,7 +761,7 @@ class Action extends HTMLOutputter // lawsuit
     /**
      * Boolean understands english (yes, no, true, false)
      *
-     * @param string $key query key we're interested in 
+     * @param string $key query key we're interested in
      * @param string $def default value
      *
      * @return boolean interprets yes/no strings as boolean
index 825ba0ff75d10b99aae6de7ab3fb41f9508246a1..5b4e3c40c87d12173ed1058eccaf0c55c56b1765 100644 (file)
 
 if (!defined('LACONICA')) { exit(1); }
 
-define('LACONICA_VERSION', '0.7.0');
+define('LACONICA_VERSION', '0.7.1');
 
 define('AVATAR_PROFILE_SIZE', 96);
 define('AVATAR_STREAM_SIZE', 48);
 define('AVATAR_MINI_SIZE', 24);
-define('MAX_AVATAR_SIZE', 256 * 1024);
 
 define('NOTICES_PER_PAGE', 20);
 define('PROFILES_PER_PAGE', 20);
index 03065bc709c42c2ac0ebd4c4125a4f7b34c69c6a..526d9f81be245a36e1173814415b25e6e3720818 100644 (file)
@@ -111,7 +111,7 @@ class ErrorAction extends Action
     function showBody()
     {
         $this->elementStart('body', array('id' => 'error'));
-        $this->elementStart('div', 'wrap');
+        $this->elementStart('div', array('id' => 'wrap'));
         $this->showHeader();
         $this->showCore();
         $this->showFooter();
index bfba702e6a09b6bb5d09c95a6b2b280ad0f38ead..043a078cd5bbd2fa8b0849fa7dc3c5238927cc3f 100644 (file)
@@ -129,7 +129,7 @@ class FacebookAction extends Action
      * Start an Facebook ready HTML document
      *
      *  For Facebook we don't want to actually output any headers,
-     *  DTD info, etc.
+     *  DTD info, etc.  Just Stylesheet and JavaScript links.
      *
      * If $type isn't specified, will attempt to do content negotiation.
      *
@@ -140,6 +140,9 @@ class FacebookAction extends Action
 
     function startHTML($type=null) 
     {          
+        $this->showStylesheets();
+        $this->showScripts();
+        
         $this->elementStart('div', array('class' => 'facebook-page'));
     }
 
@@ -168,7 +171,7 @@ class FacebookAction extends Action
 
     function showBody()
     {
-        $this->elementStart('div', 'wrap');
+        $this->elementStart('div', array('id' => 'wrap'));
         $this->showHeader();
         $this->showCore();
         $this->showFooter();
@@ -181,8 +184,6 @@ class FacebookAction extends Action
 
     function showHead($error, $success)
     {
-        $this->showStylesheets();
-        $this->showScripts();
         
         if ($error) {
             $this->element("h1", null, $error);
@@ -204,7 +205,6 @@ class FacebookAction extends Action
     // Make this into a widget later
     function showLocalNav()
     {
-                
         $this->elementStart('ul', array('class' => 'nav'));
 
         $this->elementStart('li', array('class' =>
@@ -229,18 +229,7 @@ class FacebookAction extends Action
         $this->elementEnd('li');
 
         $this->elementEnd('ul');
-
     }     
-
-    /**
-     * Show primary navigation.
-     *
-     * @return nothing
-     */
-    function showPrimaryNav()
-    {
-        // we don't want to show anything for this
-    }
     
     /**
      * Show header of the page.
@@ -254,7 +243,6 @@ class FacebookAction extends Action
         $this->elementStart('div', array('id' => 'header'));
         $this->showLogo();
         $this->showNoticeForm();
-        $this->showPrimaryNav();
         $this->elementEnd('div');
     }
     
@@ -282,7 +270,6 @@ class FacebookAction extends Action
 
         $loginmsg_part1 = _('To use the %s Facebook Application you need to login ' .
             'with your username and password. Don\'t have a username yet? ');
-
         $loginmsg_part2 = _(' a new account.');
 
         $this->elementStart('dd');
@@ -291,18 +278,18 @@ class FacebookAction extends Action
         $this->element('a',
             array('href' => common_local_url('register')), _('Register'));
         $this->text($loginmsg_part2);
+       $this->elementEnd('p');
         $this->elementEnd('dd');
+
         $this->elementEnd('dl');
-        
         $this->elementEnd('div');
-        
     }
 
 
     function showLoginForm($msg = null)
     {
 
-        $this->elementStart('div', array('class' => 'content'));
+        $this->elementStart('div', array('id' => 'content'));
         $this->element('h1', null, _('Login'));
 
         if ($msg) {
@@ -330,6 +317,7 @@ class FacebookAction extends Action
         $this->elementEnd('ul');
 
         $this->submit('submit', _('Login'));
+       $this->elementEnd('fieldset');
         $this->elementEnd('form');
 
         $this->elementStart('p');
@@ -338,6 +326,7 @@ class FacebookAction extends Action
         $this->elementEnd('p');
 
         $this->elementEnd('div');
+        $this->elementEnd('div');
 
     }
     
@@ -347,42 +336,70 @@ class FacebookAction extends Action
 
         // Need to include inline CSS for styling the Profile box
 
+       $app_props = $this->facebook->api_client->Admin_getAppProperties(array('icon_url'));
+       $icon_url = $app_props['icon_url'];
+
         $style = '<style>
+        .entry-title *,
+        .entry-content * {
+        font-size:14px;
+        font-family:"Lucida Sans Unicode", "Lucida Grande", sans-serif;
+        }
+        .entry-title a,
+        .entry-content a {
+        color:#002E6E;
+        }
+
          .entry-title .vcard .photo {
          float:left;
          display:inline;
+        margin-right:11px;
+        margin-bottom:11px
          }
-         .entry-title .vcard .nickname {
-         margin-left:5px;
-         }
-
+        .entry-title {
+        margin-bottom:11px;
+        }
          .entry-title p.entry-content {
          display:inline;
-         margin-left:5px;
+        margin-left:5px;
          }
 
+        div.entry-content {
+        clear:both;
+        }
          div.entry-content dl,
          div.entry-content dt,
          div.entry-content dd {
          display:inline;
+        text-transform:lowercase;
          }
 
-         div.entry-content dt,
-         div.entry-content dd {
-         display:inline;
-         margin-left:5px;
+         div.entry-content dd,
+        div.entry-content .device dt {
+        margin-left:0;
+        margin-right:5px;
          }
-         div.entry-content dl.timestamp dt {
+         div.entry-content dl.timestamp dt,
+        div.entry-content dl.response dt {
          display:none;
          }
          div.entry-content dd a {
          display:inline-block;
          }
+
+        #facebook_laconica_app {
+        text-indent:-9999px;
+        height:16px;
+        width:16px;
+        display:block;
+        background:url('.$icon_url.') no-repeat 0 0;
+        float:right;
+        }
          </style>';        
 
         $this->xw->openMemory();
 
-        $item = new FacebookNoticeListItem($notice, $this);
+        $item = new FacebookProfileBoxNotice($notice, $this);
         $item->show();
 
         $fbml = "<fb:wide>$style " . $this->xw->outputMemory(false) . "</fb:wide>";
@@ -465,8 +482,6 @@ class FacebookAction extends Action
             $content_shortened = common_shorten_links($content);
 
             if (mb_strlen($content_shortened) > 140) {
-                common_debug("Content = '$content_shortened'", __FILE__);
-                common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
                 $this->showPage(_('That\'s too long. Max notice size is 140 chars.'));
                 return;
             }
@@ -539,6 +554,18 @@ class FacebookNoticeForm extends NoticeForm
 
 class FacebookNoticeList extends NoticeList
 {
+    
+    /**
+     * constructor
+     *
+     * @param Notice $notice stream of notices from DB_DataObject
+     */
+
+    function __construct($notice, $out=null)
+    {
+        parent::__construct($notice, $out);
+    }
+    
     /**
      * show the list of notices
      *
@@ -593,6 +620,20 @@ class FacebookNoticeList extends NoticeList
 
 class FacebookNoticeListItem extends NoticeListItem
 {    
+
+    /**
+     * constructor
+     *
+     * Also initializes the profile attribute.
+     *
+     * @param Notice $notice The notice we'll display
+     */
+
+    function __construct($notice, $out=null)
+    {
+        parent::__construct($notice, $out);
+    }
+
     /**
      * recipe function for displaying a single notice in the Facebook App.
      *
@@ -645,3 +686,65 @@ class FacebookNoticeListItem extends NoticeListItem
     }
 
 }
+
+
+class FacebookProfileBoxNotice extends FacebookNoticeListItem
+{    
+    
+    /**
+     * constructor
+     *
+     * Also initializes the profile attribute.
+     *
+     * @param Notice $notice The notice we'll display
+     */
+
+    function __construct($notice, $out=null)
+    {
+        parent::__construct($notice, $out);
+    }
+    
+    /**
+     * Recipe function for displaying a single notice in the 
+     * Facebook App's Profile
+     *
+     * @return void
+     */
+
+    function show()
+    {
+
+        $this->out->elementStart('div', 'entry-title');
+        $this->showAuthor();
+        $this->showContent();
+        $this->out->elementEnd('div');
+
+        $this->out->elementStart('div', 'entry-content');
+
+        $this->showNoticeLink();
+        $this->showNoticeSource();
+        $this->showReplyTo();
+        $this->out->elementEnd('div');
+        
+        $this->showAppLink();
+
+    }
+
+    function showAppLink() 
+    {
+        
+        $this->facebook = getFacebook();
+
+        $app_props = $this->facebook->api_client->Admin_getAppProperties(
+                array('canvas_name', 'application_name'));
+
+        $this->app_uri = 'http://apps.facebook.com/' . $app_props['canvas_name'];
+        $this->app_name = $app_props['application_name'];
+        
+        $this->out->elementStart('a', array('id' => 'facebook_laconica_app',
+                                            'href' => $this->app_uri));
+        $this->out->text($this->app_name);
+        $this->out->elementEnd('a');
+    }
+
+}
index f9245414f29348a90628363a21e7aeee879e6d38..7780b1c19d0c3af05980860ea1d3ae46efcb8a84 100644 (file)
@@ -172,7 +172,7 @@ class HTMLOutputter extends XMLOutputter
                        'type' => 'text',
                        'id' => $id);
         if ($value) {
-            $attrs['value'] = htmlspecialchars($value);
+            $attrs['value'] = $value;
         }
         $this->element('input', $attrs);
         if ($instructions) {
@@ -206,7 +206,7 @@ class HTMLOutputter extends XMLOutputter
                        'class' => 'checkbox',
                        'id' => $id);
         if ($value) {
-            $attrs['value'] = htmlspecialchars($value);
+            $attrs['value'] = $value;
         }
         if ($checked) {
             $attrs['checked'] = 'checked';
index 7f1db892c175e79284c3c40cb8cf74e583e0670d..db344db8f83d8500c790210df522de5ab8cf80f6 100644 (file)
@@ -47,18 +47,22 @@ if (!defined('LACONICA')) {
 
 class ImageFile
 {
-    var $filename = null;
-    var $barename = null;
-    var $type = null;
-    var $height = null;
-    var $width = null;
+    var $id;
+    var $filepath;
+    var $barename;
+    var $type;
+    var $height;
+    var $width;
 
-    function __construct($filename=null, $type=null, $width=null, $height=null)
+    function __construct($id=null, $filepath=null, $type=null, $width=null, $height=null)
     {
-        $this->filename = $filename;
-        $this->type = $type;
-        $this->width = $type;
-        $this->height = $type;
+        $this->id = $id;
+        $this->filepath = $filepath;
+
+        $info = @getimagesize($this->filepath);
+        $this->type = ($info) ? $info[2]:$type;
+        $this->width = ($info) ? $info[0]:$width;
+        $this->height = ($info) ? $info[1]:$height;
     }
 
     static function fromUpload($param='upload')
@@ -68,7 +72,7 @@ class ImageFile
             break;
         case UPLOAD_ERR_INI_SIZE:
         case UPLOAD_ERR_FORM_SIZE:
-            throw new Exception(_('That file is too big.'));
+            throw new Exception(sprintf(_('That file is too big. The maximum file size is %d.'), $this->maxFileSize()));
             return;
         case UPLOAD_ERR_PARTIAL:
             @unlink($_FILES[$param]['tmp_name']);
@@ -79,35 +83,140 @@ class ImageFile
             return;
         }
 
-        $imagefile = new ImageFile($_FILES[$param]['tmp_name']);
-        $info = @getimagesize($imagefile->filename);
+        $info = @getimagesize($_FILES[$param]['tmp_name']);
 
         if (!$info) {
-            @unlink($imagefile->filename);
+            @unlink($_FILES[$param]['tmp_name']);
             throw new Exception(_('Not an image or corrupt file.'));
             return;
         }
 
-        $imagefile->width = $info[0];
-        $imagefile->height = $info[1];
+        if ($info[2] !== IMAGETYPE_GIF &&
+            $info[2] !== IMAGETYPE_JPEG &&
+            $info[2] !== IMAGETYPE_PNG) {
 
-        switch ($info[2]) {
-        case IMAGETYPE_GIF:
-        case IMAGETYPE_JPEG:
-        case IMAGETYPE_PNG:
-            $imagefile->type = $info[2];
-            break;
-        default:
-            @unlink($imagefile->filename);
+            @unlink($_FILES[$param]['tmp_name']);
             throw new Exception(_('Unsupported image file format.'));
             return;
         }
 
-        return $imagefile;
+        return new ImageFile(null, $_FILES[$param]['tmp_name']);
+    }
+
+    function resize($size, $x = 0, $y = 0, $w = null, $h = null)
+    {
+        $w = ($w === null) ? $this->width:$w;
+        $h = ($h === null) ? $this->height:$h;
+
+        if (!file_exists($this->filepath)) {
+            throw new Exception(_('Lost our file.'));
+            return;
+        }
+
+        switch ($this->type) {
+         case IMAGETYPE_GIF:
+            $image_src = imagecreatefromgif($this->filepath);
+            break;
+         case IMAGETYPE_JPEG:
+            $image_src = imagecreatefromjpeg($this->filepath);
+            break;
+         case IMAGETYPE_PNG:
+            $image_src = imagecreatefrompng($this->filepath);
+            break;
+         default:
+            throw new Exception(_('Unknown file type'));
+            return;
+        }
+
+        $image_dest = imagecreatetruecolor($size, $size);
+
+        if ($this->type == IMAGETYPE_GIF || $this->type == IMAGETYPE_PNG) {
+
+            $transparent_idx = imagecolortransparent($image_src);
+
+            if ($transparent_idx >= 0) {
+
+                $transparent_color = imagecolorsforindex($image_src, $transparent_idx);
+                $transparent_idx = imagecolorallocate($image_dest, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']);
+                imagefill($image_dest, 0, 0, $transparent_idx);
+                imagecolortransparent($image_dest, $transparent_idx);
+
+            } elseif ($this->type == IMAGETYPE_PNG) {
+
+                imagealphablending($image_dest, false);
+                $transparent = imagecolorallocatealpha($image_dest, 0, 0, 0, 127);
+                imagefill($image_dest, 0, 0, $transparent);
+                imagesavealpha($image_dest, true);
+
+            }
+        }
+
+        imagecopyresampled($image_dest, $image_src, 0, 0, $x, $y, $size, $size, $w, $h);
+
+        $outname = Avatar::filename($this->id,
+                                          image_type_to_extension($this->type),
+                                          $size,
+                                          common_timestamp());
+
+        $outpath = Avatar::path($outname);
+
+        switch ($this->type) {
+         case IMAGETYPE_GIF:
+            imagegif($image_dest, $outpath);
+            break;
+         case IMAGETYPE_JPEG:
+            imagejpeg($image_dest, $outpath);
+            break;
+         case IMAGETYPE_PNG:
+            imagepng($image_dest, $outpath);
+            break;
+         default:
+            throw new Exception(_('Unknown file type'));
+            return;
+        }
+
+        return $outname;
     }
 
     function unlink()
     {
         @unlink($this->filename);
     }
+
+    static function maxFileSize()
+    {
+        $value = ImageFile::maxFileSizeInt();
+
+        if ($value > 1024 * 1024) {
+            return ($value/(1024*1024)).'Mb';
+        } else if ($value > 1024) {
+            return ($value/(1024)).'kB';
+        } else {
+            return $value;
+        }
+    }
+
+    static function maxFileSizeInt()
+    {
+        return min(ImageFile::strToInt(ini_get('post_max_size')),
+                   ImageFile::strToInt(ini_get('upload_max_filesize')),
+                   ImageFile::strToInt(ini_get('memory_limit')));
+    }
+
+    static function strToInt($str)
+    {
+        $unit = substr($str, -1);
+        $num = substr($str, 0, -1);
+
+        switch(strtoupper($unit)){
+            case 'G':
+                $num *= 1024;
+            case 'M':
+                $num *= 1024;
+            case 'K':
+                $num *= 1024;
+        }
+
+        return $num;
+    }
 }
\ No newline at end of file
index f1be5776813164dd5e37999d4a900d8eaf118c72..f41d984d6261a46698f11cf27de238d8698e3ce1 100644 (file)
@@ -178,7 +178,7 @@ function jabber_format_entry($profile, $notice)
     $entry .= "<link href='" . htmlspecialchars($profile->profileurl) . "'/>\n";
     $entry .= "<link rel='self' type='application/rss+xml' href='" . $self_url . "'/>\n";
     $entry .= "<author><name>" . $profile->nickname . "</name></author>\n";
-    $entry .= "<icon>" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "</icon>\n";
+    $entry .= "<icon>" . $profile->avatarUrl(AVATAR_PROFILE_SIZE) . "</icon>\n";
     $entry .= "</source>\n";
     $entry .= "<title>" . htmlspecialchars($msg) . "</title>\n";
     $entry .= "<summary>" . htmlspecialchars($msg) . "</summary>\n";
index 8d5d44e49de6df002df9fa10749a51500577519b..d77234549af7f27bc33ece11ddcfca4719ae1c40 100644 (file)
@@ -63,6 +63,8 @@ class MailboxAction extends PersonalAction
             $this->page = 1;
         }
 
+        common_set_returnto($this->selfUrl());
+
         return true;
     }
 
@@ -181,8 +183,8 @@ class MailboxAction extends PersonalAction
                                        'class' => 'url'));
         $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
         $this->element('img', array('src' => ($avatar) ?
-                                    common_avatar_display_url($avatar) :
-                                    common_default_avatar(AVATAR_STREAM_SIZE),
+                                    $avatar->displayUrl() :
+                                    Avatar::defaultImage(AVATAR_STREAM_SIZE),
                                     'class' => 'photo avatar',
                                     'width' => AVATAR_STREAM_SIZE,
                                     'height' => AVATAR_STREAM_SIZE,
index 7c88c33cc44ccb5615571a3b966747e485be21e4..9fc0126b3eb95e4def41607b9540330fe16dd572 100644 (file)
@@ -203,11 +203,14 @@ class NoticeListItem extends Widget
 
     function showNoticeOptions()
     {
-        $this->out->elementStart('div', 'notice-options');
-        $this->showFaveForm();
-        $this->showReplyLink();
-        $this->showDeleteLink();
-        $this->out->elementEnd('div');
+        $user = common_current_user();
+        if ($user) {
+            $this->out->elementStart('div', 'notice-options');
+            $this->showFaveForm();
+            $this->showReplyLink();
+            $this->showDeleteLink();
+            $this->out->elementEnd('div');
+        }
     }
 
     /**
@@ -282,8 +285,8 @@ class NoticeListItem extends Widget
         $avatar = $this->profile->getAvatar($avatar_size);
 
         $this->out->element('img', array('src' => ($avatar) ?
-                                         common_avatar_display_url($avatar) :
-                                         common_default_avatar($avatar_size),
+                                         $avatar->displayUrl() :
+                                         Avatar::defaultImage($avatar_size),
                                          'class' => 'avatar photo',
                                          'width' => $avatar_size,
                                          'height' => $avatar_size,
index aa8e0322985c91fd7a49e95fe13fcfdf1fe0604c..97b51752965c1092c7bf7867e6d0aade184373ea 100644 (file)
@@ -82,7 +82,7 @@ class NoticeSection extends Section
                                             $profile->nickname,
                                             'href' => $profile->profileurl,
                                             'class' => 'url'));
-        $this->out->element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
+        $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() :  Avatar::defaultImage(AVATAR_MINI_SIZE)),
                                          'width' => AVATAR_MINI_SIZE,
                                          'height' => AVATAR_MINI_SIZE,
                                          'class' => 'avatar photo',
index 900df0257f78205a156a7d07f29df6edf573062a..e46350c630870385b44236a0cdc27e2f163db49c 100644 (file)
@@ -55,7 +55,6 @@ class PersonalAction extends Action
     function handle($args)
     {
         parent::handle($args);
-        common_set_returnto($this->selfUrl());
     }
 
 }
index 89daaa563ce7aa7a75e1f72c8e2e4a5157376630..5734d800189d9bdd7be139d85aef94775b8b53c7 100644 (file)
@@ -31,7 +31,7 @@ if (!defined('LACONICA')) {
     exit(1);
 }
 
-define('NOTICES_PER_SECTION', 6);
+define('NOTICES_PER_SECTION', 5);
 
 /**
  * Base class for sections showing lists of notices
index 6e14c0b692fd7d667f6c535df1a30db301df9d58..4d924b039e9647fd329240044a9874d11a9ead59 100644 (file)
@@ -97,7 +97,7 @@ class ProfileList extends Widget
         $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
         $this->out->elementStart('a', array('href' => $this->profile->profileurl,
                                             'class' => 'url'));
-        $this->out->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
+        $this->out->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE),
                                          'class' => 'photo avatar',
                                          'width' => AVATAR_STREAM_SIZE,
                                          'height' => AVATAR_STREAM_SIZE,
index 81cd7aed5583f66ffb06ab88e9c597d63cba2f8a..0d466bba81e7be3139c3b7e03cc99ac6545b8a27 100644 (file)
@@ -74,7 +74,7 @@ class ProfileMiniList extends ProfileList
                                        'rel' => 'contact member',
                                        'class' => 'url'));
         $avatar = $this->profile->getAvatar(AVATAR_MINI_SIZE);
-        $this->out->element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
+        $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() :  Avatar::defaultImage(AVATAR_MINI_SIZE)),
                                     'width' => AVATAR_MINI_SIZE,
                                     'height' => AVATAR_MINI_SIZE,
                                     'class' => 'avatar photo',
index 3642ae164a4fd946cb4bdfba615b58af612ab695..8ed290e03aa3c6195567da6c50401f8b12924cdf 100644 (file)
@@ -86,7 +86,7 @@ class ProfileSection extends Section
                                        'rel' => 'contact member',
                                        'class' => 'url'));
         $avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
-        $this->out->element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
+        $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() :  Avatar::defaultImage(AVATAR_MINI_SIZE)),
                                     'width' => AVATAR_MINI_SIZE,
                                     'height' => AVATAR_MINI_SIZE,
                                     'class' => 'avatar photo',
index 2bd7f1f19dcb18b338a43f01c0eb387eeb687506..131e8ac65acf86424b0b251b67527441f9b41966 100644 (file)
@@ -199,7 +199,7 @@ class Rss10Action extends Action
         $this->element('dc:date', null, common_date_w3dtf($notice->created));
         $this->element('dc:creator', null, ($profile->fullname) ? $profile->fullname : $profile->nickname);
         $this->element('sioc:has_creator', array('rdf:resource' => $creator_uri));
-        $this->element('laconica:postIcon', array('rdf:resource' => common_profile_avatar_url($profile)));
+        $this->element('laconica:postIcon', array('rdf:resource' => $profile->avatarUrl()));
         $this->element('cc:licence', array('rdf:resource' => common_config('license', 'url')));
         $this->elementEnd('item');
         $this->creators[$creator_uri] = $profile;
@@ -216,7 +216,7 @@ class Rss10Action extends Action
                 $this->element('foaf:name', null, $profile->fullname);
             }
             $this->element('sioc:id', null, $id);
-            $avatar = common_profile_avatar_url($profile);
+            $avatar = $profile->avatarUrl();
             $this->element('sioc:avatar', array('rdf:resource' => $avatar));
             $this->elementEnd('sioc:User');
         }
index dfe1f114b21e1b73dc10b36692a1b144e4db27e8..53c807c6f9cc834aaa6955d6107e8e11a5811742 100644 (file)
@@ -76,7 +76,12 @@ class SettingsAction extends Action
             // change important settings or see private info, and
             // _all_ our settings are important
             common_set_returnto($this->selfUrl());
-            common_redirect(common_local_url('login'));
+            $user = common_current_user();
+            if ($user->hasOpenID()) {
+                common_redirect(common_local_url('openidlogin'));
+            } else {
+                common_redirect(common_local_url('login'));
+            }
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
             $this->handlePost();
         } else {
index da8b8b1e5b4f3e83625d020907908c6b87ee55e0..a4d183fcd05e3c3739185755fc7e4be40a5d49ea 100644 (file)
@@ -43,7 +43,7 @@ class TwitterapiAction extends Action
 
         $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
 
-        $twitter_user['profile_image_url'] = ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE);
+        $twitter_user['profile_image_url'] = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE);
         $twitter_user['protected'] = 'false'; # not supported by Laconica yet
         $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : null;
 
index 07e124811e3969ae5280c7b13fcf19feda75eb5e..7ce4e229eb76f93a8a49568b2283f9fd95e33d4c 100644 (file)
@@ -386,46 +386,99 @@ function common_render_text($text)
     $r = htmlspecialchars($text);
 
     $r = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $r);
-    $r = preg_replace_callback('@(ftp|http|https|mms|rtsp|gopher|news|nntp|telnet|wais|file|prospero|webcal|xmpp|irc)://[^\]>\s]+@', 'common_render_uri_thingy', $r);
-    $r = preg_replace_callback('@(mailto|aim|tel):[^\]>\s]+@', 'common_render_uri_thingy', $r); // Pseudo-protocols don't require '//' after ':'.
-    $r = preg_replace('/(^|\s+)#([A-Za-z0-9_\-\.]{1,64})/e', "'\\1#'.common_tag_link('\\2')", $r);
+    $r = common_replace_urls_callback($r, 'common_linkify');
+    $r = preg_replace('/(^|\(|\[|\s+)#([A-Za-z0-9_\-\.]{1,64})/e', "'\\1#'.common_tag_link('\\2')", $r);
     // XXX: machine tags
     return $r;
 }
 
-function common_render_uri_thingy($matches)
-{
-    $uri = $matches[0];
-    $trailer = '';
+function common_replace_urls_callback($text, $callback) {
+    // Start off with a regex
+    $regex = '#
+    (?:
+        (?:
+            (?:https?|ftps?|mms|rtsp|gopher|news|nntp|telnet|wais|file|prospero|webcal|xmpp|irc)://
+            |
+            (?:mailto|aim|tel):
+        )
+        [^.\s]+\.[^\s]+
+        |
+        (?:[^.\s/:]+\.)+
+        (?:museum|travel|[a-z]{2,4})
+        (?:[:/][^\s]*)?
+    )
+    #ix';
+    preg_match_all($regex, $text, $matches);
+
+    // Then clean up what the regex left behind
+    $offset = 0;
+    foreach($matches[0] as $url) {
+        $url = htmlspecialchars_decode($url);
+
+        // Make sure we didn't pick up an email address
+        if (preg_match('#^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$#i', $url)) continue;
+
+        // Remove trailing punctuation
+        $url = rtrim($url, '.?!,;:\'"`');
+
+        // Remove surrounding parens and the like
+        preg_match('/[)\]>]+$/', $url, $trailing);
+        if (isset($trailing[0])) {
+            preg_match_all('/[(\[<]/', $url, $opened);
+            preg_match_all('/[)\]>]/', $url, $closed);
+            $unopened = count($closed[0]) - count($opened[0]);
+
+            // Make sure not to take off more closing parens than there are at the end
+            $unopened = ($unopened > mb_strlen($trailing[0])) ? mb_strlen($trailing[0]):$unopened;
+
+            $url = ($unopened > 0) ? mb_substr($url, 0, $unopened * -1):$url;
+        }
 
-    // Some heuristics for extracting URIs from surrounding punctuation
-    // Strip from trailing text...
-    if (preg_match('/^(.*)([,.:"\']+)$/', $uri, $matches)) {
-        $uri = $matches[1];
-        $trailer = $matches[2];
-    }
+        // Remove trailing punctuation again (in case there were some inside parens)
+        $url = rtrim($url, '.?!,;:\'"`');
 
-    $pairs = array(
-                   ']' => '[', // technically disallowed in URIs, but used in Java docs
-                   ')' => '(', // far too frequent in Wikipedia and MSDN
-                   );
-    $final = substr($uri, -1, 1);
-    if (isset($pairs[$final])) {
-        $openers = substr_count($uri, $pairs[$final]);
-        $closers = substr_count($uri, $final);
-        if ($closers > $openers) {
-            // Assume the paren was opened outside the URI
-            $uri = substr($uri, 0, -1);
-            $trailer = $final . $trailer;
+        // Make sure we didn't capture part of the next sentence
+        preg_match('#((?:[^.\s/]+\.)+)(museum|travel|[a-z]{2,4})#i', $url, $url_parts);
+
+        // Were the parts capitalized any?
+        $last_part = (mb_strtolower($url_parts[2]) !== $url_parts[2]) ? true:false;
+        $prev_part = (mb_strtolower($url_parts[1]) !== $url_parts[1]) ? true:false;
+
+        // If the first part wasn't cap'd but the last part was, we captured too much
+        if ((!$prev_part && $last_part)) {
+            $url = substr_replace($url, '', mb_strpos($url, '.'.$url_parts[2], 0));
         }
+
+        // Capture the new TLD
+        preg_match('#((?:[^.\s/]+\.)+)(museum|travel|[a-z]{2,4})#i', $url, $url_parts);
+
+        $tlds = array('ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'arpa', 'as', 'asia', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo', 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cat', 'cc', 'cd', 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop', 'cr', 'cu', 'cv', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'edu', 'ee', 'eg', 'er', 'es', 'et', 'eu', 'fi', 'fj', 'fk', 'fm', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi', 'gl', 'gm', 'gn', 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jobs', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'me', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net', 'nf', 'ng', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa', 'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'ro', 'rs', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td', 'tel', 'tf', 'tg', 'th', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'za', 'zm', 'zw');
+
+        if (!in_array($url_parts[2], $tlds)) continue;
+
+        // Call user specified func
+        $modified_url = $callback($url);
+
+        // Replace it!
+        $start = mb_strpos($text, $url, $offset);
+        $text = mb_substr($text, 0, $start).$modified_url.mb_substr($text, $start + mb_strlen($url), mb_strlen($text));
+        $offset = $start + mb_strlen($modified_url);
     }
-    if ($longurl = common_longurl($uri)) {
+
+    return $text;
+}
+
+function common_linkify($url) {
+    $display = $url;
+    $url = (!preg_match('#^([a-z]+://|(mailto|aim|tel):)#i', $url)) ? 'http://'.$url:$url;
+
+    if ($longurl = common_longurl($url)) {
         $longurl = htmlentities($longurl, ENT_QUOTES, 'UTF-8');
-        $title = " title='$longurl'";
+        $title = "title=\"$longurl\"";
     }
     else $title = '';
 
-    return '<a href="' . $uri . '"' . $title . ' class="extlink">' . $uri . '</a>' . $trailer;
+    return "<a href=\"$url\" $title class=\"extlink\">$display</a>";
 }
 
 function common_longurl($short_url)
@@ -449,7 +502,7 @@ function common_shorten_links($text)
     static $cache = array();
     if (isset($cache[$text])) return $cache[$text];
     // \s = not a horizontal whitespace character (since PHP 5.2.4)
-    return $cache[$text] = preg_replace('@https?://[^)\]>\s]+@e', "common_shorten_link('\\0')", $text);
+    return $cache[$text] = common_replace_urls_callback($text, 'common_shorten_link');;
 }
 
 function common_shorten_link($url, $reverse = false)
@@ -614,48 +667,6 @@ function common_relative_profile($sender, $nickname, $dt=null)
     return null;
 }
 
-// where should the avatar go for this user?
-
-function common_avatar_filename($id, $extension, $size=null, $extra=null)
-{
-    global $config;
-
-    if ($size) {
-        return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension;
-    } else {
-        return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension;
-    }
-}
-
-function common_avatar_path($filename)
-{
-    global $config;
-    return INSTALLDIR . '/avatar/' . $filename;
-}
-
-function common_avatar_url($filename)
-{
-    return common_path('avatar/'.$filename);
-}
-
-function common_avatar_display_url($avatar)
-{
-    $server = common_config('avatar', 'server');
-    if ($server) {
-        return 'http://'.$server.'/'.$avatar->filename;
-    } else {
-        return $avatar->url;
-    }
-}
-
-function common_default_avatar($size)
-{
-    static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
-                              AVATAR_STREAM_SIZE => 'stream',
-                              AVATAR_MINI_SIZE => 'mini');
-    return theme_path('default-avatar-'.$sizenames[$size].'.png');
-}
-
 function common_local_url($action, $args=null, $fragment=null)
 {
     $url = null;
@@ -697,6 +708,8 @@ function common_fancy_url($action, $args=null)
         return common_path("api/statuses/public_timeline.atom");
      case 'publicxrds':
         return common_path('xrds');
+     case 'tagrss':
+        return common_path('tag/' . $args['tag'] . '/rss');
      case 'featuredrss':
         return common_path('featuredrss');
      case 'favoritedrss':
@@ -898,7 +911,7 @@ function common_fancy_url($action, $args=null)
      case 'grouprss':
         return common_path('group/'.$args['nickname'].'/rss');
      case 'groupmembers':
-        return common_path('group/'.$args['nickname'].'/members');
+        return common_path('group/'.$args['nickname'].'/members' . (($args['page']) ? ('?page=' . $args['page']) : ''));
      case 'grouplogo':
         return common_path('group/'.$args['nickname'].'/logo');
      case 'usergroups':
@@ -1470,16 +1483,6 @@ function common_markup_to_html($c)
     return Markdown($c);
 }
 
-function common_profile_avatar_url($profile, $size=AVATAR_PROFILE_SIZE)
-{
-    $avatar = $profile->getAvatar($size);
-    if ($avatar) {
-        return common_avatar_display_url($avatar);
-    } else {
-        return common_default_avatar($size);
-    }
-}
-
 function common_profile_uri($profile)
 {
     if (!$profile) {
index 3a4f8315d338ff7a79f7576e9b3b7302e1284b19..40f60da5d80996fc19901c61546fc91be72e57ba 100755 (executable)
@@ -74,7 +74,7 @@ class EnjitQueueHandler extends QueueHandler
         $atom .= "<link href='" . $profile->profileurl . "'/>\n";
         $atom .= "<link rel='self' type='application/rss+xml' href='" . common_local_url('userrss', array('nickname' => $profile->nickname)) . "'/>\n";
         $atom .= "<author><name>" . $profile->nickname . "</name></author>\n";
-        $atom .= "<icon>" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "</icon>\n";
+        $atom .= "<icon>" . $profile->avatarUrl(AVATAR_PROFILE_SIZE) . "</icon>\n";
         $atom .= "</source>\n";
         $atom .= "<title>" . htmlspecialchars($msg) . "</title>\n";
         $atom .= "<summary>" . htmlspecialchars($msg) . "</summary>\n";
index 809c1ba6f8481951a0f0bbf6f972c36cc5df9265..3b72d00ceeb85442ea428e59a1d17dd820fd47a5 100644 (file)
@@ -20,12 +20,11 @@ font-family:sans-serif;
 font-size:1em;
 line-height:1.65;
 position:relative;
-margin:0 auto;
-width:71.714em;
 }
 h1,h2,h3,h4,h5,h6 {
 text-transform:uppercase;
 margin-bottom:7px;
+overflow:hidden;
 }
 h1 {
 font-size:1.4em;
@@ -153,7 +152,8 @@ font-weight:bold;
 #form_remote_subscribe legend,
 #form_openid_login legend,
 #form_search legend,
-#form_invite legend {
+#form_invite legend,
+#form_notice_delete legend {
 display:none;
 }
 
@@ -180,6 +180,7 @@ float:left;
 width:90%;
 }
 
+
 #form_login p.form_guide,
 #form_register #settings_rememberme p.form_guide,
 #form_openid_login #settings_rememberme p.form_guide,
@@ -195,12 +196,16 @@ border-radius:4px;
 padding:0 7px;
 }
 
+
+.form_settings input.form_action-secondary {
+margin-left:29px;
+padding:0;
+}
+
 #form_search .submit {
 margin-left:11px;
 }
 
-
-
 address {
 float:left;
 margin-bottom:18px;
@@ -240,10 +245,9 @@ display:none;
 
 #site_notice {
 position:absolute;
-right:0;
-top:49px;
-float:right;
-width:300px;
+top:65px;
+right:18px;
+width:250px;
 }
 #page_notice {
 clear:both;
@@ -254,6 +258,7 @@ margin-bottom:18px;
 #anon_notice {
 float:left;
 width:432px;
+width:28.052em;
 padding:11px;
 border-radius:7px;
 -moz-border-radius:7px;
@@ -361,9 +366,10 @@ margin-right:4px;
 }
 
 #wrap {
-float:left;
 margin:0 auto;
 width:71.714em;
+width:1003px;
+overflow:hidden;
 }
 
 #core {
@@ -391,9 +397,9 @@ float:left;
 }
 
 #aside_primary {
-width:284px;
+width:280px;
 float:left;
-margin-left:2px;
+margin-left:4px;
 padding:18px;
 border-radius:7px;
 -moz-border-radius:7px;
@@ -509,6 +515,7 @@ min-height:123px;
 float:left;
 margin-bottom:18px;
 margin-left:0;
+overflow:hidden;
 }
 .entity_profile dt,
 #entity_statistics dt {
@@ -606,12 +613,14 @@ display:block;
 .form_user_block input.submit,
 .form_user_unblock input.submit,
 .entity_send-a-message a,
+.entity_edit a,
 .form_user_nudge input.submit,
 .entity_nudge p {
 border:0;
 padding-left:20px;
 }
 
+.entity_edit a,
 .entity_send-a-message a,
 .entity_nudge p {
 padding:4px 4px 4px 23px;
@@ -749,7 +758,7 @@ border-radius:4px;
 /* NOTICES */
 #notices_primary {
 float:left;
-width:644px;
+width:100%;
 border-radius:7px;
 -moz-border-radius:7px;
 -webkit-border-radius:7px;
@@ -766,6 +775,10 @@ padding-left:28px;
 margin-right:11px;
 }
 
+.fn {
+overflow:hidden;
+}
+
 .notice .author .fn {
 font-weight:bold;
 }
@@ -790,7 +803,7 @@ text-decoration:underline;
 .notice .entry-title {
 float:left;
 width:100%;
-overflow:auto;
+overflow:hidden;
 }
 #shownotice .notice .entry-title {
 font-size:2.2em;
@@ -934,7 +947,7 @@ padding:0;
 
 
 
-#new_group {
+#new_group, #group_search {
 margin-bottom:18px;
 }
 #new_group a {
@@ -1063,13 +1076,20 @@ margin-bottom:0;
 }
 
 .section .notice {
-padding-top:11px;
-padding-bottom:11px;
+padding-top:7px;
+padding-bottom:7px;
+border-top:0;
 }
 
 .section .notice:first-child {
 padding-top:0;
-border-top:0;
+}
+
+.section .notice .author {
+margin-right:0;
+}
+.section .notice .author .fn {
+display:none;
 }
 
 
@@ -1154,3 +1174,5 @@ clear:both;
 #form_settings_avatar .form_actions {
 margin-bottom:0;
 }
+
+
index af188ad7a1106c185945809ed14751697ea4a291..163b41fb4caa1e96ee857d0371db10dabb003436 100644 (file)
@@ -1,10 +1,86 @@
 @import url("display.css");
 @import url("../../identica/css/display.css");
 
-span.facebook-button { border: 2px solid #777; padding: 5px; display: block; float: left; margin-right: 20px; -moz-border-radius: 4px; border-radius:4px; -webkit-border-radius:4px; font-weight: bold; background-color:#A9BF4F; color:#fff; font-size:1.2em }
+* {
+font-size:14px;
+font-family:"Lucida Sans Unicode", "Lucida Grande", sans-serif;
+}
+
+#wrap {
+background-color:#F0F2F5;
+padding-left:18px;
+padding-right:18px;
+width:auto;
+}
+
+p,label,
+h1,h2,h3,h4,h5,h6 {
+color:#000;
+}
+
+#content {
+width:95%;
+}
+
+#site_nav_local_views a {
+background-color:#D0DFE7;
+}
+#site_nav_local_views a:hover {
+background-color:#FAFBFC;
+}
+
+span.facebook-button {
+border: 2px solid #aaa;
+padding: 3px;
+display: block;
+float: left;
+margin-right: 20px;
+-moz-border-radius: 4px; 
+border-radius:4px; 
+-webkit-border-radius:4px;
+font-weight: bold;
+background-color:#A9BF4F;
+color:#fff;
+font-size:1.2em
+}
 
 span.facebook-button a { color:#fff }
 
+.facebook_guide {
+margin-bottom:18px;
+}
+.facebook_guide p {
+font-weight:bold;
+}
+
+
+input {
+height:auto !important;
+}
+
+#facebook-friends {
+float:left;
+width:100%;
+}
+
+#facebook-friends li {
+float:left;
+margin-right:2%;
+margin-bottom:11px;
+width:18%;
+height:115px;
+}
+#facebook-friends li a {
+float:left;
+}
+
+#add_to_profile {
+position:absolute;
+right:18px;
+top:10px;
+z-index:2;
+}
+
 .notice div.entry-content dl,
 .notice div.entry-content dt, 
 .notice div.entry-content dd {
@@ -19,12 +95,6 @@ margin-bottom:18px;
 list-style-type:none;
 }
 
-.facebook_guide p {
-margin-bottom:18px;
-font-size:1.3em;
-font-weight:bold;
-}
-
 .form_settings label {
 margin-right:18px;
 }
diff --git a/theme/base/images/icons/icon_atom.jpg b/theme/base/images/icons/icon_atom.jpg
deleted file mode 100644 (file)
index 22853ed..0000000
Binary files a/theme/base/images/icons/icon_atom.jpg and /dev/null differ
diff --git a/theme/base/images/icons/icon_atom.png b/theme/base/images/icons/icon_atom.png
new file mode 100644 (file)
index 0000000..6a001f1
Binary files /dev/null and b/theme/base/images/icons/icon_atom.png differ
diff --git a/theme/base/images/icons/icon_rss.jpg b/theme/base/images/icons/icon_rss.jpg
deleted file mode 100644 (file)
index da23422..0000000
Binary files a/theme/base/images/icons/icon_rss.jpg and /dev/null differ
diff --git a/theme/base/images/icons/icon_rss.png b/theme/base/images/icons/icon_rss.png
new file mode 100644 (file)
index 0000000..0ccd1ce
Binary files /dev/null and b/theme/base/images/icons/icon_rss.png differ
diff --git a/theme/default/bg-body.gif b/theme/default/bg-body.gif
deleted file mode 100644 (file)
index 5e1afa0..0000000
Binary files a/theme/default/bg-body.gif and /dev/null differ
diff --git a/theme/default/bg-header.gif b/theme/default/bg-header.gif
deleted file mode 100644 (file)
index a34b9b3..0000000
Binary files a/theme/default/bg-header.gif and /dev/null differ
index 97a6a12a8f2631ace41e87b1682dc44ae986d904..85b5aa13e538ad9335cd80ad16317e5b08c90aff 100644 (file)
@@ -34,6 +34,9 @@ border-color:#aaa;
 border-color:#97BFD1;
 }
 
+.form_settings input.form_action-secondary {
+background:none;
+}
 
 input.submit,
 #form_notice.warning #notice_text-count,
@@ -59,7 +62,8 @@ div.notice-options input,
 .form_user_unblock input.submit,
 .entity_send-a-message a,
 .form_user_nudge input.submit,
-.entity_nudge p {
+.entity_nudge p,
+.form_settings input.form_action-secondary {
 color:#002E6E;
 }
 
@@ -67,7 +71,6 @@ color:#002E6E;
 .profile {
 border-top-color:#D1D9E4;
 }
-.section .notice,
 .section .profile {
 border-top-color:#97BFD1;
 }
@@ -92,12 +95,6 @@ color:#333;
 color:#000;
 }
 
-#form_notice #notice_data-attach_view {
-background-image:url(../images/icons/twotone/green/paper-clip.gif);
-background-repeat:no-repeat;
-background-position:0 45%;
-background-color:transparent;
-}
 
 #nav_register a {
 text-decoration:none;
@@ -123,8 +120,6 @@ background-color:rgba(255, 255, 255, 0.7);
 }
 
 
-
-
 #page_notice .error {
 background-color:#F7E8E8;
 }
@@ -144,26 +139,21 @@ background-color:#A9BF4F;
 }
 
 
-
-
 #export_data li a {
 background-repeat:no-repeat;
 background-position:0 45%;
 }
 #export_data li a.rss {
-background-image:url(../../base/images/icons/icon_rss.jpg);
+background-image:url(../../base/images/icons/icon_rss.png);
 }
 #export_data li a.atom {
-background-image:url(../../base/images/icons/icon_atom.jpg);
+background-image:url(../../base/images/icons/icon_atom.png);
 }
 #export_data li a.foaf {
 background-image:url(../../base/images/icons/icon_foaf.gif);
 }
-#export_data li a.export_vcard {
-background-image:url(../../base/images/icons/icon_vcard.gif);
-}
-
 
+.entity_edit a,
 .entity_send-a-message a,
 .form_user_nudge input.submit,
 .form_user_block input.submit,
@@ -185,6 +175,9 @@ color:#fff;
 background-color:#97BFD1;
 }
 
+.entity_edit a {
+background-image:url(../images/icons/twotone/green/edit.gif);
+}
 .entity_send-a-message a {
 background-image:url(../images/icons/twotone/green/quote.gif);
 }
@@ -204,30 +197,6 @@ background-image:url(../images/icons/twotone/green/shield.gif);
 background-color:#fcfcfc;
 }
 
-.notice-data a span {
-background-color:transparent;
-background-repeat:no-repeat;
-background-position:0 45%;
-}
-.notice_video .notice-data a span {
-background-image:url(../images/icons/twotone/green/camera.gif);
-}
-.notice_audio .notice-data a span {
-background-image:url(../images/icons/twotone/green/music.gif);
-}
-.notice_image .notice-data a span {
-background-image:url(../images/icons/twotone/green/search.gif);
-}
-.notice_event .notice-data a span {
-background-image:url(../images/icons/twotone/green/calendar.gif);
-}
-.notice_location .notice-data a span {
-background-image:url(../images/icons/twotone/green/flag.gif);
-}
-.notice_document .notice-data a span {
-background-image:url(../images/icons/twotone/green/document.gif);
-}
-
 .notice-options .notice_reply a,
 .notice-options form input.submit {
 background-color:transparent;
@@ -269,17 +238,21 @@ background-color:#fcfcfc;
 #new_group a {
 background:transparent url(../images/icons/twotone/green/news.gif) no-repeat 0 45%;
 }
-
+#usergroups #new_group {
+float: left;
+margin-right: 2em;
+}
 
 .pagination .nav_prev a,
 .pagination .nav_next a {
 background-repeat:no-repeat;
+border-color:#D1D9E4;
 }
 .pagination .nav_prev a {
 background-image:url(../images/icons/twotone/green/arrow-left.gif);
-background-position:0 45%;
+background-position:10% 45%;
 }
 .pagination .nav_next a {
 background-image:url(../images/icons/twotone/green/arrow-right.gif);
-background-position:100% 45%;
+background-position:90% 45%;
 }
diff --git a/theme/default/css/ie.css b/theme/default/css/ie.css
new file mode 100644 (file)
index 0000000..2b06768
--- /dev/null
@@ -0,0 +1,9 @@
+/* IE specific styles */
+
+.notice-options input.submit {
+color:#fff;
+}
+
+#site_nav_local_views a {
+background-color:#ACCCDA;
+}
diff --git a/theme/default/display.css b/theme/default/display.css
deleted file mode 100644 (file)
index f22f9aa..0000000
+++ /dev/null
@@ -1,1107 +0,0 @@
-/* CSS Document */
-/* Design & CSS by Marie-Claude Doyon http://www.marieclaudedoyon.com */
-
-html {
-       background-color: #f6e5b0;
-       }
-body {
-       position: absolute;
-       width: 100%;
-       margin: 0;
-       padding: 0;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 10px;
-       line-height: 12px;
-       min-height: 100%;
-       height: 100%;
-    color: #701238;
-       }
-a {
-       color: #d1451a;
-       text-decoration: none;
-       }
-a:hover {
-       text-decoration: underline;
-       }
-img, img a {
-       border: 0;
-       }
-h1 {
-       font-size: 14px;
-       }
-
-#wrap {
-       margin: 0 auto;
-       padding: 0 20px;
-       width: 760px;
-       background: url(bg-header.gif) repeat-x #fbf2d7;
-       }
-#header {
-       position: relative;
-       margin: 0 auto;
-       width: 600px;
-       height: 216px;
-       }
-#logo {
-       margin-top: 9px;
-       }
-p#branding {
-       margin: 0;
-       padding: 6px 0 3px 0;
-       color: #fbf2d7;
-       font-size: 21px;
-       font-weight: bold;
-       line-height: 27px;
-       }
-p#branding a {
-       color: #dab134;
-       }
-
-#header h1.pagetitle {
-       margin: 0;
-       padding: 0;
-       font-size: 15px;
-       line-height: 24px;
-       color: #fff6d5;
-}
-
-#header h2.sitename {
-       display: none;
-       margin: 0;
-       padding: 0;
-       color: #fff6d5;
-}
-
-abbr.published { border-bottom:0; }
-
-/* ===== Begin Navigation Styling ===== */
-
-/* ----- Navigation ------ */
-#nav {
-       float: right;
-       margin: 0;
-       padding: 0;
-       list-style-type: none;
-       font-size: 12px;
-       }
-#nav li {
-       display: block;
-       float: left;
-       }
-#nav li a {
-       display: block;
-       padding: 9px 9px 12px 9px;
-       color: #F60;
-       }
-#nav li a:hover {
-       text-decoration: underline;
-       }
-
-/* ----- Tabs ----- */
-#nav_views {
-       margin: 0 auto;
-       padding: 0;
-       position: absolute;
-       bottom: 0;
-       list-style-type: none;
-       font-size: 14px;
-       font-weight: bold;
-       width: 600px;
-       /*height: 30px;*/
-       }
-#nav_views li {
-       display: block;
-       float: left;
-       line-height: 21px;
-       }
-#nav_views li a {
-       display: block;
-       margin: 0;
-       padding: 4px 12px 3px 12px;
-       color: #fff6d5;
-       background-color: #d1451a;
-       border-right: 1px solid #dcaa3f;
-       }
-#nav_views li a:hover {
-       text-decoration: none;
-       }
-#nav_views li.current a, #nav_views li.current a:hover {
-       color: #701238;
-       background-color: #fff6d5;
-       border-right: 1px solid #dcaa3f;
-       }
-#nav_views li.current a:hover {
-       color: #d1451a;
-       }
-#nav_views li a:hover {
-       color: #fff6d5;
-       background-color: #701238;
-       border-right: 1px solid #dcaa3f;
-       }
-
-.feeds {
-clear:both;
-float:right;
-margin-top:1.25em;
-position:absolute;
-right:0;
-bottom:-30px;
-}
-.feeds * {
-line-height:1.4;
-padding:0;
-margin:0;
-font-size:12px;
-}
-
-.feeds p {
-font-weight:bold;
-display:inline;
-display:none;
-}
-.feeds ul {
-display:inline;
-}
-.feeds li {
-list-style-type:none;
-display:inline;
-margin-left:0.5em;
-}
-.feeds li a.rss,
-.feeds li a.atom {
-background:url(icon_feed.jpg) no-repeat;
-padding-top:2px;
-padding-left:20px;
-}
-.feeds li a.foaf {
-background:url(icon_foaf.gif) no-repeat;
-padding-top:2px;
-padding-left:30px;
-}
-
-form#disfavor, form.disfavor,
-form#favor, form.favor  {
-       float: right;
-}
-
-/*favorites*/
-input#favor, input.favor,
-input#disfavor, input.disfavor  {
-       background-color:#fcfff5;
-       background-color:transparent;
-       background-image:url(icon_heart-02.gif);
-       background-repeat:no-repeat;
-       cursor: pointer;
-       border: 0;
-       width: 16px;
-       height:16px;
-       text-indent:-9999px;
-}
-
-input#disfavor, input.disfavor {
-       background-image:url(icon_heart-01.gif);
-}
-
-.notice_single:hover input.favor,
-.notice_single:hover input.disfavor {
-       background-color:#f3f8ea;
-}
-
-/*profile_actions*/
-#profile_actions {
-padding-left:0;
-list-style-type:none;
-margin:0;
-}
-#profile_actions li {
-margin-bottom:0.5em;
-clear:both;
-}
-
-#profile_actions #profile_nudge input.submit,
-#profile_actions #profile_block input.submit,
-.profile_single form.block input.submit {
-margin:0 0 0 -3px;
-padding:0;
-background-color:transparent;
-color:#C15D42;
-font-family:Georgia,"Times New Roman",Times,serif;
-font-weight:normal;
-font-size:14px;
-text-align:left;
-float:left;
-line-height:18px;
-}
-#profile_actions #profile_nudge input.submit:hover,
-#profile_actions #profile_block input.submit:hover {
-background-color:transparent;
-color:#C15D42;
-}
-
-#wrap p#nudge_response {
-background-color:transparent;
-line-height:18px;
-font-size:14px;
-}
-#wrap #profile_nudge input.disabled {
-color:#999;
-cursor:default;
-}
-
-
-#wrap form input.disabled,
-#wrap form input.disabled:hover {
-background-color:#999;
-cursor:default;
-}
-
-/* ----- Nav Footer ----- */
-#nav_sub {
-       clear: both;
-       margin: 18px auto 0 auto;
-       padding: 0;
-       list-style-type: none;
-       font-size: 11px;
-       font-weight: bold;
-       line-height: 21px;
-       border-top: 1px solid #dec5b5;
-       width: 600px;
-       }
-#nav_sub li {
-       display: block;
-       float: left;
-       }
-#nav_sub li a {
-       padding: 6px 24px 6px 0;
-       }
-#nav_sub li a:hover {
-       text-decoration: underline;
-       }
-/* ===== End Navigation Styling ===== */
-
-#content {
-       clear: left;
-       margin: 40px 0 45px 0;
-       padding: 0 80px;
-       font-family: Georgia, "Times New Roman", Times, serif;
-       font-size: 14px;
-       line-height: 18px;
-       }
-#content h2 {
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 15px;
-       }
-#content label {
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 12px;
-       }
-.instructions p, .success, .error {
-       font-weight: normal;
-       margin: 36px 0 0 0;
-       padding: 10px;
-       font-family: Georgia, "Times New Roman", Times, serif;
-       font-size: 13px;
-       line-height: 15px;
-       border: 1px solid #dec5b5;
-       color: #fff6d5;
-       }
-.instructions a, .success a, .error a {
-       color: #d8e2d7;
-       text-decoration: underline;
-       }
-.instructions a:hover, .success a:hover, .error a:hover {
-       color: #fff6d5;
-       }
-.success {
-       background-color: #48705b;
-       }
-.error {
-       background-color: #ce3728;
-       }
-
-/* ----- Stream -----*/
-
-#notices {
-       clear: both;
-       margin: 0 auto;
-       padding: 0;
-       list-style-type: none;
-       width: 600px;
-       border-top: 1px solid #dec5b5;
-       }
-#notices a:hover {
-       text-decoration: underline;
-       }
-.notice_single {
-       clear: both;
-       display: block;
-       margin: 0;
-       padding: 5px 5px 5px 0;
-       min-height: 48px;
-       font-family: Georgia, "Times New Roman", Times, serif;
-       font-size: 13px;
-       line-height: 16px;
-       border-bottom: 1px solid #dec5b5;
-       background-color:#FCFFF5;
-       opacity:1;
-       }
-.notice_single:hover {
-       background-color: #f7ebcc;
-       }
-.notice_single p {
-       display: inline;
-       margin: 0;
-       padding: 0;
-       }
-#notice_delete_form #confirmation_text {
-    display: block;
-       font-size: 14px;
-       font-weight: bold;
-       }
-
-input#submit_yes, input#submit_no {
-       margin: 18px 10px 0px 0px;
-       padding: 4px;
-       font-weight: bold;
-       color: #fff6d5;
-       background-color: #F60;
-       cursor: pointer;
-       border: 0;
-       width: 40px;
-       }
-input#submit_yes:hover, input#submit_no:hover {
-       background-color: #701238;
-       }
-.avatar.stream {
-       float: left;
-       margin: 0 10px 0.5em 0;
-       }
-p.time {
-       display: block;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 10px;
-       line-height: 15px;
-       }
-p.time a {
-       color: #dab134;
-       }
-
-/* ----- Profile -----*/
-#profile {
-       clear: left;
-       margin: 0 -80px;
-       padding: 10px 0 0 0;
-       min-height: 170px;
-       border-top: 1px solid #dec5b5;
-       font-family: Georgia, "Times New Roman", Times, serif;
-       margin-bottom:1em;
-       float:left;
-       width:750px;
-       }
-#profile h1 {
-       margin: 0;
-       padding: 0;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 14px;
-       }
-#profile h2 {
-       margin: 0;
-       padding: 0;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 11px;
-       text-transform: uppercase;
-       color: #dab134;
-       }
-#profile p {
-       margin: 0 10px 0 0;
-       font-size: 12px;
-       line-height: 14px;
-       }
-#profile p.location {
-       margin: 0 10px 12px 0;
-       font-style: italic;
-       }
-#profile p.notice_current {
-       font-size: 18px;
-       line-height: 21px;
-       }
-#profile_avatar {
-       float: left;
-       margin-right: 4px;
-       }
-#profile_avatar img {
-       margin-bottom: 5px;
-       }
-.avatar.profile {
-       clear: left;
-       margin: 0 10px 5px 0;
-       }
-.avatar.original {
-       float: left;
-       margin: 0 10px 18px 0;
-       }
-
-#profilesettings {
-       margin-bottom:2em;
-}
-
-
-.avatar_view {
-       float:left;
-       margin-bottom:1em;
-       margin-right:1em;
-}
-
-#avatar_preview_view {
-       overflow:hidden;
-       width:96px;
-       height:96px;
-}
-#avatar_crop {
-       margin-bottom:2em;
-}
-
-#avatar_crop,
-#avatarfile {
-       clear:both;
-}
-
-a.nickname {
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-weight: bold;
-       font-size: 12px;
-       padding-right: 3px;
-       }
-.hentry a.nickname {
-       font-weight:normal;
-}
-#profile_information {
-       float: left;
-       position: relative;
-       width: 270px;
-       }
-.statistics {
-       margin-top: 18px;
-       }
-.statistics h2 {
-       margin: 12px 0 3px 0;
-       }
-dl.statistics {
-       margin: 0;
-       font-size: 12px;
-       line-height: 14px;
-       }
-.statistics dt {
-       float: left;
-       width: 96px;
-}
-.statistics dd {
-       margin-left: 100px;
-}
-.statistics dt:after {
-       content: ":";
-       }
-#subscriptions {
-       float: left;
-       margin: 18px 0 30px 0;
-       }
-#subscriptions_avatars {
-       float: left;
-       margin: 6px 0 0 0;
-       padding: 0;
-       list-style-type: none;
-       width: 270px;
-       }
-#subscriptions_avatars li .avatar.mini {
-       float: left;
-       margin: 0 3px 3px 0;
-       padding: 0;
-       line-height: 0;
-       /* border: 1px solid #f00; */
-       }
-#subscriptions_viewall {
-       clear: left;
-       }
-/* ----- End Profile -----*/
-
-/* ----- Begin Subscriptions & Subscribers -----*/
-
-ul.subscriptions, ul.subscribers {
-       float: none;
-       margin: 0;
-       padding: 0;
-       list-style-type: none;
-       overflow: auto;
-       clear:both;
-       }
-ul.subscriptions li, ul.subscribers li {
-       display: block;
-       float: left;
-       padding: 0;
-       }
-/* ----- End Subscriptions & Subscribers -----*/
-
-#pagination {
-       margin: 18px auto;
-       width: 600px;
-       }
-#nav_pagination {
-       margin: 0 0 36px 0;
-       padding: 0;
-       float: right;
-       list-style-type: none;
-       font-size: 12px;
-       font-weight: bold;
-       }
-#nav_pagination li {
-       display: block;
-       float: left;
-       background-color: #701238;
-       }
-#nav_pagination li.before {
-       margin-right: 1px;
-       }
-#nav_pagination li a {
-       padding: 6px 15px;
-       line-height: 21px;
-       background-color: #701238;
-       color: #fff6d5;
-       }
-#nav_pagination li a:hover {
-       background-color: #3F606F;
-       color: #fff6d5;
-       text-decoration: none;
-       }
-
-#footer {
-       clear: both;
-       margin: 0 auto;
-       padding: 0 0 36px 0;
-       width: 600px;
-       border-top: 1px solid #dec5b5;
-       }
-#footer p {
-       margin-top: 9px;
-       line-height: 12px;
-       }
-#cc {
-       float: left;
-       margin: 3px 10px 0 0;
-       }
-
-/* ===== Begin Forms Styling ===== */
-
-/* ----- Forms General Style ----- */
-form {
-       margin: 0 auto;
-       padding: 0;
-       }
-form {
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 12px;
-       }
-form label {
-       display: block;
-       font-size: 12px;
-       font-weight: bold;
-       line-height: 18px;
-       }
-form input {
-       border: 1px solid #dec5b5;
-       width: 264px;
-       }
-input#submit, input.submit  {
-       display: block;
-       margin: 18px 0;
-       padding: 4px;
-       font-weight: bold;
-       color: #fff6d5;
-       background-color: #F60;
-       cursor: pointer;
-       border: 0;
-       width: auto;
-       }
-input#submit:hover, input.submit:hover {
-       background-color: #701238;
-       }
-input.checkbox {
-       /*width: 14px;
-       height: 14px;*/
-       width: auto;
-       border: 0;
-       }
-
-label.checkbox_label {
-    display: inline;
-    font-weight: normal;
-}
-
-textarea, input {
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 12px;
-       color: #701238;
-       padding: 3px;
-       }
-textarea:focus, input:focus {
-       background-color: #f8ebc0;
-       }
-textarea {
-       width: 270px;
-       border: 1px solid #D8E2D7;
-       }
-.input_instructions {
-       margin-top: 3px;
-       display: block;
-       font-size: 11px;
-       line-height: 15px;
-       color: #924959;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       }
-
-/* ----- Status Form ----- */
-#status_form {
-       height: 96px;
-       /*background-color: #F00;*/
-       }
-#status_form p {
-       margin: 36px 0 0 0;
-       padding: 0;
-       }
-#status_label {
-       display: block;
-       clear: both;
-       margin: 0;
-       padding: 0 0 3px 0;
-       font-size: 18px;
-       font-weight: bold;
-       line-height: 24px;
-       color: #dab134;
-       }
-#status_textarea {
-       display: block;
-       float: left;
-       width: 463px;
-       height: 35px;
-       padding: 5px;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 12px;
-       color: #701238;
-       border: 0;
-       }
-#status_submit {
-       display: block;
-       float: left;
-       margin: 1px 0 0 4px;
-       width: 63px;
-       height: 45px;
-       background-color: #F60;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-weight: bold;
-       font-size: 14px;
-       color: #fff6d5;
-       cursor: pointer;
-       border: 0;
-       }
-#status_submit:hover {
-       background-color: #d1451a;
-       }
-#counter {
-       position: absolute;
-       top: 140px;
-       left: -64px;
-       width: 50px;
-       font-weight: bold;
-       text-align: right;
-}
-.response_error textarea,
-.response_error .on_max {
-background-color:#fee;
-}
-
-/* ----- Subscribe Form ----- */
-#content .subscribe .submit, #content .unsubscribe .submit, #remotesubscribe .button, #remotesubscribe {
-       clear: left;
-       margin: 0;
-       width: 96px;
-       height: 27px;
-       font-family: verdana, arial, helvetica, sans-serif;
-       font-weight: bold;
-       font-size: 10px;
-       text-transform: uppercase;
-       background-color: #F60;
-       color: #fff6d5;
-       border: 0;
-       }
-#remotesubscribe {
-       width: 96px;
-       height: 22px;
-       padding: 5px 0 0 0;
-       text-align: center;
-       }
-#content .subscribe .button:hover, #content .unsubscribe .button:hover {
-       background-color: #904632;
-       cursor: pointer;
-       }
-
-a#remotesubscribe {
-       display: block;
-}
-
-/* ----- Login Form -----*/
-input#license {
-       width: auto;
-       border: 0;
-       }
-/* ----- Avatar Form -----*/
-form {
-       clear: left;
-}
-
-/* ----- OpenID Form -----*/
-
-input#openid_url {
-   background: url(login-bg.gif) no-repeat;
-   background-color: #fff;
-   background-position: 4px 50%;
-   color: #000;
-   padding-left: 24px;
-}
-
-/* People lists (search results, maybe subscribers) */
-
-#profiles {
-       clear: both;
-       margin: 0 auto;
-       padding: 0;
-       list-style-type: none;
-       width: 600px;
-       border-top: 1px solid #dec5b5;
-       /*border: 1px solid #F00;*/
-       }
-#profiles a:hover {
-       text-decoration: underline;
-       }
-
-.profile_single {
-       clear: both;
-       display: block;
-       margin: 0;
-       padding: 5px 5px 5px 0;
-       min-height: 48px;
-       font-family: Georgia, "Times New Roman", Times, serif;
-       font-size: 13px;
-       line-height: 16px;
-       border-bottom: 1px solid #dec5b5;
-       width:100%;
-       float:left;
-       }
-.profile_single:hover {
-       background-color: #f7ebcc;
-       }
-
-.profile_single form.block,
-.profile_single form.subscribe,
-.profile_single form.unsubscribe {
-       float: right;
-}
-
-form.subedit {
-       margin-left:4.5em;
-}
-form.subedit p {
-       display:inline;
-
-}
-form.subedit input.submit {
-       margin:0 0 0 0.5em;
-       display:inline;
-       background-color:transparent;
-       padding:0;
-       color:#C15D42;
-       border:1px solid #C15D42;
-}
-
-
-
-/* ----- IM Settings Form -----*/
-
-#imsettings p {
-       margin: 0;
-       padding: 0;
-       line-height: 15px;
-}
-
-/* ----- direct message ----- */
-
-#message_form {
-       height: 96px;
-       /*background-color: #F00;*/
-       }
-
-#message_form p {
-       margin: 21px 0 0 0;
-       padding: 0;
-       }
-#message_form label {
-       display: inline;
-       }
-
-#message_content {
-       display: block;
-       float: left;
-       width: 463px;
-       height: 35px;
-       padding: 5px;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 12px;
-       color: #193441;
-       border: 0;
-       }
-
-#message_send {
-       display: block;
-       float: left;
-       margin: 1px 0 0 4px;
-       width: 63px;
-       height: 45px;
-       background-color: #C15D42;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-weight: bold;
-       font-size: 14px;
-       color: #FCFFF5;
-       cursor: pointer;
-       border: 0;
-       }
-
-#message_send:hover {
-       background-color: #904632;
-       }
-
-/* ===== End Forms Styling ===== */
-
-/* ===== Tag Cloud Styling ===== */
-
-p.tagcloud {
-text-align: center;
-}
-
-p.tagcloud a {
-line-height:100%;
-vertical-align:middle;
-}
-
-p.tagcloud a.largest {
-font-size: 400%;
-}
-p.tagcloud a.verylarge {
-font-size: 300%;
-}
-
-p.tagcloud a.large {
-font-size: 200%;
-}
-
-p.tagcloud a.medium {
-font-size: 150%;
-}
-
-p.tagcloud a.small {
-font-size: 100%;
-}
-
-p.tagcloud a.verysmall {
-font-size: 80%;
-}
-
-p.tagcloud a.smallest {
-font-size: 60%;
-}
-
-#subscriptions_nav,
-#filter_tags {
-margin:0 0 2em 0;
-}
-
-#subscriptions_nav {
-padding-bottom:0.5em;
-/*border-bottom:1px solid #D8E2D7;*/
-float:right;
-}
-#filter_tags {
-float:left;
-}
-
-#subscriptions_nav dt,
-#filter_tags dt {
-display:none;
-}
-#subscriptions_nav dd,
-#filter_tags dd {
-margin-left:0;
-}
-#subscriptions_nav ul,
-#filter_tags ul {
-padding-left:0;
-list-style-type:none;
-margin-left:0;
-}
-#subscriptions_nav ul li {
-display:inline;
-padding-left:0.5em;
-margin-left:0.5em;
-border-left:1px solid #D8E2D7;;
-}
-#subscriptions_nav ul li.child_1 {
-border-left:0;
-padding-left:0;
-margin-left:0;
-}
-
-#filter_tags ul li {
-float:left;
-margin-left:0.5em;
-padding-left:0.5em;
-border-left:1px solid #D8E2D7;;
-}
-#filter_tags ul li.child_1 {
-margin-left:0;
-border-left:0;
-padding-left:0;
-}
-#filter_tags ul li li {
-margin-left:0;
-}
-#filter_tags ul li#filter_tags_item {
-width:30em;
-}
-#filter_tags ul li#filter_tags_item form {
-clear:none;
-}
-#filter_tags ul li#filter_tags_item label {
-margin-right:0.5em;
-font-size:14px;
-font-weight:normal;
-font-family:Georgia,"Times New Roman",Times,serif;
-}
-#filter_tags ul li#filter_tags_item label,
-#filter_tags ul li#filter_tags_item select {
-margin-top:-1px;
-margin-bottom:0.5em;
-display:inline;
-}
-#filter_tags ul li#filter_tags_item p {
-margin:0 1em 0 0;
-padding:0;
-float:left;
-}
-#filter_tags ul li .input_instructions {
-display:inline;
-display:block;
-margin:0;
-}
-#filter_tags ul li#filter_tags_item .submit {
-margin:0;
-}
-
-.tags_self,
-.tags_user {
-margin-left:4.5em;
-}
-.tags_self dl,
-.tags_user dl {
-margin-left:0;
-}
-
-.tags_self dt,
-.tags_user dt {
-display:inline;
-margin-right:0.5em;
-}
-
-.tags_self dd,
-.tags_user dd {
-margin-left:0;
-display:inline;
-}
-
-ul.tags {
-padding-left:0;
-margin-left:0;
-list-style-type:none;
-display:inline;
-}
-ul.tags li {
-display:inline;
-margin-right:0.75em;
-}
-ul.tags li a {
-padding-left:17px;
-background:url(icon_tag-01.gif) no-repeat;
-line-height:1.5;
-}
-
-.tags_user {
-margin-bottom:0.5em;
-}
-
-form#tag_user {
-margin-left:8.75em;
-clear:both;
-}
-form#tag_user p {
-margin:0;
-}
-
-form#tag_user label {
-display:inline;
-margin-right:1em;
-}
-form#tag_user .submit {
-margin-left:4em;
-}
-
-form#tag_user .input_instructions {
-margin-left:4.5em;
-}
-
-.profile_list p {
-margin:0 0 0.5em 0;
-}
-
-.profile_list .bio {
-margin-left:4.5em;
-}
-
-/* ----- Mailbox ----- */
-#messages {
-       clear: both;
-       margin: 0 auto;
-       padding: 0;
-       list-style-type: none;
-       width: 600px;
-       border-top: 1px solid #dec5b5;
-       }
-
-#messages a:hover {
-        text-decoration: underline;
-       }
-
-.message_single {
-       clear: both;
-       display: block;
-       margin: 0;
-       padding: 5px 5px 5px 0;
-       min-height: 48px;
-       font-family: Georgia, "Times New Roman", Times, serif;
-       font-size: 13px;
-       line-height: 16px;
-       border-bottom: 1px solid #dec5b5;
-       }
-.message_single:hover {
-       background-color: #f7ebcc;
-       }
-.message_single p {
-       display: inline;
-       margin: 0;
-       padding: 0;
-       }
diff --git a/theme/default/icon_feed.jpg b/theme/default/icon_feed.jpg
deleted file mode 100644 (file)
index 53c4d49..0000000
Binary files a/theme/default/icon_feed.jpg and /dev/null differ
diff --git a/theme/default/icon_foaf.gif b/theme/default/icon_foaf.gif
deleted file mode 100644 (file)
index f8f7844..0000000
Binary files a/theme/default/icon_foaf.gif and /dev/null differ
diff --git a/theme/default/icon_heart-01.gif b/theme/default/icon_heart-01.gif
deleted file mode 100644 (file)
index bdfd748..0000000
Binary files a/theme/default/icon_heart-01.gif and /dev/null differ
diff --git a/theme/default/icon_heart-02.gif b/theme/default/icon_heart-02.gif
deleted file mode 100644 (file)
index cbb35e0..0000000
Binary files a/theme/default/icon_heart-02.gif and /dev/null differ
diff --git a/theme/default/icon_tag-01.gif b/theme/default/icon_tag-01.gif
deleted file mode 100644 (file)
index 92e5742..0000000
Binary files a/theme/default/icon_tag-01.gif and /dev/null differ
diff --git a/theme/default/ie6.css b/theme/default/ie6.css
deleted file mode 100644 (file)
index f9fc815..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-@charset "UTF-8";
-/* CSS Document */
-body {
-       text-align: center;
-}
-input {
-       height: 24px;
-}
-#wrap {
-       margin: 0 auto;
-       padding: 0 20px;
-       width: 800px;
-       text-align: left;
-       background: url(bg-header.gif) repeat-x #fbf2d7;
-       }
-#header {
-       position: relative;
-       margin-left: 108px;
-       }       
-#nav_views {
-       margin: 0;
-       }
-#nav_views li {
-       line-height: 19px;
-       }
-.statistics dd {
-       margin-top: -15px;
-       clear: both;
-       }       
-#notices {
-       margin: 0;
-       }                       
-.notice_single {
-       height: 48px;
-       }
-#profile {
-  margin-left:0px;
-}      
-#profile p.notice_current {
-       height: 96px;
-       }       
-#filter_tags {
-  margin-left:20px;
-}      
-#content .subscriptions {
-  margin-left:30px;
-  width:100%;
-}
-
-#subscriptions_avatars li {
-       float: left;
-       margin: 0;
-       padding: 0;
-       }
-img.avatar.original, img.avatar.profile {
-       clear: none;
-       float: left;
-}              
-#status_textarea {
-       height: 46px;
-       }
-                       
-#nav_pagination li a {
-       padding: 6px 15px;
-       line-height: 27px;
-       }
-#nav_sub {
-       position: relative;
-       margin-left: 108px;
-       }       
-#footer {
-       margin-left: 108px;
-}
diff --git a/theme/default/ie7.css b/theme/default/ie7.css
deleted file mode 100644 (file)
index 23a3241..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-@charset "UTF-8";
-/* CSS Document */
-input.disfavor,
-input.favor {
-       text-indent:0;
-       text-align:right;
-       padding-left:25px;
-}
-
-#profile_actions li {
-float:left;
-clear:both;
-}
-#profile_actions #profile_nudge input.submit {
-margin-left:0;
-width:100px;
-}
-
-#statistics dd {
-       clear: both;
-       }               
-       
-#subscriptions_avatars li {
-       float: left;
-       }
-img.avatar.original, img.avatar.profile {
-       clear: none;
-       float: left;
-}
-                       
-#nav_pagination li a {
-       padding: 6px 15px;
-       line-height: 27px;
-       }
-
-#filter_tags ul li#filter_tags_item label {
-position:relative;
-top:-8px;
-}
\ No newline at end of file
diff --git a/theme/default/login-bg.gif b/theme/default/login-bg.gif
deleted file mode 100644 (file)
index e2d8377..0000000
Binary files a/theme/default/login-bg.gif and /dev/null differ
diff --git a/theme/identica/bg-body.gif b/theme/identica/bg-body.gif
deleted file mode 100644 (file)
index d87e2e8..0000000
Binary files a/theme/identica/bg-body.gif and /dev/null differ
diff --git a/theme/identica/bg-header.gif b/theme/identica/bg-header.gif
deleted file mode 100644 (file)
index 5154b2e..0000000
Binary files a/theme/identica/bg-header.gif and /dev/null differ
index beb5a2c13dcfa3d11d107509f6b6d0b583e78ce5..576a2e14be1d1483bc4da0abbeca81f97785af22 100644 (file)
@@ -34,6 +34,9 @@ border-color:#aaa;
 border-color:#ddd;
 }
 
+.form_settings input.form_action-secondary {
+background:none;
+}
 
 input.submit,
 #form_notice.warning #notice_text-count,
@@ -59,7 +62,8 @@ div.notice-options input,
 .form_user_unblock input.submit,
 .entity_send-a-message a,
 .form_user_nudge input.submit,
-.entity_nudge p {
+.entity_nudge p,
+.form_settings input.form_action-secondary {
 color:#002E6E;
 }
 
@@ -67,7 +71,6 @@ color:#002E6E;
 .profile {
 border-top-color:#CEE1E9;
 }
-.section .notice,
 .section .profile {
 border-top-color:#87B4C8;
 }
@@ -92,12 +95,6 @@ color:#333;
 color:#000;
 }
 
-#form_notice #notice_data-attach_view {
-background-image:url(../images/icons/twotone/green/paper-clip.gif);
-background-repeat:no-repeat;
-background-position:0 45%;
-background-color:transparent;
-}
 
 #nav_register a {
 text-decoration:none;
@@ -123,8 +120,6 @@ background-color:rgba(255, 255, 255, 0.7);
 }
 
 
-
-
 #page_notice .error {
 background-color:#F7E8E8;
 }
@@ -144,26 +139,21 @@ background-color:#9BB43E;
 }
 
 
-
-
 #export_data li a {
 background-repeat:no-repeat;
 background-position:0 45%;
 }
 #export_data li a.rss {
-background-image:url(../../base/images/icons/icon_rss.jpg);
+background-image:url(../../base/images/icons/icon_rss.png);
 }
 #export_data li a.atom {
-background-image:url(../../base/images/icons/icon_atom.jpg);
+background-image:url(../../base/images/icons/icon_atom.png);
 }
 #export_data li a.foaf {
 background-image:url(../../base/images/icons/icon_foaf.gif);
 }
-#export_data li a.export_vcard {
-background-image:url(../../base/images/icons/icon_vcard.gif);
-}
-
 
+.entity_edit a,
 .entity_send-a-message a,
 .form_user_nudge input.submit,
 .form_user_block input.submit,
@@ -185,6 +175,9 @@ color:#fff;
 background-color:#87B4C8;
 }
 
+.entity_edit a {
+background-image:url(../images/icons/twotone/green/edit.gif);
+}
 .entity_send-a-message a {
 background-image:url(../images/icons/twotone/green/quote.gif);
 }
@@ -204,30 +197,6 @@ background-image:url(../images/icons/twotone/green/shield.gif);
 background-color:#fcfcfc;
 }
 
-.notice-data a span {
-background-color:transparent;
-background-repeat:no-repeat;
-background-position:0 45%;
-}
-.notice_video .notice-data a span {
-background-image:url(../images/icons/twotone/green/camera.gif);
-}
-.notice_audio .notice-data a span {
-background-image:url(../images/icons/twotone/green/music.gif);
-}
-.notice_image .notice-data a span {
-background-image:url(../images/icons/twotone/green/search.gif);
-}
-.notice_event .notice-data a span {
-background-image:url(../images/icons/twotone/green/calendar.gif);
-}
-.notice_location .notice-data a span {
-background-image:url(../images/icons/twotone/green/flag.gif);
-}
-.notice_document .notice-data a span {
-background-image:url(../images/icons/twotone/green/document.gif);
-}
-
 .notice-options .notice_reply a,
 .notice-options form input.submit {
 background-color:transparent;
@@ -269,7 +238,10 @@ background-color:#fcfcfc;
 #new_group a {
 background:transparent url(../images/icons/twotone/green/news.gif) no-repeat 0 45%;
 }
-
+#usergroups #new_group {
+float: left;
+margin-right: 2em;
+}
 
 .pagination .nav_prev a,
 .pagination .nav_next a {
diff --git a/theme/identica/display.css b/theme/identica/display.css
deleted file mode 100644 (file)
index 62d34f0..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-/* CSS Document */
-/* Design & CSS by Marie-Claude Doyon http://www.marieclaudedoyon.com */
-
-@import url(../default/display.css);
-
-html {
-     background: url(bg-body.gif) repeat-y top center #d8e2d7;
-}
-
-body {
-     color: #193441;
-}
-
-a {
-     color: #C15D42;
-}
-
-#wrap {
-      background: url(bg-header.gif) repeat-x #FCFFF5;
-}
-
-#header h1.pagetitle {
-       color: #d8e2d7;
-}
-
-#header h2.sitename {
-       color: #FCFFF5;
-}
-
-#nav li a {
-     color: #91AA9D;
-}
-
-#nav_views li a {
-     color: #FCFFF5;
-     background-color: #91AA9D;
-     border-right: 1px solid #6A8787;
-}
-
-#nav_views li.current a, #nav_views li.current a:hover {
-     color: #3F606F;
-     background-color: #FCFFF5;
-     border-right: 1px solid #6A8787;
-}
-
-#nav_views li.current a:hover {
-     color: #193441;
-}
-
-#nav_views li a:hover {
-     color: #FCFFF5;
-     background-color: #3F606F;
-     border-right: 1px solid #6A8787;
-     }
-
-#nav_sub {
-     border-top: 1px solid #D8E2D7;
-     }
-
-.instructions p, .success, .error {
-     border: 1px solid #91AA9D;
-     color: #FCFFF5;
-     }
-.instructions a:hover, .success a:hover, .error a:hover {
-     color: #FCFFF5;
-     }
-
-#notices {
-     border-top: 1px solid #D8E2D7;
-     }
-
-.notice_single {
-     border-bottom: 1px solid #D8E2D7;
-}
-
-.notice_single:hover {
-     background-color: #F3F8EA;
-     }
-
-input#submit_yes, input#submit_no {
-     color: #FCFFF5;
-     background-color: #C15D42;
-     }
-
-input#submit_yes:hover, input#submit_no:hover {
-     background-color: #904632;
-     }
-
-p.time a {
-    color: #91AA9D;
-    }
-
-#profile {
-    border-top: 1px solid #D8E2D7;
-    }
-
-#profile h2 {
-    color: #91AA9D;
-    }
-
-#nav_pagination li {
-    background-color: #91AA9D;
-    }
-
-#nav_pagination li a {
-    background-color: #91AA9D;
-    color: #FCFFF5;
-    }
-
-#nav_pagination li a:hover {
-    color: #FCFFF5;
-    }
-
-#footer {
-    border-top: 1px solid #D8E2D7;
-    }
-
-form input {
-     border: 1px solid #D8E2D7;
-     }
-
-input#submit, input.submit  {
-    color: #FCFFF5;
-    background-color: #C15D42;
-    }
-
-input#submit:hover, input.submit:hover {
-    background-color: #904632;
-    }
-
-textarea, input {
-    color: #193441;
-    }
-
-textarea:focus, input:focus {
-    background-color: #f0f6eb;
-    }
-
-.input_instructions {
-    color: #91aa9d;
-    }
-
-#status_label {
-    color: #91AA9D;
-    }
-
-#status_textarea {
-    color: #193441;
-}
-
-#status_submit {
-    background-color: #C15D42;
-    color: #FCFFF5;
-    }
-
-#status_submit:hover {
-    background-color: #904632;
-    }
-
-#content .subscribe .submit, #content .unsubscribe .submit, #remotesubscribe .button, #remotesubscribe {
-    background-color: #c15d42;
-    color: #fcfff5;
-    }
-
-#profiles {
-    border-top: 1px solid #D8E2D7;
-    }
-
-.profile_single {
-    border-bottom: 1px solid #D8E2D7;
-    }
-
-.profile_single:hover {
-    background-color: #F3F8EA;
-    }
-
-#messages {
-    border-top: 1px solid #D8E2D7;
-    }
-
-.message_single {
-    border-bottom: 1px solid #D8E2D7;
-    }
-
-.message_single:hover {
-    background-color: #F3F8EA;
-    }
diff --git a/theme/identica/ie6.css b/theme/identica/ie6.css
deleted file mode 100644 (file)
index a301f1d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-@charset "UTF-8";
-/* CSS Document */
-@import url(../default/ie6.css);
-#wrap {
-       background: url(bg-header.gif) repeat-x #FCFFF5;
-       }
-
-
-input.disfavor,
-input.favor {
-       text-indent:0px;
-       text-align:right;
-       padding-left:25px;
-}
\ No newline at end of file
diff --git a/theme/identica/ie7.css b/theme/identica/ie7.css
deleted file mode 100644 (file)
index cab6f40..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-@charset "UTF-8";
-/* CSS Document */
-@import url(../default/ie7.css);
diff --git a/theme/identica/login-bg.gif b/theme/identica/login-bg.gif
deleted file mode 100644 (file)
index e2d8377..0000000
Binary files a/theme/identica/login-bg.gif and /dev/null differ