summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.SOCIAL23
-rw-r--r--TODO.SOCIAL12
-rw-r--r--actions/public.php6
-rw-r--r--doc-src/about3
-rw-r--r--doc-src/faq41
-rw-r--r--lib/action.php8
-rw-r--r--plugins/GNUsocialDukiDukiSnail/GNUsocialDukiDukiSnail.php0
-rw-r--r--plugins/GNUsocialDukiDukiSnail/README151
-rw-r--r--plugins/GNUsocialEvents/GNUsocialEvents.php0
-rw-r--r--plugins/GNUsocialLayout/GNUsocialLayout.php0
-rw-r--r--plugins/GNUsocialOffTheRecordMessaging/GNUsocialOffTheRecordMessaging.php0
-rw-r--r--plugins/GNUsocialPhotos/GNUsocialPhotosPlugin.php102
-rw-r--r--plugins/GNUsocialPhotos/actions/photos.php110
-rw-r--r--plugins/GNUsocialPhotos/actions/photoupload.php143
-rw-r--r--plugins/GNUsocialPhotos/classes/gnusocialphoto.php110
-rw-r--r--plugins/GNUsocialPhotos/lib/photolib.php87
-rw-r--r--plugins/GNUsocialRelationshipsManager/GNUsocialRelationshipsManager.php0
-rw-r--r--plugins/GNUsocialTemplatePlugin.php359
-rw-r--r--plugins/GNUsocialVideo/GNUsocialVideoPlugin.php54
-rw-r--r--plugins/GNUsocialVideo/actions/postvideo.php83
-rw-r--r--plugins/OpenID/doc-src/openid2
-rw-r--r--socialfy-your-domain/README.txt57
-rw-r--r--socialfy-your-domain/dot-well-known/host-meta1
-rw-r--r--socialfy-your-domain/xrd/example@example.com14
-rw-r--r--socialfy-your-domain/xrd/index.php41
-rw-r--r--theme/GNUSocial/css/default.css0
-rw-r--r--theme/gnusocial/css/combo.css13
-rw-r--r--theme/gnusocial/css/debug.css7
-rw-r--r--theme/gnusocial/css/display.css13
-rwxr-xr-xtheme/gnusocial/css/social.css280
-rwxr-xr-xtheme/gnusocial/default-avatar-mini.pngbin0 -> 1349 bytes
-rwxr-xr-xtheme/gnusocial/default-avatar-profile.pngbin0 -> 9256 bytes
-rwxr-xr-xtheme/gnusocial/default-avatar-stream.pngbin0 -> 3829 bytes
-rw-r--r--theme/gnusocial/images/bg.pngbin0 -> 189 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/icon_atom.pngbin0 -> 820 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/icon_disfavourite.gifbin0 -> 701 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/icon_favourite.gifbin0 -> 397 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/icon_foaf.gifbin0 -> 1144 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/icon_processing.gifbin0 -> 673 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/icon_reply.gifbin0 -> 336 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/icon_rss.pngbin0 -> 777 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/icon_trash.gifbin0 -> 148 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/icon_vcard.gifbin0 -> 331 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/twotone/green/arrow-left.gifbin0 -> 73 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/twotone/green/arrow-right.gifbin0 -> 74 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/twotone/green/edit.gifbin0 -> 75 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/twotone/green/mail.gifbin0 -> 82 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/twotone/green/news.gifbin0 -> 76 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/twotone/green/quote.gifbin0 -> 79 bytes
-rwxr-xr-xtheme/gnusocial/images/icons/twotone/green/shield.gifbin0 -> 85 bytes
-rwxr-xr-xtheme/gnusocial/images/illustrations/illu_arrow-up-01.gifbin0 -> 68 bytes
-rwxr-xr-xtheme/gnusocial/images/illustrations/illu_clouds-01.gifbin0 -> 14251 bytes
-rwxr-xr-xtheme/gnusocial/images/illustrations/illu_jcrop.gifbin0 -> 329 bytes
-rwxr-xr-xtheme/gnusocial/images/illustrations/illu_progress_loading-01.gifbin0 -> 5886 bytes
-rwxr-xr-xtheme/gnusocial/images/illustrations/illu_unicorn-01.pngbin0 -> 5695 bytes
-rw-r--r--theme/gnusocial/index.html213
-rwxr-xr-xtheme/gnusocial/logo.pngbin0 -> 10107 bytes
-rw-r--r--tpl/social.php53
58 files changed, 1943 insertions, 43 deletions
diff --git a/README.SOCIAL b/README.SOCIAL
new file mode 100644
index 000000000..3394dca2d
--- /dev/null
+++ b/README.SOCIAL
@@ -0,0 +1,23 @@
+This is GNU social, a free software, decentralized social network,
+based on StatusNet.
+
+Developers
+==========
+
+Matt Lee
+Rob Myers
+Sean Corbett
+Ian Denhardt
+Steve DuBois
+Mike Sheldon
+
+With help from
+==============
+
+Bradley M. Kuhn
+
+Special help from
+=================
+
+Craig Andrews
+
diff --git a/TODO.SOCIAL b/TODO.SOCIAL
new file mode 100644
index 000000000..4d4866f0f
--- /dev/null
+++ b/TODO.SOCIAL
@@ -0,0 +1,12 @@
+Things to be done
+=================
+
+* Create a theme for GNU social
+
+* Create a set of plugins to give StatusNet a more social-network UI
+
+* Work on improvements for annoying things in StatusNet (ie. no
+ redirect to login page when you need to be logged in, etc)
+
+* Work on adding further Activities, such as sharing photos/video,
+ events, UI for managing relationships. \ No newline at end of file
diff --git a/actions/public.php b/actions/public.php
index 5fc547fea..181df1e43 100644
--- a/actions/public.php
+++ b/actions/public.php
@@ -239,13 +239,11 @@ class PublicAction extends Action
function showAnonymousMessage()
{
if (! (common_config('site','closed') || common_config('site','inviteonly'))) {
- $m = _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
- 'based on the Free Software [StatusNet](http://status.net/) tool. ' .
+ $m = _('This is %%site.name%%, a social networking site. ' .
'[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ' .
'([Read more](%%doc.help%%))');
} else {
- $m = _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
- 'based on the Free Software [StatusNet](http://status.net/) tool.');
+ $m = _('This is %%site.name%%, a social networking site.');
}
$this->elementStart('div', array('id' => 'anon_notice'));
$this->raw(common_markup_to_html($m));
diff --git a/doc-src/about b/doc-src/about
index 6a68e41cf..6a0ceb10f 100644
--- a/doc-src/about
+++ b/doc-src/about
@@ -1,6 +1,5 @@
%%site.name%% is a
-[micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service
-based on the Free Software [StatusNet](http://status.net/) tool.
+social network based on the Free Software [GNU social](http://www.gnu.org/software/social/) tool.
If you [register](%%action.register%%) for an account,
you can post small (%%site.textlimit%% chars or less) text notices
diff --git a/doc-src/faq b/doc-src/faq
index 8e394806f..b333c4148 100644
--- a/doc-src/faq
+++ b/doc-src/faq
@@ -1,42 +1,17 @@
These are some *Frequently Asked Questions* about this service, with
some answers.
-What is %%site.name%%?
+What is this site?
----------------------
-%%site.name%% is a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service.
-You can use it to write short notices about yourself, where you are,
-and what you're doing, and those notices will be sent to all your friends
-and fans.
+This is a social network, running the GNU social software.
-How is %%site.name%% different from Twitter, Jaiku, Pownce, Plurk, others?
---------------------------------------------------------------------------
+You can use it to make connections between friends, family and
+colleagues -- writing short notices about yourself, where you are, and
+what you're doing, and those notices will be sent to all your contacts.
-%%site.name%% is an [Open Network Service](http://opendefinition.org/ossd). Our main
-goal is to provide a fair and transparent service that preserves users' autonomy. In
-particular, all the software used for %%site.name%% is [Free Software](http://en.wikipedia.org/wiki/Free_Software), and all the data is available
-under the [%%license.title%%](%%license.url%%) license, making it Open Data.
-
-The software also implements the [OpenMicroBlogging](http://openmicroblogging.org/) protocol, meaning that you can have friends on other microblogging services
-that can receive your notices.
-
-The goal here is *autonomy* -- you deserve the right to manage your own on-line
-presence. If you don't like how %%site.name%% works, you can take your data and the source code and set up your own server (or move your account to another one).
-
-Where is feature X?
--------------------
-
-The software we run, [StatusNet](http://status.net/), is still in its early stages,
-and many features people expect from microblogging sites are not yet implemented. Some important ones that are expected "soon":
-
-* More [AJAX](http://en.wikipedia.org/wiki/AJAX)-y interface
-* Maps
-* Cross-post to Pownce, Jaiku, etc.
-* Pull messages from Twitter, Pownce, Jaiku, etc.
-* [Facebook](http://www.facebook.com/) integration
-* Image, video, audio notices
-
-There is [a list of bugs and features](http://status.net/bugs/) that you may find
-interesting. New ideas or complaints are very welcome.
+In the future, we'll be adding support for photo, video and file
+sharing, as well as events, better contact management and mobile
+devices.
diff --git a/lib/action.php b/lib/action.php
index 2b3b707c5..d417c88fc 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -824,14 +824,14 @@ class Action extends HTMLOutputter // lawsuit
$this->elementStart('dd', null);
if (common_config('site', 'broughtby')) {
// TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set.
- $instr = _('**%%site.name%%** is a microblogging service brought to you by [%%site.broughtby%%](%%site.broughtbyurl%%).');
+ $instr = _('**%%site.name%%** is a social network, courtesy of [%%site.broughtby%%](%%site.broughtbyurl%%).');
} else {
// TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set.
- $instr = _('**%%site.name%%** is a microblogging service.');
+ $instr = _('**%%site.name%%** is a social network.');
}
$instr .= ' ';
// TRANS: Second sentence of the StatusNet site license. Mentions the StatusNet source code license.
- $instr .= sprintf(_('It runs the [StatusNet](http://status.net/) microblogging software, version %s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).'), STATUSNET_VERSION);
+ $instr .= sprintf(_('It runs on [GNU social](http://www.gnu.org/software/social/), version %s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).'), STATUSNET_VERSION);
$output = common_markup_to_html($instr);
$this->raw($output);
$this->elementEnd('dd');
@@ -878,7 +878,7 @@ class Action extends HTMLOutputter // lawsuit
'height' => '15'));
$this->text(' ');
// TRANS: license message in footer. %1$s is the site name, %2$s is a link to the license URL, with a licence name set in configuration.
- $notice = _('All %1$s content and data are available under the %2$s license.');
+ $notice = _('All content and data are available under the %2$s license.');
$link = "<a class=\"license\" rel=\"external license\" href=\"" .
htmlspecialchars(common_config('license', 'url')) .
"\">" .
diff --git a/plugins/GNUsocialDukiDukiSnail/GNUsocialDukiDukiSnail.php b/plugins/GNUsocialDukiDukiSnail/GNUsocialDukiDukiSnail.php
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/plugins/GNUsocialDukiDukiSnail/GNUsocialDukiDukiSnail.php
diff --git a/plugins/GNUsocialDukiDukiSnail/README b/plugins/GNUsocialDukiDukiSnail/README
new file mode 100644
index 000000000..98ae6526e
--- /dev/null
+++ b/plugins/GNUsocialDukiDukiSnail/README
@@ -0,0 +1,151 @@
+GNU Social -- DukiDuki Snail
+============================
+
+Duki Duki Snail is a classic PC game, released in Czechoslovakia in
+the 1980s, and later reborn in free software in the mid 1990s.
+
+It is our intention to create a free software version of DukiDuki
+Snail for GNU social in which players can share their high scores.
+
+The game is built like such:
+
+A maze is drawn:
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXX XXX XXXX
+XXXX XXX XXXX
+XXXX XXX XXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXX
+XXXX XXXX XXXX
+XXXX XXXX XXXX
+XXXX XXXX XXXX
+XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXX XXX XXX XXX XXXX XXXX
+XXXX XXX XXX XXX XXX XXXX XXXX
+XXXX XXX XXX XXX XXX XXXX XXXX
+XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXX XXXX XXXXXXXXXX
+XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXX XXXX XXXXXXXXXX
+XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXX XXXX XXXXXXXXXX
+XXXX XXX XXXX XXXX XXXX XXXX XXXX
+XXXX XXX XXXX XXXX XXXX XXXX XXXX
+XXXX XXX XXXX XXXX XXXX XXXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXXX
+XXXX XXX XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXX XXXX
+XXXX XXX XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXX XXXX
+XXXX XXX XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXX XXXX XXXX XXXX
+XXXX XXX XXXX XXX XXX XXXX XXXX XXXX
+XXXX XXX XXXX XXX XXX XXXX XXXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXXXXXXXXX
+XXXX XXX XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXXXXXXXXX
+XXXX XXX XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXXXXXXXXX
+XXXX XXX XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXXXXXXXXX
+XXXX XXX XXXX XXX XXXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXXXXXXXXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXXXXXXXXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXXXXXXXXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXX
+XXXX XXX XXXX XXX XXXX XXXX
+XXXX XXX XXXX XXX XXXX XXXX
+XXXX XXX XXXX XXX XXXX XXXX
+XXXX XXX XXXX XXXXXXXXXXXXXXXX XXXXXXXXXX XXXX XXXXXXXXXX
+XXXX XXX XXXX XXXXXXXXXXXXXXXX XXXXXXXXXX XXXX XXXXXXXXXX
+XXXX XXX XXXX XXXXXXXXXXXXXXXX XXXXXXXXXX XXXX XXXXXXXXXX
+XXXX XXX XXXX XXXXXXXXXXXXXXXX XXXXXXXXXX XXXX XXXXXXXXXX
+XXXX XXX XXX XXX XXXX XXX XXXX
+XXXX XXX XXX XXX XXXX XXX XXXX
+XXXX XXX XXX XXX XXXX XXX XXXX
+XXXX XXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXX XXXX XXXX XXXX XXXX
+XXXX XXX XXXX XXXX XXXX XXXX
+XXXX XXX XXXX XXXX XXXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXX XXXX XXX XXX XXX XXXX
+XXXX XXX XXXX XXX XXX XXX XXXX
+XXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX
+XXXX XXX XXX XXXX XXXX XXX XXXX
+XXXX XXX XXX XXXX XXXX XXX XXXX
+XXXX XXX XXX XXXX XXXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXX XXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXX XXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXX XXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXX XXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXX XXX XXXX XXX XXXX
+XXXX XXX XXX XXXX XXX XXXX
+XXXXXXXXXX XXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXXXXXXXX XXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXXXXXXXX XXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXXXXXXXX XXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXXX XXXX XXX XXXX
+XXXX XXXX XXXX XXX XXXX
+XXXX XXXX XXXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXXXXX XXX XXXX
+XXXX XXX XXX XXXX XXXX XXXX XXX XXXX
+XXXX XXX XXX XXXX XXXX XXXX XXX XXXX
+XXXX XXX XXX XXXX XXXX XXXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXX XXXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXX XXXX XXX XXXX
+XXXX XXX XXXX XXX XXXX XXXXXXXXXX XXX XXXX XXX XXXX
+XXXX XXX XXXX XXXX XXX XXX XXX XXXX
+XXXX XXX XXXX XXXX XXX XXX XXX XXXX
+XXXX XXX XXXX XXXX XXX XXX XXX XXXX
+XXXX XXXXXXXXXXXXXXXXXXXXXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXXXXXXXXXXXXXXXXXXXXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXXXXXXXXXXXXXXXXXXXXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+XXXX XXXXXXXXXXXXXXXXXXXXXXX XXX XXXXXXXXXXXXXXXXXXXXXXX XXXX
+ XXXX XXX
+@_K XXXX XXX [ exit ]
+ XXXX XXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX
+
+and you must guide your snail @_K through the maze in record time.
+
+This seems like an ideal thing to build using something like <canvas> too. \ No newline at end of file
diff --git a/plugins/GNUsocialEvents/GNUsocialEvents.php b/plugins/GNUsocialEvents/GNUsocialEvents.php
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/plugins/GNUsocialEvents/GNUsocialEvents.php
diff --git a/plugins/GNUsocialLayout/GNUsocialLayout.php b/plugins/GNUsocialLayout/GNUsocialLayout.php
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/plugins/GNUsocialLayout/GNUsocialLayout.php
diff --git a/plugins/GNUsocialOffTheRecordMessaging/GNUsocialOffTheRecordMessaging.php b/plugins/GNUsocialOffTheRecordMessaging/GNUsocialOffTheRecordMessaging.php
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/plugins/GNUsocialOffTheRecordMessaging/GNUsocialOffTheRecordMessaging.php
diff --git a/plugins/GNUsocialPhotos/GNUsocialPhotosPlugin.php b/plugins/GNUsocialPhotos/GNUsocialPhotosPlugin.php
new file mode 100644
index 000000000..480f4ca46
--- /dev/null
+++ b/plugins/GNUsocialPhotos/GNUsocialPhotosPlugin.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * GNU Social
+ * Copyright (C) 2010, Free Software Foundation, Inc.
+ *
+ * PHP version 5
+ *
+ * LICENCE:
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Widget
+ * @package GNU Social
+ * @author Ian Denhardt <ian@zenhack.net>
+ * @copyright 2010 Free Software Foundation, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ */
+
+/* Photo sharing plugin */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+class GNUsocialPhotosPlugin extends Plugin
+{
+
+ function onAutoload($cls)
+ {
+ $dir = dirname(__FILE__);
+
+ switch ($cls)
+ {
+ case 'PhotosAction':
+ include_once $dir . '/lib/photolib.php';
+ include_once $dir . '/actions/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
+ break;
+ case 'PhotouploadAction':
+ include_once $dir . '/lib/photolib.php';
+ include_once $dir . '/actions/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
+ include_once $dir . '/classes/gnusocialphoto.php';
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
+
+ function onCheckSchema()
+ {
+ $schema = Schema::get();
+ $schema->ensureTable('GNUsocialPhoto',
+ array(new ColumnDef('notice_id', 'integer', null, false, null, true, null, null, true),
+ new ColumnDef('path', 'varchar(150)', null, false),
+ new ColumnDef('thumb_path', 'varchar(156)', null, false), // 156 = 150 + strlen('thumb.')
+ new ColumnDef('owner_id', 'int(11)', null, false)));
+ }
+
+ function onRouterInitialized($m)
+ {
+ $m->connect(':nickname/photos', array('action' => 'photos'));
+ $m->connect('main/uploadphoto', array('action' => 'photoupload'));
+ common_log(LOG_INFO, "init'd!");
+ return true;
+ }
+
+ function onStartActivityDefaultObjectType(&$notice, &$xs, &$type)
+ {
+ $photo = GNUsocialPhoto::staticGet('notice_id', $notice->id);
+ if($photo) {
+ $type = ActivityObject::PHOTO;
+ }
+ }
+/*
+ function onStartShowNoticeItem($action)
+ {
+ $photo = GNUsocialPhoto::staticGet('notice_id', $action->notice->id);
+ if($photo) {
+ $action->out->elementStart('div', 'entry-title');
+ $action->showAuthor();
+ $action->out->elementStart('a', array('href' => 'http://' . common_config('site', 'server') . $photo->path));
+ $action->out->element('img', array('src' => 'http://' . common_config('site', 'server') . $photo->thumb_path));
+ $action->out->elementEnd('a');
+ $action->out->elementEnd('div');
+ $action->showNoticeInfo();
+ $action->showNoticeOptions();
+ return false;
+ }
+ return true;
+ } */
+}
diff --git a/plugins/GNUsocialPhotos/actions/photos.php b/plugins/GNUsocialPhotos/actions/photos.php
new file mode 100644
index 000000000..29a70e458
--- /dev/null
+++ b/plugins/GNUsocialPhotos/actions/photos.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * GNU Social
+ * Copyright (C) 2010, Free Software Foundation, Inc.
+ *
+ * PHP version 5
+ *
+ * LICENCE:
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Widget
+ * @package GNU Social
+ * @author Ian Denhardt <ian@zenhack.net>
+ * @copyright 2010 Free Software Foundation, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+class PhotosAction extends Action
+{
+ var $user = null;
+
+ function prepare($args)
+ {
+ parent::prepare($args);
+
+ $this->user = common_current_user();
+ common_log(LOG_INFO, "finishing prepare. user : ");
+ common_log(LOG_INFO, $this->user->nickname);
+ return true;
+ }
+
+ function handle($args)
+ {
+ parent::handle($args);
+ $this->showPage();
+ }
+
+ function title()
+ {
+ if (empty($this->user)) {
+ return _m('Hello');
+ } else {
+ return sprintf(_m('Hello, %s'), $this->user->nickname);
+ }
+ }
+
+
+ function showContent()
+ {
+ common_log(LOG_INFO, "getting to show content.\n");
+ if (empty($this->user)) {
+ // TODO: should just redirect to the login page.
+ $this->element('p', array(), 'You are not logged in');
+ } else {
+ common_log(LOG_INFO, 'fileroot : ' . $_SERVER['DOCUMENT_ROOT'] . '/file/');
+ $dir = opendir($_SERVER['DOCUMENT_ROOT'] . '/file/');
+ if ($dir === false) {
+ $err = error_get_last();
+ common_log(LOG_INFO, 'Error opening dir : ' . $err['message']);
+ return;
+ }
+ $args = $this->returnToArgs();
+ foreach (array_keys($args) as $key) {
+ common_log(LOG_INFO, $key . ' => ' . $args[$key]);
+ if (is_array($args[$key])) {
+ foreach (array_keys($args[$key]) as $skey) {
+ common_log(LOG_INFO, ' ' . $skey . ' => ' . $args[$key][$skey]);
+ }
+ }
+ }
+ $pathparts = explode('/', $args[1]['nickname']);
+ $username = $pathparts[0];
+ $this->elementStart('ul', array('class' => 'photothumbs'));
+ while (false !== ($file = readdir($dir))) {
+ $fparts = explode('-', $file);
+ if ($fparts[0] == $username // uploaded by this user
+ && ((substr($file, -4) == '.png')
+ || (substr($file, -4) == '.jpg') // XXX: is this needed? status.net seems to save jpgs as .jpeg
+ || (substr($file, -5) == '.jpeg')
+ || (substr($file, -4) == '.gif'))) { // and it's an image
+ common_log(LOG_INFO, 'file : ' . $file);
+ $this->elementStart('li');
+ $this->elementStart('a', array('href' => 'http://' . common_config('site', 'server') . '/file/' . $file));
+ if (!file_exists(INSTALLDIR . '/file/thumb.' . $file)) {
+ photo_make_thumbnail($file);
+ }
+ $this->element('img', array('src' => 'http://' . common_config('site', 'server') . '/file/' . 'thumb.' . $file));
+ $this->elementEnd('a');
+ $this->elementEnd('li');
+ }
+ }
+ $this->elementEnd('ul');
+ }
+ }
+}
diff --git a/plugins/GNUsocialPhotos/actions/photoupload.php b/plugins/GNUsocialPhotos/actions/photoupload.php
new file mode 100644
index 000000000..6fdf51531
--- /dev/null
+++ b/plugins/GNUsocialPhotos/actions/photoupload.php
@@ -0,0 +1,143 @@
+<?php
+/**
+ * GNU Social
+ * Copyright (C) 2010, Free Software Foundation, Inc.
+ *
+ * PHP version 5
+ *
+ * LICENCE:
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Widget
+ * @package GNU Social
+ * @author Ian Denhardt <ian@zenhack.net>
+ * @copyright 2010 Free Software Foundation, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+class PhotouploadAction extends Action
+{
+ var $user = null;
+
+ function prepare($args)
+ {
+ parent::prepare($args);
+ $this->user = common_current_user();
+ return true;
+ }
+
+ function handle($args)
+ {
+ parent::handle($args);
+ if($_SERVER['REQUEST_METHOD'] == 'POST') {
+ $this->handlePost();
+ }
+ $this->showPage();
+ }
+
+ function title()
+ {
+ return _m('Upload Photos');
+ }
+
+ function showContent()
+ {
+ if(empty($this->user)) {
+ $this->element('p', array(), 'You are not logged in.');
+ } else {
+ $this->elementStart('form', array('enctype' => 'mutlipart/form-data',
+ 'method' => 'post',
+ 'action' => common_local_url('photoupload')));
+ $this->element('input', array('name' => 'photofile',
+ 'type' => 'file',
+ 'id' => 'photofile'));
+ $this->submit('upload', _('Upload'));
+ $this->elementEnd('form');
+ }
+ }
+
+ function handlePost()
+ {
+
+ common_log(LOG_INFO, 'handlPost()!');
+ // Workaround for PHP returning empty $_POST and $_FILES when POST
+ // length > post_max_size in php.ini
+
+ if (empty($_FILES)
+ && empty($_POST)
+ && ($_SERVER['CONTENT_LENGTH'] > 0)
+ ) {
+ $msg = _('The server was unable to handle that much POST ' .
+ 'data (%s bytes) due to its current configuration.');
+
+ $this->showForm(sprintf($msg, $_SERVER['CONTENT_LENGTH']));
+ return;
+ }
+
+ // CSRF protection
+
+/* $token = $this->trimmed('token');
+ if (!$token || $token != common_session_token()) {
+ $this->showForm(_('There was a problem with your session token. '.
+ 'Try again, please.'));
+ return;
+ } */
+
+ if($this->arg('upload')) {
+ $this->uploadPhoto();
+ }
+ }
+
+ function showForm($msg, $success=false)
+ {
+ $this->msg = $msg;
+ $this->success = $success;
+
+// $this->showPage();
+ }
+
+ function uploadPhoto()
+ {
+ common_log(LOG_INFO, 'Is this function even getting called?');
+ $cur = common_current_user();
+ if(empty($cur)) {
+ return;
+ }
+ try {
+ $imagefile = ImageFile::fromUpload('photofile');
+ } catch (Exception $e) {
+ $this->showForm($e->getMessage());
+ return;
+ }
+ if ($imagefile === null) {
+ $this->showForm(_('No file uploaded.'));
+ return;
+ }
+
+ common_log(LOG_INFO, 'upload path : ' . $imagefile->filepath);
+
+ $filename = $cur->nickname . '-' . common_timestamp() . sha1_file($imagefile->filepath) . image_type_to_extension($imagefile->type);
+ move_uploaded_file($imagefile->filepath, INSTALLDIR . '/file/' . $filename);
+ photo_make_thumbnail($filename);
+ $path = '/file/' . $filename;
+ $thumb_path = '/file/thumb.' . $filename;
+ $profile_id = $cur->id;
+ GNUsocialPhoto::saveNew($profile_id, $thumb_path, $path, 'web');
+ }
+
+}
diff --git a/plugins/GNUsocialPhotos/classes/gnusocialphoto.php b/plugins/GNUsocialPhotos/classes/gnusocialphoto.php
new file mode 100644
index 000000000..c724db1f1
--- /dev/null
+++ b/plugins/GNUsocialPhotos/classes/gnusocialphoto.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * GNU Social
+ * Copyright (C) 2010, Free Software Foundation, Inc.
+ *
+ * PHP version 5
+ *
+ * LICENCE:
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Widget
+ * @package GNU Social
+ * @author Ian Denhardt <ian@zenhack.net>
+ * @copyright 2010 Free Software Foundation, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
+
+class GNUsocialPhoto extends Memcached_DataObject
+{
+ public $__table = 'GNUsocialPhoto';
+ public $noitce_id; // integer
+ public $path; // varchar(150)
+ public $thumb_path; // varchar(156)
+ public $owner_id; // int(11) (user who posted the photo)
+
+ function staticGet($k,$v=NULL)
+ {
+ return Memcached_DataObject::staticGet('GNUsocialPhoto',$k,$v);
+ }
+
+ function delete()
+ {
+ if(!unlink(INSTALLDIR . $this->thumb_path)) {
+ return false;
+ }
+ if(!unlink(INSTALLDIR . $this->path)) {
+ return false;
+ }
+ return parent::delete();
+ }
+
+ function table()
+ {
+ return array('notice_id' => DB_DATAOBJECT_INT,
+ 'path' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
+ 'thumb_path' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
+ 'owner_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL);
+ }
+
+ function keys()
+ {
+ return array_keys($this->keyTypes());
+ }
+
+ function keyTypes()
+ {
+ return array('notice_id' => 'K');
+ }
+
+ function sequenceKey()
+ {
+ return array(false, false, false);
+ }
+
+ function saveNew($profile_id, $thumb_path, $path, $source)
+ {
+ $photo = new GNUsocialPhoto();
+ $photo->thumb_path = $thumb_path;
+ $photo->path = $path;
+ $photo->owner_id = $profile_id;
+
+ $rend = sprintf('<a href="http://%s%s"><img src="http://%s%s" /></a>', common_config('site', 'server'), $path, common_config('site', 'server'), $thumb_path);
+
+ $notice = Notice::saveNew($profile_id, 'http://' . common_config('site', 'server') . $path, $source, array('rendered' => $rend));
+ $photo->notice_id = $notice->id;
+ $photo_id = $photo->insert();
+ if (!$photo_id) {
+ common_log_db_error($photo, 'INSERT', __FILE__);
+ throw new ServerException(_m('Problem Saving Photo.'));
+ }
+ }
+ /*
+ function asActivityNoun($element)
+ {
+ $object = new ActivityObject();
+
+ $object->type = ActivityObject::PHOTO;
+ $object->title = "";
+ $object->thumbnail = 'http://' . common_config('site', 'server') . $this->thumb_path;
+ $object->largerImage = 'http://' . common_config('site', 'server') . $this->path;
+ return $object;
+ } */
+}
diff --git a/plugins/GNUsocialPhotos/lib/photolib.php b/plugins/GNUsocialPhotos/lib/photolib.php
new file mode 100644
index 000000000..9e5ff61fa
--- /dev/null
+++ b/plugins/GNUsocialPhotos/lib/photolib.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * GNU Social
+ * Copyright (C) 2010, Free Software Foundation, Inc.
+ *
+ * PHP version 5
+ *
+ * LICENCE:
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Widget
+ * @package GNU Social
+ * @author Ian Denhardt <ian@zenhack.net>
+ * @copyright 2010 Free Software Foundation, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ */
+
+
+function photo_make_thumbnail($filename)
+{
+ $height_dest = 192;
+ $width_dest = 256;
+
+ $size_src = getimagesize(INSTALLDIR . '/file/' . $filename);
+ $image_type = $size_src[2];
+
+ switch($image_type) {
+ case IMAGETYPE_JPEG:
+ $image_src = imagecreatefromjpeg(INSTALLDIR . '/file/' . $filename);
+ break;
+ case IMAGETYPE_PNG:
+ $image_src = imagecreatefrompng(INSTALLDIR . '/file/' . $filename);
+ break;
+ case IMAGETYPE_GIF:
+ $image_src = imagecreatefromgif(INSTALLDIR . '/file/' . $filename);
+ break;
+ default:
+ return false;
+ }
+
+ $width_src = $size_src[0];
+ $height_src = $size_src[1];
+
+ $ratio_src = (float) $width_src / (float) $height_src;
+ $ratio_dest = (float) $width_dest / (float) $height_dest;
+
+ if ($ratio_src > $ratio_dest) {
+ $height_crop = $height_src;
+ $width_crop = (int)($height_crop * $ratio_dest);
+ $x_crop = ($width_src - $width_crop) / 2;
+ } else {
+ $width_crop = $width_src;
+ $height_crop = (int)($width_crop / $ratio_dest);
+ $x_crop = 0;
+ }
+
+ $image_dest = imagecreatetruecolor($width_dest, $height_dest);
+
+ imagecopyresampled($image_dest, $image_src, 0, 0, $x_crop, 0, $width_dest, $height_dest, $width_crop, $height_crop);
+ switch ($image_type) {
+ case IMAGETYPE_JPEG:
+ imagejpeg($image_dest, INSTALLDIR . '/file/' . 'thumb.' . $filename, 100);
+ break;
+ case IMAGETYPE_PNG:
+ imagepng($image_dest, INSTALLDIR . '/file/thumb.' . $filename);
+ break;
+ case IMAGETYPE_GIF:
+ imagegif($image_dest, INSTALLDIR . '/file/thumb.' . $filename);
+ break;
+ }
+
+ imagedestroy($image_src);
+ imagedestroy($image_dest);
+
+ return true;
+}
diff --git a/plugins/GNUsocialRelationshipsManager/GNUsocialRelationshipsManager.php b/plugins/GNUsocialRelationshipsManager/GNUsocialRelationshipsManager.php
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/plugins/GNUsocialRelationshipsManager/GNUsocialRelationshipsManager.php
diff --git a/plugins/GNUsocialTemplatePlugin.php b/plugins/GNUsocialTemplatePlugin.php
new file mode 100644
index 000000000..7db2f73a8
--- /dev/null
+++ b/plugins/GNUsocialTemplatePlugin.php
@@ -0,0 +1,359 @@
+<?php
+/**
+ * Plugin to render GNU social
+ *
+ * Captures rendered parts from the output buffer, passes them through a template file: tpl/social.php
+ * Adds an API method at index.php/template/update which lets you overwrite the template file
+ * Requires username/password and a single POST parameter called "template"
+ * The method is disabled unless the user is #1, the first user of the system
+ *
+ * @category Plugin
+ * @package StatusNet
+ * @author Brian Hendrickson <brian@megapump.com>
+ * @author Matt Lee <mattl@cnuk.org>
+ * @copyright 2009 Megapump, Inc.
+ * @copyright 2010 Free Software Foundation, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://megapump.com/
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+define('TEMPLATEPLUGIN_VERSION', '0.1');
+
+class TemplatePlugin extends Plugin {
+
+ var $blocks = array();
+
+ function __construct() {
+ parent::__construct();
+ }
+
+ // capture the RouterInitialized event
+ // and connect a new API method
+ // for updating the template
+ function onRouterInitialized( $m ) {
+ $m->connect( 'template/update', array(
+ 'action' => 'template',
+ ));
+ }
+
+ // <%styles%>
+ // <%scripts%>
+ // <%search%>
+ // <%feeds%>
+ // <%description%>
+ // <%head%>
+ function onStartShowHead( $act ) {
+ $this->clear_xmlWriter($act);
+ $act->extraHead();
+ $this->blocks['head'] = $act->xw->flush();
+ $act->showStylesheets();
+ $this->blocks['styles'] = $act->xw->flush();
+ $act->showScripts();
+ $this->blocks['scripts'] = $act->xw->flush();
+ $act->showFeeds();
+ $this->blocks['feeds'] = $act->xw->flush();
+ $act->showOpenSearch();
+ $this->blocks['search'] = $act->xw->flush();
+ $act->showDescription();
+ $this->blocks['description'] = $act->xw->flush();
+ return false;
+ }
+
+ // <%bodytext%>
+ function onStartShowContentBlock( $act ) {
+ $this->clear_xmlWriter($act);
+ return true;
+ }
+ function onEndShowContentBlock( $act ) {
+ $this->blocks['bodytext'] = $act->xw->flush();
+ }
+
+ // <%localnav%>
+ function onStartShowLocalNavBlock( $act ) {
+ $this->clear_xmlWriter($act);
+ return true;
+ }
+ function onEndShowLocalNavBlock( $act ) {
+ $this->blocks['localnav'] = $act->xw->flush();
+ }
+
+ // <%export%>
+ function onStartShowExportData( $act ) {
+ $this->clear_xmlWriter($act);
+ return true;
+ }
+ function onEndShowExportData( $act ) {
+ $this->blocks['export'] = $act->xw->flush();
+ }
+
+ // <%subscriptions%>
+ // <%subscribers%>
+ // <%groups%>
+ // <%statistics%>
+ // <%cloud%>
+ // <%groupmembers%>
+ // <%groupstatistics%>
+ // <%groupcloud%>
+ // <%popular%>
+ // <%groupsbyposts%>
+ // <%featuredusers%>
+ // <%groupsbymembers%>
+ function onStartShowSections( $act ) {
+ global $action;
+ $this->clear_xmlWriter($act);
+ switch ($action) {
+ case "showstream":
+ $act->showSubscriptions();
+ $this->blocks['subscriptions'] = $act->xw->flush();
+ $act->showSubscribers();
+ $this->blocks['subscribers'] = $act->xw->flush();
+ $act->showGroups();
+ $this->blocks['groups'] = $act->xw->flush();
+ $act->showStatistics();
+ $this->blocks['statistics'] = $act->xw->flush();
+ $cloud = new PersonalTagCloudSection($act, $act->user);
+ $cloud->show();
+ $this->blocks['cloud'] = $act->xw->flush();
+ break;
+ case "showgroup":
+ $act->showMembers();
+ $this->blocks['groupmembers'] = $act->xw->flush();
+ $act->showStatistics();
+ $this->blocks['groupstatistics'] = $act->xw->flush();
+ $cloud = new GroupTagCloudSection($act, $act->group);
+ $cloud->show();
+ $this->blocks['groupcloud'] = $act->xw->flush();
+ break;
+ case "public":
+ $pop = new PopularNoticeSection($act);
+ $pop->show();
+ $this->blocks['popular'] = $act->xw->flush();
+ $gbp = new GroupsByPostsSection($act);
+ $gbp->show();
+ $this->blocks['groupsbyposts'] = $act->xw->flush();
+ $feat = new FeaturedUsersSection($act);
+ $feat->show();
+ $this->blocks['featuredusers'] = $act->xw->flush();
+ break;
+ case "groups":
+ $gbp = new GroupsByPostsSection($act);
+ $gbp->show();
+ $this->blocks['groupsbyposts'] = $act->xw->flush();
+ $gbm = new GroupsByMembersSection($act);
+ $gbm->show();
+ $this->blocks['groupsbymembers'] = $act->xw->flush();
+ break;
+ }
+ return false;
+ }
+
+ // <%logo%>
+ // <%nav%>
+ // <%notice%>
+ // <%noticeform%>
+ function onStartShowHeader( $act ) {
+ $this->clear_xmlWriter($act);
+ $act->showLogo();
+ $this->blocks['logo'] = $act->xw->flush();
+ $act->showPrimaryNav();
+ $this->blocks['nav'] = $act->xw->flush();
+ $act->showSiteNotice();
+ $this->blocks['notice'] = $act->xw->flush();
+ if (common_logged_in()) {
+ $act->showNoticeForm();
+ } else {
+ $act->showAnonymousMessage();
+ }
+ $this->blocks['noticeform'] = $act->xw->flush();
+ return false;
+ }
+
+ // <%secondarynav%>
+ // <%licenses%>
+ function onStartShowFooter( $act ) {
+ $this->clear_xmlWriter($act);
+ $act->showSecondaryNav();
+ $this->blocks['secondarynav'] = $act->xw->flush();
+ $act->showLicenses();
+ $this->blocks['licenses'] = $act->xw->flush();
+ return false;
+ }
+
+ // capture the EndHTML event
+ // and include the template
+ function onEndEndHTML($act) {
+
+ global $action, $tags;
+
+ // set the action and title values
+ $vars = array(
+ 'action'=>$action,
+ 'title'=>$act->title(). " - ". common_config('site', 'name')
+ );
+
+ // use the PHP template
+ // unless statusnet config:
+ // $config['template']['mode'] = 'html';
+ if (!(common_config('template', 'mode') == 'html')) {
+ $tpl_file = $this->templateFolder() . '/social.php';
+ $tags = array_merge($vars,$this->blocks);
+ include $tpl_file;
+ return;
+ }
+
+ $tpl_file = $this->templateFolder() . '/index.html';
+
+ // read the static template
+ $output = file_get_contents( $tpl_file );
+
+ $tags = array();
+
+ // get a list of the <%tags%> in the template
+ $pattern='/<%([a-z]+)%>/';
+
+ if ( 1 <= preg_match_all( $pattern, $output, $found ))
+ $tags[] = $found;
+
+ // for each found tag, set its value from the rendered blocks
+ foreach( $tags[0][1] as $pos=>$tag ) {
+ if (isset($this->blocks[$tag]))
+ $vars[$tag] = $this->blocks[$tag];
+
+ // didn't find a block for the tag
+ elseif (!isset($vars[$tag]))
+ $vars[$tag] = '';
+ }
+
+ // replace the tags in the template
+ foreach( $vars as $key=>$val )
+ $output = str_replace( '<%'.$key.'%>', $val, $output );
+
+ echo $output;
+
+ return true;
+
+ }
+ function templateFolder() {
+ return 'tpl';
+ }
+
+ // catching the StartShowHTML event to halt the rendering
+ function onStartShowHTML( $act ) {
+ $this->clear_xmlWriter($act);
+ return true;
+ }
+
+ // clear the xmlWriter
+ function clear_xmlWriter( $act ) {
+ $act->xw->openMemory();
+ $act->xw->setIndent(true);
+ }
+
+}
+
+/**
+ * Action for updating the template remotely
+ *
+ * "template/update" -- a POST method that requires a single
+ * parameter "template", containing the new template code
+ *
+ * @category Plugin
+ * @package StatusNet
+ * @author Brian Hendrickson <brian@megapump.com>
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://megapump.com/
+ *
+ */
+
+class TemplateAction extends Action
+{
+
+ function prepare($args) {
+ parent::prepare($args);
+ return true;
+ }
+
+ function handle($args) {
+
+ parent::handle($args);
+
+ if (!isset($_SERVER['PHP_AUTH_USER'])) {
+
+ // not authenticated, show login form
+ header('WWW-Authenticate: Basic realm="StatusNet API"');
+
+ // cancelled the browser login form
+ $this->clientError(_('Authentication error!'), $code = 401);
+
+ } else {
+
+ $nick = $_SERVER['PHP_AUTH_USER'];
+ $pass = $_SERVER['PHP_AUTH_PW'];
+
+ // check username and password
+ $user = common_check_user($nick,$pass);
+
+ if ($user) {
+
+ // verify that user is admin
+ if (!($user->id == 1))
+ $this->clientError(_('Only User #1 can update the template.'), $code = 401);
+
+ // open the old template
+ $tpl_file = $this->templateFolder() . '/index.html';
+ $fp = fopen( $tpl_file, 'w+' );
+
+ // overwrite with the new template
+ fwrite($fp, $this->arg('template'));
+ fclose($fp);
+
+ header('HTTP/1.1 200 OK');
+ header('Content-type: text/plain');
+ print "Template Updated!";
+
+ } else {
+
+ // bad username and password
+ $this->clientError(_('Authentication error!'), $code = 401);
+
+ }
+
+ }
+ }
+ function onPluginVersion(&$versions)
+ {
+ $versions[] = array('name' => 'Template',
+ 'version' => TEMPLATEPLUGIN_VERSION,
+ 'author' => 'Brian Hendrickson',
+ 'homepage' => 'http://status.net/wiki/Plugin:Template',
+ 'rawdescription' =>
+ _m('Use an HTML template for Web output.'));
+ return true;
+ }
+
+}
+
+/**
+ * Function for retrieving a statusnet display section
+ *
+ * requires one parameter, the name of the section
+ * section names are listed in the comments of the TemplatePlugin class
+ *
+ * @category Plugin
+ * @package StatusNet
+ * @author Brian Hendrickson <brian@megapump.com>
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://megapump.com/
+ *
+ */
+
+function section($tagname) {
+ global $tags;
+ if (isset($tags[$tagname]))
+ return $tags[$tagname];
+}
+
diff --git a/plugins/GNUsocialVideo/GNUsocialVideoPlugin.php b/plugins/GNUsocialVideo/GNUsocialVideoPlugin.php
new file mode 100644
index 000000000..5e9a6f85e
--- /dev/null
+++ b/plugins/GNUsocialVideo/GNUsocialVideoPlugin.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * GNU Social
+ * Copyright (C) 2010, Free Software Foundation, Inc.
+ *
+ * PHP version 5
+ *
+ * LICENCE:
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Widget
+ * @package GNU Social
+ * @author Ian Denhardt <ian@zenhack.net>
+ * @copyright 2010 Free Software Foundation, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+class GNUsocialVideoPlugin extends Plugin
+{
+ function onAutoload($cls)
+ {
+ $dir = dirname(__FILE__);
+ switch($cls)
+ {
+ case 'PostvideoAction':
+ include_once $dir . '/actions/postvideo.php';
+ break;
+ default:
+ break;
+ }
+ return true;
+ }
+
+ function onRouterInitialized($m)
+ {
+ $m->connect('main/postvideo', array('action' => 'postvideo'));
+ return true;
+ }
+}
diff --git a/plugins/GNUsocialVideo/actions/postvideo.php b/plugins/GNUsocialVideo/actions/postvideo.php
new file mode 100644
index 000000000..4af34af7a
--- /dev/null
+++ b/plugins/GNUsocialVideo/actions/postvideo.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * GNU Social
+ * Copyright (C) 2010, Free Software Foundation, Inc.
+ *
+ * PHP version 5
+ *
+ * LICENCE:
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Widget
+ * @package GNU Social
+ * @author Ian Denhardt <ian@zenhack.net>
+ * @copyright 2010 Free Software Foundation, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+class PostvideoAction extends Action {
+ var $user = null;
+
+ function prepare($args)
+ {
+ parent::prepare($args);
+ $this->user = common_current_user();
+ return true;
+ }
+
+ function handle($args)
+ {
+ parent::handle($args);
+ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+ $this->handlePost($args);
+ }
+ $this->showPage();
+ }
+
+ function handlePost($args)
+ {
+ if (!$this->arg('post')) {
+ return;
+ }
+ if (empty($_POST['video_uri'])) {
+ return;
+ }
+ $uri = $_POST['video_uri'];
+ $uri = filter_var($uri, FILTER_SANITIZE_URL);
+ $uri = filter_var($uri, FILTER_VALIDATE_URL);
+ if($uri) {
+ $rend = sprintf('<video src="%s", controls="controls">Sorry, your browser doesn\'t support the video tag.</video>', $uri);
+ Notice::saveNew($this->user->id, 'video : ' . $uri, 'web', array('rendered' => $rend));
+ }
+ }
+
+ function showContent()
+ {
+ if(empty($this->user)) {
+ $this->element('p', array(), 'You are not logged in.');
+ } else {
+ $this->elementStart('form', array('method' => 'post',
+ 'action' => common_local_url('postvideo')));
+ $this->element('input', array('name' => 'video_uri',
+ 'type' => 'text',
+ 'id' => 'video_uri'));
+ $this->submit('post', _('Post'));
+ $this->elementEnd('form');
+ }
+ }
+}
diff --git a/plugins/OpenID/doc-src/openid b/plugins/OpenID/doc-src/openid
index f2dc610a5..0f0812850 100644
--- a/plugins/OpenID/doc-src/openid
+++ b/plugins/OpenID/doc-src/openid
@@ -9,3 +9,5 @@ There are many [Public OpenID providers](http://wiki.openid.net/OpenID-Providers
* [Yahoo!](http://openid.yahoo.com/) : If you have an account with Yahoo!, you can log in to this site by entering your Yahoo!-provided OpenID in the box above. Yahoo! OpenID URLs have the form *https://me.yahoo.com/yourusername*.
* [AOL](http://dev.aol.com/aol-and-63-million-openids) : If you have an account with [AOL](http://www.aol.com/), like an [AIM](http://www.aim.com/) account, you can log in to %%site.name%% by entering your AOL-provided OpenID in the box above. AOL OpenID URLs have the form *http://openid.aol.com/yourusername*. Your username should be all lowercase, no spaces.
* [Blogger](http://bloggerindraft.blogspot.com/2008/01/new-feature-blogger-as-openid-provider.html), [Wordpress.com](http://faq.wordpress.com/2007/03/06/what-is-openid/), [LiveJournal](http://www.livejournal.com/openid/about.bml), [Vox](http://bradfitz.vox.com/library/post/openid-for-vox.html) : If you have a blog on any of these services, enter your blog URL in the box above. For example, *http://yourusername.blogspot.com/*, *http://yourusername.wordpress.com/*, *http://yourusername.livejournal.com/*, or *http://yourusername.vox.com/*.
+
+Additionally, once you have an account on %%site.name%%, you can use your profile's URL (https://%%site.server%%/yourusername) as an OpenID elsewhere as well.
diff --git a/socialfy-your-domain/README.txt b/socialfy-your-domain/README.txt
new file mode 100644
index 000000000..ead4380f2
--- /dev/null
+++ b/socialfy-your-domain/README.txt
@@ -0,0 +1,57 @@
+Initial simple way to Webfinger enable your domain -- needs PHP.
+================================================================
+
+Step 1
+======
+
+First, put the folders 'xrd' and 'dot-well-known' on your website, so
+they load at:
+
+ http://yourname.com/xrd/
+
+ and
+
+ http://yourname.com/.well-known/
+
+ (Remember the . at the beginning of this one)
+
+Step 2
+======
+
+Next, edit xrd/index.php and enter a secret in this line:
+
+$s = "";
+
+This can be anything you like...
+
+$s = "johnny-five";
+
+or
+
+$s = "12345";
+
+It really doesn't matter too much.
+
+Step 3
+======
+
+For each user on your site, and this might only be you...
+
+Make a copy of the example@example.com.xml file so that it's called...
+
+ yoursecretusername@domain.com.xml
+
+ So, if your secret is 'johnny5' and your name is ben and your
+ domain is titanictoycorp.biz, your file should be called
+ johnny5ben@titanictoycorp.biz.xml
+
+Finally, edit the file to point at your account on your social
+site. If you are the only user, then you probably don't need to worry
+about user/1 as this will be you. For multi user sites, the user ID is
+on the profile page.
+
+Finally
+=======
+
+Using this method, though fiddly, you can now be @user@domain without
+the need for any prefixes for subdomains, etc.
diff --git a/socialfy-your-domain/dot-well-known/host-meta b/socialfy-your-domain/dot-well-known/host-meta
new file mode 100644
index 000000000..e44591a4e
--- /dev/null
+++ b/socialfy-your-domain/dot-well-known/host-meta
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0" xmlns:hm="http://host-meta.net/xrd/1.0"><hm:Host>example.com</hm:Host><Link rel="lrdd" template="http://example.com/xrd?uri={uri}"><Title>Resource Descriptor</Title></Link></XRD> \ No newline at end of file
diff --git a/socialfy-your-domain/xrd/example@example.com b/socialfy-your-domain/xrd/example@example.com
new file mode 100644
index 000000000..06987525b
--- /dev/null
+++ b/socialfy-your-domain/xrd/example@example.com
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Subject>acct:example@example.com</Subject>
+ <Alias>acct:example@social.example.com</Alias>
+ <Alias>http://social.example.com/user/1</Alias>
+ <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="http://social.example.com/user/1"/>
+ <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="http://social.example.com/api/statuses/user_timeline/1.atom"/>
+ <Link rel="http://microformats.org/profile/hcard" type="text/html" href="http://social.example.com/hcard"/>
+ <Link rel="http://gmpg.org/xfn/11" type="text/html" href="http://social.example.com/user/1"/>
+ <Link rel="describedby" type="application/rdf+xml" href="http://social.example.com/foaf"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-replies" href="http://social.example.com/main/salmon/user/1"/>
+ <Link rel="http://salmon-protocol.org/ns/salmon-mention" href="http://social.example.com/main/salmon/user/1"/>
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="http://social.example.com/main/ostatussub?profile={uri}"/>
+</XRD>
diff --git a/socialfy-your-domain/xrd/index.php b/socialfy-your-domain/xrd/index.php
new file mode 100644
index 000000000..25f1d8bf3
--- /dev/null
+++ b/socialfy-your-domain/xrd/index.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * GNU social
+ * Copyright (C) 2010, Free Software Foundation, Inc
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+$s = "";
+
+/* this should be a secret */
+
+$u = $_GET['uri'];
+
+$u = substr($u, 5);
+
+$f = $s . $u . ".xml";
+
+if (file_exists($f)) {
+ $fh = fopen($f, 'r');
+ $c = fread($fh, filesize($f));
+ fclose($fh);
+ header('Content-type: text/xml');
+ echo $c;
+}
+
+
+?> \ No newline at end of file
diff --git a/theme/GNUSocial/css/default.css b/theme/GNUSocial/css/default.css
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/theme/GNUSocial/css/default.css
diff --git a/theme/gnusocial/css/combo.css b/theme/gnusocial/css/combo.css
new file mode 100644
index 000000000..3f31a52e1
--- /dev/null
+++ b/theme/gnusocial/css/combo.css
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var,optgroup{font-style:inherit;font-weight:inherit;}del,ins{text-decoration:none;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:baseline;}sub{vertical-align:baseline;}legend{color:#000;}input,button,textarea,select,optgroup,option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;}input,button,textarea,select{*font-size:100%;}body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}select,input,button,textarea,button{font:99% arial,helvetica,clean,sans-serif;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}body{text-align:center;}#doc,#doc2,#doc3,#doc4,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.25em;}#doc2{width:73.076em;*width:71.25em;}#doc3{margin:auto 10px;width:auto;}#doc4{width:74.923em;*width:73.05em;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main,.yui-g .yui-u .yui-g{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.30769em;*width:12.00em;}.yui-t1 #yui-main .yui-b{margin-left:13.30769em;*margin-left:13.05em;}.yui-t2 .yui-b{float:left;width:13.8461em;*width:13.50em;}.yui-t2 #yui-main .yui-b{margin-left:14.8461em;*margin-left:14.55em;}.yui-t3 .yui-b{float:left;width:23.0769em;*width:22.50em;}.yui-t3 #yui-main .yui-b{margin-left:24.0769em;*margin-left:23.62em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.50em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.55em;}.yui-t5 .yui-b{float:right;width:18.4615em;*width:18.00em;}.yui-t5 #yui-main .yui-b{margin-right:19.4615em;*margin-right:19.125em;}.yui-t6 .yui-b{float:right;width:23.0769em;*width:22.50em;}.yui-t6 #yui-main .yui-b{margin-right:24.0769em;*margin-right:23.62em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf,.yui-gc .yui-u,.yui-gd .yui-g,.yui-g .yui-gc .yui-u,.yui-ge .yui-u,.yui-ge .yui-g,.yui-gf .yui-g,.yui-gf .yui-u{float:right;}.yui-g div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first,.yui-g .yui-gc div.first,.yui-g .yui-ge div.first,.yui-gc div.first div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf{width:49.1%;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{width:32%;margin-left:1.99%;}.yui-gb .yui-u{*margin-left:1.9%;*width:31.9%;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-ge .yui-u,.yui-gf div.first{width:24%;}.yui-g .yui-gb div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-g .yui-g .yui-u,.yui-gb .yui-g .yui-u,.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u,.yui-ge .yui-g .yui-u,.yui-gf .yui-g .yui-u{width:49%;*width:48.1%;*margin-left:0;}.yui-g .yui-g .yui-u{width:48.1%;}.yui-g .yui-gb div.first,.yui-gb .yui-gb div.first{*margin-right:0;*width:32%;_width:31.7%;}.yui-g .yui-gc div.first,.yui-gd .yui-g{width:66%;}.yui-gb .yui-g div.first{*margin-right:4%;_margin-right:1.3%;}.yui-gb .yui-gc div.first,.yui-gb .yui-gd div.first{*margin-right:0;}.yui-gb .yui-gb .yui-u,.yui-gb .yui-gc .yui-u{*margin-left:1.8%;_margin-left:4%;}.yui-g .yui-gb .yui-u{_margin-left:1.0%;}.yui-gb .yui-gd .yui-u{*width:66%;_width:61.2%;}.yui-gb .yui-gd div.first{*width:31%;_width:29.5%;}.yui-g .yui-gc .yui-u,.yui-gb .yui-gc .yui-u{width:32%;_float:right;margin-right:0;_margin-left:0;}.yui-gb .yui-gc div.first{width:66%;*float:left;*margin-left:0;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf .yui-u{margin:0;}.yui-gb .yui-gb .yui-u{_margin-left:.7%;}.yui-gb .yui-g div.first,.yui-gb .yui-gb div.first{*margin-left:0;}.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u{*width:48.1%;*margin-left:0;}.yui-gb .yui-gd div.first{width:32%;}.yui-g .yui-gd div.first{_width:29.9%;}.yui-ge .yui-g{width:24%;}.yui-gf .yui-g{width:74.2%;}.yui-gb .yui-ge div.yui-u,.yui-gb .yui-gf div.yui-u{float:right;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf div.first{float:left;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf div.first{*width:24%;_width:20%;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf .yui-u{*width:73.5%;_width:65.5%;}.yui-ge div.first .yui-gd .yui-u{width:65%;}.yui-ge div.first .yui-gd div.first{width:32%;}#hd:after,#bd:after,#ft:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#hd,#bd,#ft,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;}/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+body{margin:10px;}h1{font-size:138.5%;}h2{font-size:123.1%;}h3{font-size:108%;}h1,h2,h3{margin:1em 0;}h1,h2,h3,h4,h5,h6,strong,dt{font-weight:bold;}optgroup{font-weight:normal;}abbr,acronym{border-bottom:1px dotted #000;cursor:help;}em{font-style:italic;}del{text-decoration:line-through;}blockquote,ul,ol,dl{margin:1em;}ol,ul,dl{margin-left:2em;}ol li{list-style:decimal outside;}ul li{list-style:disc outside;}dl dd{margin-left:1em;}th,td{border:1px solid #000;padding:.5em;}th{font-weight:bold;text-align:center;}caption{margin-bottom:.5em;text-align:center;}sup{vertical-align:super;}sub{vertical-align:sub;}p,fieldset,table,pre{margin-bottom:1em;}button,input[type="checkbox"],input[type="radio"],input[type="reset"],input[type="submit"]{padding:1px;} \ No newline at end of file
diff --git a/theme/gnusocial/css/debug.css b/theme/gnusocial/css/debug.css
new file mode 100644
index 000000000..a77e2bcb9
--- /dev/null
+++ b/theme/gnusocial/css/debug.css
@@ -0,0 +1,7 @@
+#hd { background-color: orange !important; }
+
+#bd { background-color: red !important; }
+
+#ft { background-color: lime !important; }
+
+#yui-main { background-color: yellow !important; } \ No newline at end of file
diff --git a/theme/gnusocial/css/display.css b/theme/gnusocial/css/display.css
new file mode 100644
index 000000000..3f31a52e1
--- /dev/null
+++ b/theme/gnusocial/css/display.css
@@ -0,0 +1,13 @@
+/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var,optgroup{font-style:inherit;font-weight:inherit;}del,ins{text-decoration:none;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:baseline;}sub{vertical-align:baseline;}legend{color:#000;}input,button,textarea,select,optgroup,option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;}input,button,textarea,select{*font-size:100%;}body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}select,input,button,textarea,button{font:99% arial,helvetica,clean,sans-serif;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}body{text-align:center;}#doc,#doc2,#doc3,#doc4,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.25em;}#doc2{width:73.076em;*width:71.25em;}#doc3{margin:auto 10px;width:auto;}#doc4{width:74.923em;*width:73.05em;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main,.yui-g .yui-u .yui-g{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.30769em;*width:12.00em;}.yui-t1 #yui-main .yui-b{margin-left:13.30769em;*margin-left:13.05em;}.yui-t2 .yui-b{float:left;width:13.8461em;*width:13.50em;}.yui-t2 #yui-main .yui-b{margin-left:14.8461em;*margin-left:14.55em;}.yui-t3 .yui-b{float:left;width:23.0769em;*width:22.50em;}.yui-t3 #yui-main .yui-b{margin-left:24.0769em;*margin-left:23.62em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.50em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.55em;}.yui-t5 .yui-b{float:right;width:18.4615em;*width:18.00em;}.yui-t5 #yui-main .yui-b{margin-right:19.4615em;*margin-right:19.125em;}.yui-t6 .yui-b{float:right;width:23.0769em;*width:22.50em;}.yui-t6 #yui-main .yui-b{margin-right:24.0769em;*margin-right:23.62em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf,.yui-gc .yui-u,.yui-gd .yui-g,.yui-g .yui-gc .yui-u,.yui-ge .yui-u,.yui-ge .yui-g,.yui-gf .yui-g,.yui-gf .yui-u{float:right;}.yui-g div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first,.yui-g .yui-gc div.first,.yui-g .yui-ge div.first,.yui-gc div.first div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf{width:49.1%;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{width:32%;margin-left:1.99%;}.yui-gb .yui-u{*margin-left:1.9%;*width:31.9%;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-ge .yui-u,.yui-gf div.first{width:24%;}.yui-g .yui-gb div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-g .yui-g .yui-u,.yui-gb .yui-g .yui-u,.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u,.yui-ge .yui-g .yui-u,.yui-gf .yui-g .yui-u{width:49%;*width:48.1%;*margin-left:0;}.yui-g .yui-g .yui-u{width:48.1%;}.yui-g .yui-gb div.first,.yui-gb .yui-gb div.first{*margin-right:0;*width:32%;_width:31.7%;}.yui-g .yui-gc div.first,.yui-gd .yui-g{width:66%;}.yui-gb .yui-g div.first{*margin-right:4%;_margin-right:1.3%;}.yui-gb .yui-gc div.first,.yui-gb .yui-gd div.first{*margin-right:0;}.yui-gb .yui-gb .yui-u,.yui-gb .yui-gc .yui-u{*margin-left:1.8%;_margin-left:4%;}.yui-g .yui-gb .yui-u{_margin-left:1.0%;}.yui-gb .yui-gd .yui-u{*width:66%;_width:61.2%;}.yui-gb .yui-gd div.first{*width:31%;_width:29.5%;}.yui-g .yui-gc .yui-u,.yui-gb .yui-gc .yui-u{width:32%;_float:right;margin-right:0;_margin-left:0;}.yui-gb .yui-gc div.first{width:66%;*float:left;*margin-left:0;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf .yui-u{margin:0;}.yui-gb .yui-gb .yui-u{_margin-left:.7%;}.yui-gb .yui-g div.first,.yui-gb .yui-gb div.first{*margin-left:0;}.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u{*width:48.1%;*margin-left:0;}.yui-gb .yui-gd div.first{width:32%;}.yui-g .yui-gd div.first{_width:29.9%;}.yui-ge .yui-g{width:24%;}.yui-gf .yui-g{width:74.2%;}.yui-gb .yui-ge div.yui-u,.yui-gb .yui-gf div.yui-u{float:right;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf div.first{float:left;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf div.first{*width:24%;_width:20%;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf .yui-u{*width:73.5%;_width:65.5%;}.yui-ge div.first .yui-gd .yui-u{width:65%;}.yui-ge div.first .yui-gd div.first{width:32%;}#hd:after,#bd:after,#ft:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#hd,#bd,#ft,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;}/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+body{margin:10px;}h1{font-size:138.5%;}h2{font-size:123.1%;}h3{font-size:108%;}h1,h2,h3{margin:1em 0;}h1,h2,h3,h4,h5,h6,strong,dt{font-weight:bold;}optgroup{font-weight:normal;}abbr,acronym{border-bottom:1px dotted #000;cursor:help;}em{font-style:italic;}del{text-decoration:line-through;}blockquote,ul,ol,dl{margin:1em;}ol,ul,dl{margin-left:2em;}ol li{list-style:decimal outside;}ul li{list-style:disc outside;}dl dd{margin-left:1em;}th,td{border:1px solid #000;padding:.5em;}th{font-weight:bold;text-align:center;}caption{margin-bottom:.5em;text-align:center;}sup{vertical-align:super;}sub{vertical-align:sub;}p,fieldset,table,pre{margin-bottom:1em;}button,input[type="checkbox"],input[type="radio"],input[type="reset"],input[type="submit"]{padding:1px;} \ No newline at end of file
diff --git a/theme/gnusocial/css/social.css b/theme/gnusocial/css/social.css
new file mode 100755
index 000000000..8a10dd02f
--- /dev/null
+++ b/theme/gnusocial/css/social.css
@@ -0,0 +1,280 @@
+/*
+
+GNU social alpha CSS
+
+Enable this line to debug:
+
+@import url('./debug.css');
+
+*/
+
+/* stuff we want to hide..... */
+
+legend,.entry-content .source, .entry-content .location, .entry-content .response, #anon_notice, #notices_primary h2, #site_nav_local_views dt, #ft dt{ display: none !important; }
+
+dl, dd { margin: 0 !important; padding: 0 !important;}
+
+#yui-main { margin-bottom: 0 !important; padding-bottom: 0 !important;}
+
+.notices { margin: 0; padding: 0; }
+.notices li { list-style: none; }
+
+#ft { padding-top: 12px;}
+
+#custom-doc { width:76.23em;*width:74.39em;min-width:991px; margin:auto; text-align:left; }
+
+#yui-main { background-color: white; position: relative; }
+
+#sidebar *, #right-nav * { background: none !important; border: none !important; }
+
+ html, body{padding: 0; margin: 0;}
+
+ body {background-image: url(/theme/gnusocial/images/bg.png) !important; background-repeat: repeat-x !important; background-color: white;}
+
+ #hd h1 {margin: 0; line-height: 40px; font-size: 24px; font-weight: bold;}
+
+ #hd h1 a{color: #111; text-decoration: none;}
+
+ #hd dt {display: none;}
+
+ #hd ul {padding: 0; margin: 0; line-height: 48px; position: absolute; top: 0; right: 10px; }
+
+ #hd li {display: inline; list-style: none; margin-left: 12px;}
+
+ #hd {height: 40px; position: relative;}
+
+
+ form {margin: 0 auto; width: 70%;}
+
+ table {width: 100%;}
+
+ tr, td{border: 0;}
+
+ .update-text{ font-size: 12px; font-weight: bold;}
+
+ .update-icon{ text-align: center;}
+
+ #stream li{list-style: none; position: relative; margin-top: 12px; }
+
+ #stream dl {position: absolute; top: 0; left: 50px;}
+
+ #stream dd {color: #333; font-size: 80%; padding: 0; margin: 0; margin-top: 6px;}
+
+
+ #social {border-left: 1px solid #999; border-right: 1px solid #999; padding-left: 10px;}
+
+ #sidebar ul{margin: 0; padding: 0;}
+
+ #sidebar li {list-style: none;}
+
+ #sidebar li a{display: block; width: 180px; padding: 4px;}
+
+ #sidebar li a:hover {background-color: #ececec;}
+
+ .selected {background-color: cyan; width: 180px;}
+
+ #right-nav {background-color: #ececec;}
+
+ #right-nav div {padding: 10px;}
+
+ .form_notice { position: relative; top: 0; left: 0; }
+
+
+
+form label.submit {
+display:none;
+}
+
+.form_settings {
+clear:both;
+}
+
+.form_settings fieldset {
+margin-bottom:29px;
+}
+.form_settings input.remove {
+margin-left:11px;
+}
+.form_settings .form_data li {
+width:100%;
+float:left;
+}
+.form_settings .form_data label {
+float:left;
+}
+.form_settings .form_data textarea,
+.form_settings .form_data select,
+.form_settings .form_data input {
+margin-left:11px;
+float:left;
+}
+.form_settings .form_data textarea {
+width:325px;
+}
+
+.form_settings .form_data input.submit {
+margin-left:0;
+}
+
+.form_settings label {
+margin-top:2px;
+width:143px;
+}
+
+.form_actions label {
+display:none;
+}
+.form_guide {
+font-style:italic;
+}
+
+.form_settings #settings_autosubscribe label {
+display:inline;
+font-weight:bold;
+}
+
+#form_settings_profile legend,
+#form_login legend,
+#form_register legend,
+#form_password legend,
+#form_settings_avatar legend,
+#newgroup legend,
+#editgroup legend,
+#form_tag_user legend,
+#form_remote_subscribe legend,
+#form_openid_login legend,
+#form_search legend,
+#form_invite legend,
+#form_notice_delete legend,
+#form_password_recover legend,
+#form_password_change legend {
+display:none;
+}
+
+.form_settings .form_data p.form_guide {
+clear:both;
+margin-left:155px;
+margin-bottom:0;
+}
+
+.form_settings p {
+margin-bottom:11px;
+}
+
+.form_settings input.checkbox {
+margin-top:0;
+margin-left:0;
+}
+.form_settings label.checkbox {
+font-weight:normal;
+margin-top:0;
+margin-right:0;
+margin-left:11px;
+float:left;
+width:90%;
+}
+
+
+#form_login p.form_guide,
+#form_register #settings_rememberme p.form_guide,
+#form_openid_login #settings_rememberme p.form_guide,
+#settings_twitter_remove p.form_guide,
+#form_search ul.form_data #q {
+margin-left:0;
+}
+
+.form_settings .form_note {
+border-radius:4px;
+-moz-border-radius:4px;
+-webkit-border-radius:4px;
+padding:0 7px;
+}
+
+
+.form_settings input.form_action-primary {
+padding:0;
+}
+.form_settings input.form_action-secondary {
+margin-left:29px;
+}
+
+#form_search .submit {
+margin-left:11px;
+}
+caption {
+font-weight:bold;
+}
+legend {
+font-weight:bold;
+font-size:1.3em;
+}
+input, textarea, select, option {
+padding:4px;
+font-family:sans-serif;
+font-size:1em;
+}
+input, textarea, select {
+border-width:2px;
+border-style: solid;
+border-radius:4px;
+-moz-border-radius:4px;
+-webkit-border-radius:4px;
+}
+
+input.submit {
+font-weight:bold;
+cursor:pointer;
+}
+textarea {
+overflow:auto;
+}
+option {
+padding-bottom:0;
+}
+fieldset {
+padding:0;
+border:0;
+}
+form ul li {
+list-style-type:none;
+margin:0 0 18px 0;
+}
+form label {
+font-weight:bold;
+}
+input.checkbox {
+position:relative;
+top:2px;
+left:0;
+border:0;
+}
+
+.error,
+.success {
+padding:4px 7px;
+border-radius:4px;
+-moz-border-radius:4px;
+-webkit-border-radius:4px;
+margin-bottom:18px;
+}
+
+#all .notice, #public .notice { padding-bottom: 12px;}
+
+#all .notice .entry-title, #public .notice .entry-title { position: relative;}
+
+#all .notice .entry-title .entry-content, #public .notice .entry-title .entry-content { position: absolute; top: 25px; left: 55px; }
+
+#all .notice .entry-content .timestamp, #public .notice .entry-content .timestamp { color: #666; margin-left: 55px; font-size: 80%; text-decoration: none !important; }
+
+abbr { border: 0px !important; }
+
+#all .entry-title .author .nickname, #public .entry-title .author .nickname { position: absolute; top: 0; left: 55px; font-weight: bold; }
+
+#showstream #i { position: absolute; top: 0; left: 0; background-color: white; z-index: 100; width: 185px; }
+
+
+.notice-options, .form_favor .submit, .form_repeat .submit { background-color: white; border: 0; display: none !important; }
+
+#form_notice { margin-top: 10px;}
+
+
diff --git a/theme/gnusocial/default-avatar-mini.png b/theme/gnusocial/default-avatar-mini.png
new file mode 100755
index 000000000..4fd8bd9e1
--- /dev/null
+++ b/theme/gnusocial/default-avatar-mini.png
Binary files differ
diff --git a/theme/gnusocial/default-avatar-profile.png b/theme/gnusocial/default-avatar-profile.png
new file mode 100755
index 000000000..eb08571d9
--- /dev/null
+++ b/theme/gnusocial/default-avatar-profile.png
Binary files differ
diff --git a/theme/gnusocial/default-avatar-stream.png b/theme/gnusocial/default-avatar-stream.png
new file mode 100755
index 000000000..926b8a9ca
--- /dev/null
+++ b/theme/gnusocial/default-avatar-stream.png
Binary files differ
diff --git a/theme/gnusocial/images/bg.png b/theme/gnusocial/images/bg.png
new file mode 100644
index 000000000..1b80a1918
--- /dev/null
+++ b/theme/gnusocial/images/bg.png
Binary files differ
diff --git a/theme/gnusocial/images/icons/icon_atom.png b/theme/gnusocial/images/icons/icon_atom.png
new file mode 100755
index 000000000..6a001f11a
--- /dev/null
+++ b/theme/gnusocial/images/icons/icon_atom.png
Binary files differ
diff --git a/theme/gnusocial/images/icons/icon_disfavourite.gif b/theme/gnusocial/images/icons/icon_disfavourite.gif
new file mode 100755
index 000000000..2b02ac8a6
--- /dev/null
+++ b/theme/gnusocial/images/icons/icon_disfavourite.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/icon_favourite.gif b/theme/gnusocial/images/icons/icon_favourite.gif
new file mode 100755
index 000000000..716ce3549
--- /dev/null
+++ b/theme/gnusocial/images/icons/icon_favourite.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/icon_foaf.gif b/theme/gnusocial/images/icons/icon_foaf.gif
new file mode 100755
index 000000000..f8f784423
--- /dev/null
+++ b/theme/gnusocial/images/icons/icon_foaf.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/icon_processing.gif b/theme/gnusocial/images/icons/icon_processing.gif
new file mode 100755
index 000000000..d0bce1542
--- /dev/null
+++ b/theme/gnusocial/images/icons/icon_processing.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/icon_reply.gif b/theme/gnusocial/images/icons/icon_reply.gif
new file mode 100755
index 000000000..a4379a70b
--- /dev/null
+++ b/theme/gnusocial/images/icons/icon_reply.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/icon_rss.png b/theme/gnusocial/images/icons/icon_rss.png
new file mode 100755
index 000000000..0ccd1ce25
--- /dev/null
+++ b/theme/gnusocial/images/icons/icon_rss.png
Binary files differ
diff --git a/theme/gnusocial/images/icons/icon_trash.gif b/theme/gnusocial/images/icons/icon_trash.gif
new file mode 100755
index 000000000..916a332a3
--- /dev/null
+++ b/theme/gnusocial/images/icons/icon_trash.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/icon_vcard.gif b/theme/gnusocial/images/icons/icon_vcard.gif
new file mode 100755
index 000000000..6d52947f3
--- /dev/null
+++ b/theme/gnusocial/images/icons/icon_vcard.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/twotone/green/arrow-left.gif b/theme/gnusocial/images/icons/twotone/green/arrow-left.gif
new file mode 100755
index 000000000..afed19084
--- /dev/null
+++ b/theme/gnusocial/images/icons/twotone/green/arrow-left.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/twotone/green/arrow-right.gif b/theme/gnusocial/images/icons/twotone/green/arrow-right.gif
new file mode 100755
index 000000000..ee1707ed9
--- /dev/null
+++ b/theme/gnusocial/images/icons/twotone/green/arrow-right.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/twotone/green/edit.gif b/theme/gnusocial/images/icons/twotone/green/edit.gif
new file mode 100755
index 000000000..c746aca60
--- /dev/null
+++ b/theme/gnusocial/images/icons/twotone/green/edit.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/twotone/green/mail.gif b/theme/gnusocial/images/icons/twotone/green/mail.gif
new file mode 100755
index 000000000..1084c862f
--- /dev/null
+++ b/theme/gnusocial/images/icons/twotone/green/mail.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/twotone/green/news.gif b/theme/gnusocial/images/icons/twotone/green/news.gif
new file mode 100755
index 000000000..712c685dc
--- /dev/null
+++ b/theme/gnusocial/images/icons/twotone/green/news.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/twotone/green/quote.gif b/theme/gnusocial/images/icons/twotone/green/quote.gif
new file mode 100755
index 000000000..4ba1f0c03
--- /dev/null
+++ b/theme/gnusocial/images/icons/twotone/green/quote.gif
Binary files differ
diff --git a/theme/gnusocial/images/icons/twotone/green/shield.gif b/theme/gnusocial/images/icons/twotone/green/shield.gif
new file mode 100755
index 000000000..419d5ee4b
--- /dev/null
+++ b/theme/gnusocial/images/icons/twotone/green/shield.gif
Binary files differ
diff --git a/theme/gnusocial/images/illustrations/illu_arrow-up-01.gif b/theme/gnusocial/images/illustrations/illu_arrow-up-01.gif
new file mode 100755
index 000000000..577be1871
--- /dev/null
+++ b/theme/gnusocial/images/illustrations/illu_arrow-up-01.gif
Binary files differ
diff --git a/theme/gnusocial/images/illustrations/illu_clouds-01.gif b/theme/gnusocial/images/illustrations/illu_clouds-01.gif
new file mode 100755
index 000000000..41cd622cf
--- /dev/null
+++ b/theme/gnusocial/images/illustrations/illu_clouds-01.gif
Binary files differ
diff --git a/theme/gnusocial/images/illustrations/illu_jcrop.gif b/theme/gnusocial/images/illustrations/illu_jcrop.gif
new file mode 100755
index 000000000..72ea7ccb5
--- /dev/null
+++ b/theme/gnusocial/images/illustrations/illu_jcrop.gif
Binary files differ
diff --git a/theme/gnusocial/images/illustrations/illu_progress_loading-01.gif b/theme/gnusocial/images/illustrations/illu_progress_loading-01.gif
new file mode 100755
index 000000000..82290f483
--- /dev/null
+++ b/theme/gnusocial/images/illustrations/illu_progress_loading-01.gif
Binary files differ
diff --git a/theme/gnusocial/images/illustrations/illu_unicorn-01.png b/theme/gnusocial/images/illustrations/illu_unicorn-01.png
new file mode 100755
index 000000000..6cb51b298
--- /dev/null
+++ b/theme/gnusocial/images/illustrations/illu_unicorn-01.png
Binary files differ
diff --git a/theme/gnusocial/index.html b/theme/gnusocial/index.html
new file mode 100644
index 000000000..c1a3b7a52
--- /dev/null
+++ b/theme/gnusocial/index.html
@@ -0,0 +1,213 @@
+<!DOCTYPE html>
+ <head>
+ <title>Public timeline - Lorraine Lee &mdash; GNU social</title>
+
+
+ <link rel="stylesheet" href="/theme/gnusocial/combo.css" type="text/css">
+ <style type="text/css">
+ #custom-doc { width:76.23em;*width:74.39em;min-width:991px; margin:auto; text-align:left; }
+
+ html, body{padding: 0; margin: 0;}
+
+ body {background-image: url(/theme/gnusocial/bg.png); background-repeat: repeat-x;}
+
+ #hd h1 {margin: 0; line-height: 48px; font-size: 30px; font-weight: bold;}
+
+ #hd h1 a{color: #111; text-decoration: none;}
+
+ #hd dt {display: none;}
+
+ #hd ul {padding: 0; margin: 0; line-height: 48px; position: absolute; top: 0; right: 10px; }
+
+ #hd li {display: inline; list-style: none; margin-left: 12px;}
+
+ #hd {height: 48px; position: relative;}
+
+ #bd {margin-top: 12px;}
+
+ #ft {font-size: 10px; text-align: right; margin-top: 12px}
+
+ form {margin: 0 auto; width: 70%;}
+
+ table {width: 100%;}
+
+ tr, td{border: 0;}
+
+ .update-text{ font-size: 12px; font-weight: bold;}
+
+ .update-icon{ text-align: center;}
+
+ #stream li{list-style: none; position: relative; margin-top: 12px; }
+
+ #stream dl {position: absolute; top: 0; left: 50px;}
+
+ #stream dd {color: #333; font-size: 80%; padding: 0; margin: 0; margin-top: 6px;}
+
+
+ #social {border-left: 1px solid #999; border-right: 1px solid #999; padding-left: 10px;}
+
+ #sidebar ul{margin: 0; padding: 0;}
+
+ #sidebar li {list-style: none;}
+
+ #sidebar li a{display: block; width: 180px; padding: 4px;}
+
+ #sidebar li a:hover {background-color: #ececec;}
+
+ .selected {background-color: cyan; width: 180px;}
+
+ #right-nav {background-color: #ececec;}
+
+ #right-nav div {padding: 10px;}
+
+ </style>
+
+
+ </head>
+ <body id="public">
+<div id="custom-doc" class="yui-t2">
+ <div id="hd">
+ <h1>GNU social</h1>
+
+ <dl id="site_nav_global_primary">
+ <dt>Primary site navigation</dt>
+ <dd>
+ <ul class="nav">
+ <li id="nav_login">
+ <a href="http://lorrainelee.co.uk/main/login" title="Login to the site">Login</a>
+</li>
+ <li id="nav_help">
+ <a href="http://lorrainelee.co.uk/doc/help" title="Help me!">Help</a>
+</li>
+ <li id="nav_search">
+ <a href="http://lorrainelee.co.uk/search/people" title="Search for people or text">Search</a>
+</li>
+</ul>
+</dd>
+</dl>
+ </div>
+ <div id="bd">
+
+ <div id="yui-main">
+
+ <div class="yui-b">
+
+ <div class="yui-gc">
+
+ <div class="yui-u first">
+
+ <dl id="site_notice" class="system_notice">
+ <dt>Site notice</dt>
+ <dd>Powered by <a href="http://www.gnu.org/software/social/">GNU social</a></dd>
+</dl>
+ <div id="anon_notice"><p>This is Lorraine Lee, a <a href="http://en.wikipedia.org/wiki/Micro-blogging">micro-blogging</a> service based on the Free Software <a href="http://status.net/">StatusNet</a> tool.</p>
+</div>
+ <div id="content">
+ <h1>Public timeline</h1>
+ <div id="content_inner">
+ <div id="notices_primary">
+ <h2>Notices</h2>
+ <ol class="notices xoxo">
+ <li class="hentry notice" id="notice-5">
+ <div class="entry-title">
+ <span class="vcard author">
+ <a href="http://lorrainelee.co.uk/lorraine" class="url" title="Lorraine Lee (lorraine)">
+ <img src="http://lorrainelee.co.uk/avatar/3-48-20100722212232.jpeg" class="avatar photo" width="48" height="48" alt="Lorraine Lee"/>
+ <span class="nickname fn">lorraine</span></a>
+</span>
+ <p class="entry-content">im going to brush my teeth</p>
+</div>
+ <div class="entry-content">
+ <a rel="bookmark" class="timestamp" href="http://lorrainelee.co.uk/notice/5">
+ <abbr class="published" title="2010-07-22T21:41:40+00:00">about 5 hours ago</abbr>
+</a>
+ <span class="source">from <span class="device">web</span>
+</span>
+ <span class="location">at <a href="http://www.geonames.org/2651292" rel="external"><abbr class="geo" title="50.7500000;-3.7500000">County of Devon, England, United Kingdom of Great Britain and Northern Ireland</abbr></a></span>
+</div>
+</li>
+ <li class="hentry notice" id="notice-2">
+ <div class="entry-title">
+ <span class="vcard author">
+ <a href="http://lorrainelee.co.uk/lorraine" class="url" title="Lorraine Lee (lorraine)">
+ <img src="http://lorrainelee.co.uk/avatar/3-48-20100722212232.jpeg" class="avatar photo" width="48" height="48" alt="Lorraine Lee"/>
+ <span class="nickname fn">lorraine</span></a>
+</span>
+ <p class="entry-content">nothing im fine thank you</p>
+</div>
+ <div class="entry-content">
+ <a rel="bookmark" class="timestamp" href="http://lorrainelee.co.uk/notice/2">
+ <abbr class="published" title="2010-07-22T21:38:18+00:00">about 5 hours ago</abbr>
+</a>
+ <span class="source">from <span class="device">web</span>
+</span>
+ <span class="location">at <a href="http://www.geonames.org/2651292" rel="external"><abbr class="geo" title="50.7500000;-3.7500000">County of Devon, England, United Kingdom of Great Britain and Northern Ireland</abbr></a></span>
+ <a href="http://lorrainelee.co.uk/conversation/2#notice-2" class="response">in context</a>
+</div>
+</li>
+</ol>
+</div>
+</div>
+</div>
+
+ </div>
+
+
+ <div class="yui-u" id="right-nav">
+
+
+
+
+
+ <div id="aside_primary" class="aside">
+ <div id="featured_users" class="section">
+ <h2>Featured users</h2>
+</div>
+ </div>
+
+
+ </div>
+</div>
+ </div>
+</div>
+
+ <div class="yui-b" id="sidebar">
+ <dl id="site_nav_local_views">
+ <dt>Local views</dt>
+ <dd>
+ <ul class="nav">
+ <li class="current" id="nav_timeline_public">
+ <a href="http://lorrainelee.co.uk/" title="Public timeline">Public</a>
+</li>
+ <li id="nav_groups">
+ <a href="http://lorrainelee.co.uk/group" title="User groups">Groups</a>
+</li>
+ <li id="nav_recent-tags">
+ <a href="http://lorrainelee.co.uk/tags" title="Recent tags">Recent tags</a>
+</li>
+ <li id="nav_timeline_favorited">
+ <a href="http://lorrainelee.co.uk/favorited" title="Popular notices">Popular</a>
+</li>
+</ul>
+</dd>
+</dl>
+ </div>
+
+ </div>
+ <div id="ft">
+
+ <dl id="licenses">
+ <dt id="site_statusnet_license">StatusNet software licence</dt>
+ <dd><p><strong>Lorraine Lee</strong> is a microblogging service brought to you by <a href="http://www.gnu.org/s/social/">GNU social</a>. It runs the <a href="http://status.net/">StatusNet</a> microblogging software, version 0.9.3, available under the <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">GNU Affero General Public Licence</a>.</p>
+</dd>
+ <dt id="site_content_license">Site content license</dt>
+ <dd id="site_content_license_cc">
+ <p>
+ <img id="license_cc" src="http://i.creativecommons.org/l/by/3.0/80x15.png" alt="Creative Commons Attribution 3.0" width="80" height="15"/>
+ All Lorraine Lee content and data are available under the <a class="license" rel="external license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> licence.</p>
+</dd>
+</dl>
+ </div>
+ </div>
+ </body>
+ </html>
diff --git a/theme/gnusocial/logo.png b/theme/gnusocial/logo.png
new file mode 100755
index 000000000..cf1839194
--- /dev/null
+++ b/theme/gnusocial/logo.png
Binary files differ
diff --git a/tpl/social.php b/tpl/social.php
new file mode 100644
index 000000000..20acbe1b7
--- /dev/null
+++ b/tpl/social.php
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title><?php echo section('title'); ?> &mdash; GNU social</title>
+
+
+ <link rel="stylesheet" href="/theme/gnusocial/css/combo.css" type="text/css">
+ <link rel="stylesheet" href="/theme/gnusocial/css/social.css" type="text/css">
+ <?php echo section('scripts'); ?>
+ <?php echo section('search'); ?>
+ <?php echo section('feeds'); ?>
+ <?php echo section('description'); ?>
+ <?php echo section('head'); ?>
+ </head>
+ <body id="<?php echo section('action'); ?>">
+ <div id="custom-doc" class="yui-t2">
+ <div id="hd">
+ <h1><a href="/">GNU social</a></h1>
+ <?php echo section('nav'); ?>
+ </div>
+ <div id="bd">
+ <div id="yui-main">
+ <div class="yui-b" id="social">
+ <div class="yui-gc">
+ <div class="yui-u first">
+ <?php echo section('noticeform'); ?>
+ <?php echo section('bodytext'); ?>
+
+ </div>
+
+
+ <div class="yui-u" id="right-nav">
+ <div id="aside_primary" class="aside">
+ <?php echo section('subscriptions'); ?>
+ <?php echo section('subscribers'); ?>
+ <?php echo section('groups'); ?>
+ <?php echo section('cloud'); ?>
+ <?php echo section('popular'); ?>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="yui-b" id="sidebar">
+ <?php echo section('localnav'); ?>
+ </div>
+ </div>
+ <div id="ft">
+ <p>This is GNU social.</p>
+ </div>
+ </div>
+ </body>
+</html>