diff --git a/actions/avatarsettings.php b/actions/avatarsettings.php
index 1db35237ed..19f53b8828 100644
--- a/actions/avatarsettings.php
+++ b/actions/avatarsettings.php
@@ -119,9 +119,8 @@ class AvatarsettingsAction extends AccountSettingsAction
$this->elementStart('ul', 'form_data');
if ($original) {
- $this->elementStart('li',
- array('id' => 'avatar_original',
- 'class' => 'avatar_view'));
+ $this->elementStart('li', array('id' => 'avatar_original',
+ 'class' => 'avatar_view'));
$this->element('h2', null, _("Original"));
$this->elementStart('div', array('id'=>'avatar_original_view'));
$this->element('img', array('src' => $original->url,
@@ -135,16 +134,16 @@ class AvatarsettingsAction extends AccountSettingsAction
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
if ($avatar) {
- $this->elementStart('li',
- array('id' => 'avatar_preview',
- 'class' => 'avatar_view'));
+ $this->elementStart('li', array('id' => 'avatar_preview',
+ 'class' => 'avatar_view'));
$this->element('h2', null, _("Preview"));
$this->elementStart('div', array('id'=>'avatar_preview_view'));
- $this->element('img', array('src' => $original->url,//$avatar->url,
+ $this->element('img', array('src' => $original->url,
'width' => AVATAR_PROFILE_SIZE,
'height' => AVATAR_PROFILE_SIZE,
'alt' => $user->nickname));
$this->elementEnd('div');
+ $this->elementEnd('li');
}
$this->elementStart('li', array ('id' => 'settings_attach'));
diff --git a/actions/facebookhome.php b/actions/facebookhome.php
index b05e51b911..9510e7f087 100644
--- a/actions/facebookhome.php
+++ b/actions/facebookhome.php
@@ -57,29 +57,30 @@ class FacebookhomeAction extends FacebookAction
$this->user = $this->flink->getUser();
// If this is the first time the user has started the app
- // prompt for Facebook status update permission
- if (!$this->facebook->api_client->users_hasAppPermission('status_update')) {
+ // prompt for Facebook status update permission
+ if (!$this->facebook->api_client->users_hasAppPermission('status_update')) {
if ($this->facebook->api_client->data_getUserPreference(
- FACEBOOK_PROMPTED_UPDATE_PREF) != 'true') {
- $this->getUpdatePermission();
- return;
+ FACEBOOK_PROMPTED_UPDATE_PREF) != 'true') {
+ $this->getUpdatePermission();
+ return;
}
}
// Make sure the user's profile box has the lastest notice
$notice = $this->user->getCurrentNotice();
- $this->updateProfileBox($notice);
+ if ($notice) {
+ $this->updateProfileBox($notice);
+ }
- if ($this->arg('status_submit') == 'Send') {
+ if ($this->arg('status_submit') == 'Send') {
$this->saveNewNotice();
- }
+ }
// User is authenticated and has already been prompted once for
// Facebook status update permission? Then show the main page
// of the app
$this->showPage();
-
} else {
@@ -201,13 +202,13 @@ class FacebookhomeAction extends FacebookAction
$this->elementEnd('p');
$this->elementStart('form', array('method' => 'post',
- 'action' => $app_url,
+ 'action' => "$app_url/index.php",
'id' => 'facebook-skip-permissions'));
$this->elementStart('ul', array('id' => 'fb-permissions-list'));
$this->elementStart('li', array('id' => 'fb-permissions-item'));
$this->elementStart('fb:prompt-permission', array('perms' => 'status_update',
- 'next_fbjs' => 'document.setLocation(\'' . $this->app_uri . '\')'));
+ 'next_fbjs' => 'document.setLocation(\'' . "$this->app_uri/index.php" . '\')'));
$this->element('span', array('class' => 'facebook-button'),
sprintf(_('Allow %s to update my Facebook status'), $this->app_name));
$this->elementEnd('fb:prompt-permission');
diff --git a/actions/facebooklogin.php b/actions/facebooklogin.php
new file mode 100644
index 0000000000..94d494a82c
--- /dev/null
+++ b/actions/facebooklogin.php
@@ -0,0 +1,101 @@
+.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+require_once(INSTALLDIR.'/lib/facebookaction.php');
+
+class FacebookinviteAction extends FacebookAction
+{
+
+ function handle($args)
+ {
+ parent::handle($args);
+
+ $this->error = $error;
+
+ if ($this->flink) {
+ if (!$this->facebook->api_client->users_hasAppPermission('status_update') &&
+ $this->facebook->api_client->data_getUserPreference(
+ FACEBOOK_PROMPTED_UPDATE_PREF) == 'true') {
+
+ echo '
REDIRECT TO HOME
';
+ }
+ } else {
+ $this->showPage();
+ }
+ }
+
+
+ function showContent()
+ {
+
+ // If the user has opted not to initially allow the app to have
+ // Facebook status update permission, store that preference. Only
+ // promt the user the first time she uses the app
+ if ($this->arg('skip')) {
+ $this->facebook->api_client->data_setUserPreference(
+ FACEBOOK_PROMPTED_UPDATE_PREF, 'true');
+ }
+
+ if ($this->flink) {
+
+ $this->user = $this->flink->getUser();
+
+ // If this is the first time the user has started the app
+ // prompt for Facebook status update permission
+ if (!$this->facebook->api_client->users_hasAppPermission('status_update')) {
+
+ if ($this->facebook->api_client->data_getUserPreference(
+ FACEBOOK_PROMPTED_UPDATE_PREF) != 'true') {
+ $this->getUpdatePermission();
+ return;
+ }
+ }
+
+ } else {
+ $this->showLoginForm();
+ }
+
+ }
+
+ function showSuccessContent()
+ {
+
+
+
+ }
+
+ function showFormContent()
+ {
+
+
+ }
+
+ function title()
+ {
+ return sprintf(_('Login'));
+ }
+
+ function redirectHome()
+ {
+
+ }
+
+}
diff --git a/actions/facebooksettings.php b/actions/facebooksettings.php
index e40496c187..236460c1c9 100644
--- a/actions/facebooksettings.php
+++ b/actions/facebooksettings.php
@@ -132,7 +132,7 @@ class FacebooksettingsAction extends FacebookAction
$this->elementStart('ul', array('id' => 'fb-permissions-list'));
$this->elementStart('li', array('id' => 'fb-permissions-item'));
$this->elementStart('fb:prompt-permission', array('perms' => 'status_update',
- 'next_fbjs' => 'document.setLocation(\'' . "$this->app_url/settings.php" . '\')'));
+ 'next_fbjs' => 'document.setLocation(\'' . "$this->app_uri/settings.php" . '\')'));
$this->element('span', array('class' => 'facebook-button'),
sprintf(_('Allow %s to update my Facebook status'), common_config('site', 'name')));
$this->elementEnd('fb:prompt-permission');
diff --git a/doc/groups b/doc/groups
new file mode 100644
index 0000000000..645390e0c8
--- /dev/null
+++ b/doc/groups
@@ -0,0 +1,42 @@
+Users on %%site.name%% can create *groups* that other users can join.
+Groups can be a great way to share information and entertainment with
+a group of people who have a common interest or background.
+
+You can find out about groups on the server on the
+[Groups](%%action.groups%%) page. You can join a group by clicking on
+the "Join" button either in the group list or on the group's home page.
+
+Starting a new group
+--------------------
+
+If you want, you can start a new group for friends and people with
+common interests. Note that all groups are free for anyone to join.
+
+To start a new group, use the [new group](%%action.newgroup%%) tool
+and fill out the form. Describe your group as best you can if you want
+people to be able to find it.
+
+When choosing the nickname for your group, try to keep it short. The
+nickname is included in every message to and from the group, so the
+less chars the better. Try using acronyms for organizations, or
+airport codes for places (like 'pdx' instead of 'portland').
+
+Sending messages to a group
+---------------------------
+
+You can send a message to a group using the syntax "!groupname"
+anywhere in the message. If you have more than one group named, the
+notice will go to each group. Only members can send notices to a
+group, and groups do not respond to direct messages (DMs).
+
+Receiving messages
+------------------
+
+New group messages will appear in your inbox, and will also come to
+your phone or IM client if you've set them up to receive notices.
+
+Remote groups
+-------------
+
+While it's technically possible, this version of Laconica does not
+support remote group membership.
diff --git a/doc/help b/doc/help
index 5b60072e26..a8cfccd2b3 100644
--- a/doc/help
+++ b/doc/help
@@ -23,6 +23,9 @@ Here are some documents that you might find helpful in understanding
* [FAQ](%%doc.faq%%) - frequently-asked questions about %%site.name%%
* [Contact](%%doc.contact%%) - who to contact with questions about the service
* [IM](%%doc.im%%) - using the instant-message (IM) features of %%site.name%%
+* [SMS](%%doc.sms%%) - tying your cellphone to %%site.name%%
+* [tags](%%doc.tags%%) - different ways to use tagging
+* [Groups](%%doc.groups%%) - joining together in groups
* [OpenID](%%doc.openid%%) - what OpenID is and how to use it with this service
* [OpenMicroBlogging](%%doc.openmublog%%) - subscribing to remote users
* [Privacy](%%doc.privacy%%) - %%site.name%%'s privacy policy
diff --git a/doc/sms b/doc/sms
new file mode 100644
index 0000000000..1beb49786d
--- /dev/null
+++ b/doc/sms
@@ -0,0 +1,68 @@
+You can post messages to %%site.name%% using a many kinds of cell
+phones that support SMS messaging. This site does not support SMS
+directly; rather, it uses your carrier's email gateway to send and
+receive messages.
+
+Managing your SMS settings
+--------------------------
+
+Use the [SMS settings](%%action.smssettings%%) page to set your SMS
+preferences. You can add or change your SMS number and set the
+flags for SMS updates.
+
+When you add or change your phone number, you'll receive a message on your
+phone with a verification code. Enter it into the SMS settings page to
+confirm that the owner of the phone authorizes sending it messages.
+
+Note that only the carriers listed in the drop down list on the form
+are supported by %%site.name%%. They're the only ones we know how to
+make email addresses for.
+
+Receiving messages
+------------------
+
+Once you've verified your phone number, you can enable sending
+messages to your phone. If you have a lot of friends and a typical
+phone, it can be hard to keep up.
+
+Sending messages
+----------------
+
+To send a message, you must send an email to the incoming email
+address visible on your SMS settings page. The method for sending
+email from your phone varies from carrier to carrier and from handset
+to handet; if in doubt, ask your carrier.
+
+Keep your incoming email address a secret -- it's the only way we know
+you're really you!
+
+Commands
+--------
+
+You can use the following commands with %%site.name%%.
+
+* on - turn on notifications
+* off - turn off notifications
+* help - show this help
+* follow - subscribe to user
+* leave - unsubscribe from user
+* d - direct message to user
+* get - get last notice from user
+* whois - get profile info on user
+* fav - add user's last notice as a 'fave'
+* stats - get your stats
+* stop - same as 'off'
+* quit - same as 'off'
+* sub - same as 'follow'
+* unsub - same as 'leave'
+* last - same as 'get'
+* on - not yet implemented.
+* off - not yet implemented.
+* nudge - not yet implemented.
+* invite - not yet implemented.
+* track - not yet implemented.
+* untrack - not yet implemented.
+* track off - not yet implemented.
+* untrack all - not yet implemented.
+* tracks - not yet implemented.
+* tracking - not yet implemented.
diff --git a/doc/tags b/doc/tags
new file mode 100644
index 0000000000..2ed352e701
--- /dev/null
+++ b/doc/tags
@@ -0,0 +1,40 @@
+%%site.name%% supports
+[tags](http://en.wikipedia.org/wiki/Tag_(metadata)) to help you
+organize your activities here. You can use tags for people and for
+notices.
+
+Tagging a notice
+----------------
+
+You can tag a notice using a *hashtag*; a # character followed by
+letters and numbers as well as '.', '-', and '_'. Note that accented
+latin characters are not supported, and non-roman scripts are right out.
+
+The HTML for the notice will link to a stream of all the other notices
+with that tag. This can be a great way to keep track of a conversation.
+
+The most popular current tags on the site can be found in the [public
+tag cloud](%%action.publictagcloud%%). Their size shows their
+popularity and recency.
+
+Tagging yourself
+----------------
+
+You can also add tags for yourself on your [profile
+settings](%%action.profilesettings%%) page. Use single words to
+describe yourself, your experiences and your interest. The tags will
+become links on your profile page to a list of all the users on the
+site who use that same tag. It can be a nice way to find people who
+are related to you geographically or who have a common interest.
+
+Tagging your subscriptions
+--------------------------
+
+You can also tag your subscriptions, on the subscriptions page. This
+makes it easy to organize your subscriptions into groups and sort
+through them separately.
+
+You can also send a notice "to the attention of" everyone you've
+marked with a particular tag (note: *not* people who've marked
+themselves with that tag). "@#family hello" will send a notice to
+everyone you've marked with the tag 'family'.
\ No newline at end of file
diff --git a/htaccess.sample b/htaccess.sample
index f187395ec8..d94652bfd1 100644
--- a/htaccess.sample
+++ b/htaccess.sample
@@ -21,6 +21,9 @@ RewriteRule ^doc/openid$ index.php?action=doc&title=openid [L,QSA]
RewriteRule ^doc/openmublog$ index.php?action=doc&title=openmublog [L,QSA]
RewriteRule ^doc/privacy$ index.php?action=doc&title=privacy [L,QSA]
RewriteRule ^doc/source$ index.php?action=doc&title=source [L,QSA]
+RewriteRule ^doc/tags$ index.php?action=doc&title=tags [L,QSA]
+RewriteRule ^doc/groups$ index.php?action=doc&title=groups [L,QSA]
+RewriteRule ^doc/sms$ index.php?action=doc&title=sms [L,QSA]
RewriteRule ^facebook/$ index.php?action=facebookhome [L,QSA]
RewriteRule ^facebook/index.php$ index.php?action=facebookhome [L,QSA]
diff --git a/lib/action.php b/lib/action.php
index bf053424f1..8f02b36bf5 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -156,10 +156,6 @@ class Action extends HTMLOutputter // lawsuit
'type' => 'text/css',
'href' => theme_path('css/display.css', 'base') . '?version=' . LACONICA_VERSION,
'media' => 'screen, projection, tv'));
- $this->element('link', array('rel' => 'stylesheet',
- 'type' => 'text/css',
- 'href' => theme_path('css/thickbox.css', 'base') . '?version=' . LACONICA_VERSION,
- 'media' => 'screen, projection, tv'));
$this->element('link', array('rel' => 'stylesheet',
'type' => 'text/css',
'href' => theme_path('css/display.css', null) . '?version=' . LACONICA_VERSION,
diff --git a/lib/facebookaction.php b/lib/facebookaction.php
index a20e618d3a..2dbe159708 100644
--- a/lib/facebookaction.php
+++ b/lib/facebookaction.php
@@ -68,6 +68,8 @@ class FacebookAction extends Action
$this->fbuid = $flink->foreign_id;
$this->user = $flink->getUser();
}
+
+ $this->args = array();
}
function prepare($argarray)
diff --git a/lib/facebookutil.php b/lib/facebookutil.php
index 81737e4d53..a2a2d7cb1b 100644
--- a/lib/facebookutil.php
+++ b/lib/facebookutil.php
@@ -57,7 +57,7 @@ function getFacebookBaseCSS()
{
# Add a timestamp to the CSS file so Facebook cache wont ignore our changes
$ts = filemtime(INSTALLDIR.'/theme/base/css/facebookapp.base.css');
- $cssurl = INSTALLDIR.'/theme/base/css/facebookapp.base.css' . "?ts=$ts";
+ $cssurl = theme_path('css/facebookapp.base.css', 'base') . "?ts=$ts";
return $cssurl;
}
diff --git a/scripts/update_facebook.php b/scripts/update_facebook.php
index 1574b9e09e..d2c1c3ffb9 100755
--- a/scripts/update_facebook.php
+++ b/scripts/update_facebook.php
@@ -34,7 +34,7 @@ require_once INSTALLDIR . '/lib/facebookutil.php';
$last_updated_file = INSTALLDIR . '/scripts/facebook_last_updated';
// Lock file name
-$tmp_file = "/tmp/update_facebook.lock";
+$tmp_file = INSTALLDIR . '/scripts/update_facebook.lock';
// Make sure only one copy of the script is running at a time
if (!($tmp_file = @fopen($tmp_file, "w")))
diff --git a/theme/base/css/display.css b/theme/base/css/display.css
index b4f3ffd54a..1769dc1c13 100644
--- a/theme/base/css/display.css
+++ b/theme/base/css/display.css
@@ -226,7 +226,7 @@ position:absolute;
right:0;
top:49px;
float:right;
-width:322px;
+width:300px;
}
#page_notice {
clear:both;
@@ -371,7 +371,7 @@ border-radius:7px;
#content_inner {
position:relative;
width:100%;
-float;left;
+float:left;
}
#aside_primary {
diff --git a/theme/default/css/display.css b/theme/default/css/display.css
index 2b71b07196..c68b0a3c44 100644
--- a/theme/default/css/display.css
+++ b/theme/default/css/display.css
@@ -1,8 +1,16 @@
-/* theme: identica */
+/** theme: default
+ *
+ * @package Laconica
+ * @author Sarven Capadisli
+ * @copyright 2009 Control Yourself, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ */
+
html,
body,
a:active {
-background-color:#CEE1E9;
+background-color:#97BFD1;
}
body {
font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
@@ -18,14 +26,17 @@ display:none;
input, textarea, select, option {
font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
}
-input, textarea, select {
+input, textarea, select,
+.entity_remote_subscribe {
border-color:#aaa;
}
+
input.submit,
#form_notice.warning #notice_text-count,
#nav_register a,
-.form_settings .form_note {
+.form_settings .form_note,
+.entity_remote_subscribe {
background-color:#A9BF4F;
}
@@ -34,35 +45,47 @@ input:focus, textarea:focus, select:focus,
border-color:#A9BF4F;
}
input.submit,
-#nav_register a {
-color:#F5FDFD;
+#nav_register a,
+.entity_remote_subscribe {
+color:#fff;
}
a,
-div.notice-options input {
+div.notice-options input,
+.form_user_block input.submit,
+.form_user_unblock input.submit,
+#entity_send-a-message a,
+.form_user_nudge input.submit,
+#entity_nudge p {
color:#002E6E;
}
-.notice p.entry-content a:visited {
+.notice,
+.profile {
+border-top-color:#D1D9E4;
+}
+.section .notice,
+.section .profile {
+border-top-color:#97BFD1;
+}
+
+
+#content .notice p.entry-content a:visited {
background-color:#fcfcfc;
}
-.notice p.entry-content .vcard a {
+#content .notice p.entry-content .vcard a {
background-color:#fcfffc;
}
-#aside_primary,
-#user_subscribe a,
-#TB_window input.submit,
-.form_user_subscribe input.submit {
-background-color:#fff;
+#aside_primary {
+background-color:#CEE1E9;
}
#notice_text-count {
color:#333;
}
-#form_notice.warning #notice_text-count,
-#user_actions a {
+#form_notice.warning #notice_text-count {
color:#000;
}
@@ -81,11 +104,11 @@ padding:2px 4px;
#content,
#site_nav_local_views a {
-border-color:#F5FDFD;
+border-color:#fff;
}
#content,
#site_nav_local_views .current a {
-background-color:#F5FDFD;
+background-color:#fff;
}
#site_nav_local_views a {
@@ -105,6 +128,20 @@ background-color:#F7E8E8;
background-color:#EFF3DC;
}
+
+#anon_notice {
+background-color:#97BFD1;
+color:#fff;
+border-color:#fff;
+}
+
+#showstream #anon_notice {
+background-color:#A9BF4F;
+}
+
+
+
+
#export_data li a {
background-repeat:no-repeat;
background-position:0 45%;
@@ -123,32 +160,41 @@ background-image:url(../../base/images/icons/icon_vcard.gif);
}
-/*user_actions*/
-#user_actions li {
-border-top-color:#eee;
-}
-#user_subscribe a,
-#TB_window input.submit,
-.form_user_subscribe input.submit {
-background-image: url(../images/icons/twotone/green/shield.gif);
-background-position: 0 45%;
+#entity_send-a-message a,
+.form_user_nudge input.submit,
+.form_user_block input.submit,
+.form_user_unblock input.submit,
+#entity_nudge p {
+background-position: 0 40%;
background-repeat: no-repeat;
+background-color:transparent;
}
+.form_group_join input.submit,
+.form_group_leave input.submit
+.form_user_subscribe input.submit,
.form_user_unsubscribe input.submit {
-background-color:#647819;
-color:#F5FDFD;
+background-color:#A9BF4F;
+color:#fff;
}
-#user_send-a-message a {
-background:url(../images/icons/twotone/green/quote.gif) 0 45% no-repeat;
+.form_user_unsubscribe input.submit,
+.form_group_leave input.submit {
+background-color:#97BFD1;
}
+
+#entity_send-a-message a {
+background-image:url(../images/icons/twotone/green/quote.gif);
+}
+#entity_nudge p,
.form_user_nudge input.submit {
-background:url(../images/icons/twotone/green/mail.gif) 0 45% no-repeat;
+background-image:url(../images/icons/twotone/green/mail.gif);
}
-.form_user_block input.submit {
-background:url(../images/icons/twotone/green/against.gif) 0 45% no-repeat;
+.form_user_block input.submit,
+.form_user_unblock input.submit {
+background-image:url(../images/icons/twotone/green/shield.gif);
}
+
/* NOTICES */
.notices li.over {
background-color:#fcfcfc;
@@ -195,9 +241,11 @@ background:transparent url(../images/icons/twotone/green/disfavourite.gif) no-re
background:transparent url(../images/icons/twotone/green/trash.gif) no-repeat 0 45%;
}
-div.notice-options {
-opacity:0.3;
+.notices div.entry-content,
+.notices div.notice-options {
+opacity:0.4;
}
+.notices li.hover div.entry-content,
.notices li.hover div.notice-options {
opacity:1;
}
@@ -214,6 +262,10 @@ background-color:#fcfcfc;
/*END: NOTICES */
+#groups #new_group a {
+background:transparent url(../images/icons/twotone/green/news.gif) no-repeat 0 45%;
+}
+
.pagination .nav_prev a,
.pagination .nav_next a {
@@ -227,19 +279,3 @@ background-position:0 45%;
background-image:url(../images/icons/twotone/green/arrow-right.gif);
background-position:100% 45%;
}
-
-
-
-#home #intro #guide_steps li a {
-border-color:#ccc;
-color:#F5FDFD;
-}
-#home #intro #step_join-now a {
-background-color:#f00;
-}
-#home #intro #step_start-a-group a {
-background-color:#0f0;
-}
-#home #intro #step_create-a-community a {
-background-color:#00f;
-}
\ No newline at end of file