]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch 'master' of /var/www/trunk
authorEvan Prodromou <evan@controlyourself.ca>
Mon, 19 Jan 2009 13:35:17 +0000 (13:35 +0000)
committerEvan Prodromou <evan@controlyourself.ca>
Mon, 19 Jan 2009 13:35:17 +0000 (13:35 +0000)
Conflicts:

actions/facebookhome.php
actions/facebooksettings.php

actions/facebookhome.php
actions/facebookinvite.php
actions/facebookremove.php
actions/facebooksettings.php
js/facebookapp.js [new file with mode: 0644]
lib/facebookaction.php
lib/facebookutil.php
scripts/update_facebook.php
theme/base/css/facebookapp.base.css [new file with mode: 0644]
theme/identica/css/facebookapp.theme.css [new file with mode: 0644]
theme/identica/facebookapp.css [deleted file]

index d2ac7617d1c76d0848bb4df0ab9e17c66a835781..ae29ee1f841feb508807ae4eda4babd854aae0f2 100644 (file)
@@ -19,7 +19,7 @@
 
 if (!defined('LACONICA')) { exit(1); }
 
-require_once(INSTALLDIR.'/lib/facebookaction.php');
+require_once INSTALLDIR.'/lib/facebookaction.php';
 
 class FacebookhomeAction extends FacebookAction
 {
@@ -34,9 +34,43 @@ class FacebookhomeAction extends FacebookAction
         // Check to see whether there's already a Facebook link for this user
         $flink = Foreign_link::getByForeignID($fbuid, FACEBOOK_SERVICE);
 
+        // 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')) {
+            $facebook->api_client->data_setUserPreference(
+                FACEBOOK_PROMPTED_UPDATE_PREF, 'true');
+        }
+
         if ($flink) {
+
+            if ($_POST['submit'] == 'Send') {
+                $this->saveNewNotice($flink);
+                return;
+            }
+
+            $user = $flink->getUser();
+            common_set_user($user);
+
+            // If this is the first time the user has started the app
+            // prompt for Facebook status update permission
+            if (!$facebook->api_client->users_hasAppPermission('status_update')) {
+
+                if ($facebook->api_client->data_getUserPreference(
+                        FACEBOOK_PROMPTED_UPDATE_PREF) != 'true') {
+                    $this->getUpdatePermission();
+                    return;
+                }
+            }
+
+            // Use is authenticated and has already been prompted once for
+            // Facebook status update permission? Then show the main page
+            // of the app
             $this->showHome($flink, null);
+
         } else {
+
+            // User hasn't authenticated yet, prompt for creds
             $this->login($fbuid);
         }
 
@@ -71,8 +105,10 @@ class FacebookhomeAction extends FacebookAction
                 // XXX: Do some error handling here
 
                 $this->setDefaults();
+                //$this->showHome($flink, _('You can now use Identi.ca from Facebook!'));
 
-                $this->showHome($flink, _('You can now use Identi.ca from Facebook!'));
+                $this->getUpdatePermission();
+                return;
 
             } else {
                 $msg = _('Incorrect username or password.');
@@ -80,6 +116,7 @@ class FacebookhomeAction extends FacebookAction
         }
 
         $this->showLoginForm($msg);
+
     }
 
     function setDefaults()
@@ -87,7 +124,10 @@ class FacebookhomeAction extends FacebookAction
         $facebook = get_facebook();
 
         // A default prefix string for notices
-        $facebook->api_client->data_setUserPreference(1, 'dented: ');
+        $facebook->api_client->data_setUserPreference(
+            FACEBOOK_NOTICE_PREFIX, 'dented: ');
+        $facebook->api_client->data_setUserPreference(
+            FACEBOOK_PROMPTED_UPDATE_PREF, 'false');
     }
 
     function showHome($flink, $msg)
@@ -101,19 +141,16 @@ class FacebookhomeAction extends FacebookAction
         $notice = $user->getCurrentNotice();
         update_profile_box($facebook, $fbuid, $user, $notice);
 
+        $this->showHeader($msg);
+        $this->showNoticeForm($user);
+        $this->showNav('Home');
 
-        $this->show_header('Home');
+        echo $this->showNotices($user);
 
-        if ($msg) {
-            $this->element('fb:success', array('message' => $msg));
-        }
-
-        echo $this->show_notices($user);
-
-        $this->show_footer();
+        $this->showFooter();
     }
 
-    function show_notices($user)
+    function showNotices($user)
     {
 
         $page = $this->trimmed('page');
@@ -123,16 +160,113 @@ class FacebookhomeAction extends FacebookAction
 
         $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
-        $cnt = $this->show_notice_list($notice);
+        $cnt = $this->showNoticeList($notice);
 
-        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                          $page, 'all', array('nickname' => $user->nickname));
+        facebookPagination($page > 1, $cnt > NOTICES_PER_PAGE,
+            $page, 'all', array('nickname' => $user->nickname));
     }
 
-    function show_notice_list($notice)
+    function showNoticeList($notice)
     {
-        $nl = new NoticeList($notice);
+        $nl = new FacebookNoticeList($notice);
         return $nl->show();
     }
 
+    function getUpdatePermission() {
+
+        $facebook = get_facebook();
+        $fbuid = $facebook->require_login();
+
+        startFBML();
+
+        $this->showStylesheets();
+        $this->showScripts();
+
+        $this->showLogo();
+
+        common_element_start('div', array('class' => 'content'));
+
+        // Figure what the URL of our app is.
+        $app_props = $facebook->api_client->Admin_getAppProperties(
+                array('canvas_name', 'application_name'));
+        $app_url = 'http://apps.facebook.com/' . $app_props['canvas_name'] . '/index.php';
+        $app_name = $app_props['application_name'];
+
+        $instructions = sprintf(_('If you would like the %s app to automatically update ' .
+            'your Facebook status with your latest notice, you need ' .
+            'to give it permission.'), $app_name);
+
+        common_element_start('p');
+        common_element('span', array('id' => 'permissions_notice'), $instructions);
+        common_element_end('p');
+
+        common_element_start('form', array('method' => 'post',
+                                           'action' => $app_url,
+                                           'id' => 'facebook-skip-permissions'));
+
+        common_element_start('ul', array('id' => 'fb-permissions-list'));
+        common_element_start('li', array('id' => 'fb-permissions-item'));
+        common_element_start('fb:prompt-permission', array('perms' => 'status_update',
+            'next_fbjs' => 'document.setLocation(\'' . $app_url . '\')'));
+        common_element('span', array('class' => 'facebook-button'),
+            _('Allow Identi.ca to update my Facebook status'));
+        common_element_end('fb:prompt-permission');
+        common_element_end('li');
+
+        common_element_start('li', array('id' => 'fb-permissions-item'));
+        common_submit('skip', _('Skip'));
+        common_element_end('li');
+        common_element_end('ul');
+
+        common_element_end('form');
+        common_element_end('div');
+
+        common_end_xml();
+
+    }
+
+    function saveNewNotice($flink)
+    {
+
+        $user = $flink->getUser();
+
+        $content = $_POST['status_textarea'];
+
+        if (!$content) {
+            $this->showHome($flink, _('No content!'));
+            return;
+        } else {
+            $content_shortened = common_shorten_links($content);
+
+            if (mb_strlen($content_shortened) > 140) {
+                common_debug("Content = '$content_shortened'", __FILE__);
+                common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
+                $this->showHome($flink, _('That\'s too long. Max notice size is 140 chars.'));
+                return;
+            }
+        }
+
+        $inter = new CommandInterpreter();
+
+        $cmd = $inter->handle_command($user, $content_shortened);
+
+        if ($cmd) {
+            $cmd->execute(new WebChannel());
+            return;
+        }
+
+        $replyto = $this->trimmed('inreplyto');
+
+        $notice = Notice::saveNew($user->id, $content,
+            'Facebook', 1, ($replyto == 'false') ? null : $replyto);
+
+        if (is_string($notice)) {
+            $this->showHome($flink, 'Error!');
+            return;
+        }
+
+        common_broadcast_notice($notice);
+        $this->showHome($flink, 'Success!');
+    }
+
 }
index 103d5a5686fd721d30796b46fb5db86c751630ed..1e6f6496e0ae093d49e8f0b00623ede4559727b9 100644 (file)
@@ -41,7 +41,7 @@ class FacebookinviteAction extends FacebookAction
         $facebook = get_facebook();
         $fbuid = $facebook->require_login();
 
-        $this->show_header('Invite');
+        $this->showHeader('Invite');
 
         $this->element('h2', null, _('Thanks for inviting your friends to use Identi.ca!'));
         $this->element('p', null, _('Invitations have been sent to the following users:'));
@@ -60,7 +60,7 @@ class FacebookinviteAction extends FacebookAction
 
         $this->elementEnd("ul");
 
-        $this->show_footer();
+        $this->showFooter();
     }
 
     function showInviteForm()
@@ -69,7 +69,8 @@ class FacebookinviteAction extends FacebookAction
         $facebook = get_facebook();
         $fbuid = $facebook->require_login();
 
-        $this->show_header('Invite');
+        $this->showHeader();
+        $this->showNav('Invite');
 
         // Get a list of users who are already using the app for exclusion
         $exclude_ids = $facebook->api_client->friends_getAppUsers();
@@ -104,7 +105,7 @@ class FacebookinviteAction extends FacebookAction
 
         $this->elementEnd("ul");
 
-        $this->show_footer();
+        $this->showFooter();
 
     }
 
index d0a0dd9519bf869a7a0c2b93899e0ec5c461283e..376e12a2e9ddfb2d64ae8f282945197c86d567b3 100644 (file)
@@ -19,7 +19,7 @@
 
 if (!defined('LACONICA')) { exit(1); }
 
-require_once(INSTALLDIR.'/lib/facebookaction.php');
+require_once INSTALLDIR.'/lib/facebookaction.php';
 
 class FacebookremoveAction extends FacebookAction
 {
index 8b071353a7c748c11e9684c3f705f56d27411f03..bc034bc46d7a3e538fa60efd9b544e9e09f2a88d 100644 (file)
@@ -19,7 +19,7 @@
 
 if (!defined('LACONICA')) { exit(1); }
 
-require_once(INSTALLDIR.'/lib/facebookaction.php');
+require_once INSTALLDIR.'/lib/facebookaction.php';
 
 class FacebooksettingsAction extends FacebookAction
 {
@@ -29,13 +29,13 @@ class FacebooksettingsAction extends FacebookAction
         parent::handle($args);
 
         if ($this->arg('save')) {
-            $this->save_settings();
+            $this->saveSettings();
         } else {
-            $this->show_form();
+            $this->showForm();
         }
     }
 
-    function save_settings() {
+    function saveSettings() {
 
         $noticesync = $this->arg('noticesync');
         $replysync = $this->arg('replysync');
@@ -50,36 +50,25 @@ class FacebooksettingsAction extends FacebookAction
         $flink->set_flags($noticesync, $replysync, false);
         $result = $flink->update($original);
 
-        $facebook->api_client->data_setUserPreference(1, substr($prefix, 0, 128));
+        $facebook->api_client->data_setUserPreference(FACEBOOK_NOTICE_PREFIX,
+            substr($prefix, 0, 128));
 
         if ($result) {
-            $this->show_form('Sync preferences saved.', true);
+            $this->showForm('Sync preferences saved.', true);
         } else {
-            $this->show_form('There was a problem saving your sync preferences!');
+            $this->showForm('There was a problem saving your sync preferences!');
         }
     }
 
-    function show_form($msg = null, $success = false) {
+    function showForm($msg = null, $success = false) {
 
         $facebook = get_facebook();
         $fbuid = $facebook->require_login();
 
         $flink = Foreign_link::getByForeignID($fbuid, FACEBOOK_SERVICE);
 
-        $this->show_header('Settings', $msg, $success);
-
-        $this->elementStart('fb:if-section-not-added', array('section' => 'profile'));
-        $this->element('h2', null, _('Add an Identi.ca box to my profile'));
-        $this->elementStart('p');
-        $this->element('fb:add-section-button', array('section' => 'profile'));
-        $this->elementEnd('p');
-
-        $this->elementEnd('fb:if-section-not-added');
-        $this->elementStart('p');
-        $this->elementStart('fb:prompt-permission', array('perms' => 'status_update'));
-        $this->element('h2', null, _('Allow Identi.ca to update my Facebook status'));
-        $this->elementEnd('fb:prompt-permission');
-        $this->elementEnd('p');
+        $this->showHeader($msg, $success);
+        $this->showNav('Settings');
 
         if ($facebook->api_client->users_hasAppPermission('status_update')) {
 
@@ -91,13 +80,10 @@ class FacebooksettingsAction extends FacebookAction
             $this->checkbox('noticesync', _('Automatically update my Facebook status with my notices.'),
                                 ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : true);
 
-            $this->checkbox('replysync', _('Send local "@" replies to Facebook.'),
+            $this->checkbox('replysync', _('Send "@" replies to Facebook.'),
                              ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true);
 
-            // function $this->input($id, $label, $value=null,$instructions=null)
-
             $prefix = $facebook->api_client->data_getUserPreference(1);
-            
 
             $this->input('prefix', _('Prefix'),
                          ($prefix) ? $prefix : null,
@@ -106,9 +92,34 @@ class FacebooksettingsAction extends FacebookAction
 
             $this->elementEnd('form');
 
+        } else {
+
+            // Figure what the URL of our app is.
+            $app_props = $facebook->api_client->Admin_getAppProperties(
+                    array('canvas_name', 'application_name'));
+            $app_url = 'http://apps.facebook.com/' . $app_props['canvas_name'] . '/settings.php';
+            $app_name = $app_props['application_name'];
+
+            $instructions = sprintf(_('If you would like the %s app to automatically update ' .
+                'your Facebook status with your latest notice, you need ' .
+                'to give it permission.'), $app_name);
+
+            common_element_start('p');
+            common_element('span', array('id' => 'permissions_notice'), $instructions);
+            common_element_end('p');
+
+            common_element_start('ul', array('id' => 'fb-permissions-list'));
+            common_element_start('li', array('id' => 'fb-permissions-item'));
+            common_element_start('fb:prompt-permission', array('perms' => 'status_update',
+                'next_fbjs' => 'document.setLocation(\'' . $app_url . '\')'));
+            common_element('span', array('class' => 'facebook-button'),
+                _('Allow Identi.ca to update my Facebook status'));
+            common_element_end('fb:prompt-permission');
+            common_element_end('li');
+            common_element_end('ul');
         }
 
-        $this->show_footer();
+        $this->showFooter();
     }
 
 }
diff --git a/js/facebookapp.js b/js/facebookapp.js
new file mode 100644 (file)
index 0000000..c7e8d6a
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, 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/>.
+ */
\ No newline at end of file
index 3a00c71dd0108e72faf569edb23c98978d111786..cd43a2ccb98b17cb1f4c351ca005eb0a48c9fb57 100644 (file)
  * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('LACONICA')) { exit(1); }
+if (!defined('LACONICA')) {
+    exit(1);
+}
 
-require_once(INSTALLDIR.'/lib/facebookutil.php');
+require_once INSTALLDIR.'/lib/facebookutil.php';
 
 class FacebookAction extends Action
 {
@@ -29,33 +31,39 @@ class FacebookAction extends Action
         parent::handle($args);
     }
 
-    function show_header($selected = 'Home', $msg = null, $success = false)
-    {
+    function showLogo(){
 
-        start_fbml();
+        global $xw;
 
-        # Add a timestamp to the CSS file so Facebook cache wont ignore our changes
-        $ts = filemtime(theme_file('facebookapp.css'));
-        $cssurl = theme_path('facebookapp.css') . "?ts=$ts";
+        $this->showStylesheets();
+        $this->showScripts();
 
-        common_element('link', array('rel' => 'stylesheet',
-                                     'type' => 'text/css',
-                                     'href' => $cssurl));
+        common_element_start('a', array('class' => 'url home bookmark',
+                                            'href' => common_local_url('public')));
+        if (common_config('site', 'logo') || file_exists(theme_file('logo.png'))) {
+            common_element('img', array('class' => 'logo photo',
+                'src' => (common_config('site', 'logo')) ?
+                    common_config('site', 'logo') : theme_path('logo.png'),
+                'alt' => common_config('site', 'name')));
+        }
+
+        common_element('span', array('class' => 'fn org'), common_config('site', 'name'));
+        common_element_end('a');
+
+    }
 
-        common_element('fb:dashboard');
 
-        common_element_start('fb:tabs');
-        common_element('fb:tab-item', array('title' => 'Home',
-                                            'href' => 'index.php',
-                                            'selected' => ($selected == 'Home')));
-        common_element('fb:tab-item', array('title' => 'Invite',
-                                            'href' => 'invite.php',
-                                            'selected' => ($selected == 'Invite')));
-        common_element('fb:tab-item', array('title' => 'Settings',
-                                            'href' => 'settings.php',
-                                            'selected' => ($selected == 'Settings')));
-        common_element_end('fb:tabs');
+    function showHeader($msg = null, $success = false) 
+    {
+        startFBML();
 
+        common_element_start('fb:if-section-not-added', array('section' => 'profile'));
+        common_element_start('span', array('id' => 'add_to_profile'));
+        common_element('fb:add-section-button', array('section' => 'profile'));
+        common_element_end('span');
+        common_element_end('fb:if-section-not-added');
+        
+        $this->showLogo();
 
         if ($msg) {
             if ($success) {
@@ -65,47 +73,135 @@ class FacebookAction extends Action
             }
         }
 
-        common_element_start('div', 'main_body');
+        common_element_start('div', 'main_body');        
+        
+    }
+
+    function showNav($selected = 'Home')
+    {
+
+        common_element_start('dl', array("id" => 'site_nav_local_views'));
+        common_element('dt', null, _('Local Views'));
+        common_element_start('dd');
+
+        common_element_start('ul', array('class' => 'nav'));
+
+        common_element_start('li', array('class' =>
+            ($selected == 'Home') ? 'current' : 'facebook_home'));
+        common_element('a',
+            array('href' => 'index.php', 'title' => _('Home')), _('Home'));
+        common_element_end('li');
+
+        common_element_start('li',
+            array('class' =>
+                ($selected == 'Invite') ? 'current' : 'facebook_invite'));
+        common_element('a',
+            array('href' => 'invite.php', 'title' => _('Invite')), _('Invite'));
+        common_element_end('li');
+
+        common_element_start('li',
+            array('class' =>
+                ($selected == 'Settings') ? 'current' : 'facebook_settings'));
+        common_element('a',
+            array('href' => 'settings.php',
+                'title' => _('Settings')), _('Settings'));
+        common_element_end('li');
+
+        common_element_end('ul');
+
+        common_element_end('dd');
+        common_element_end('dl');
 
     }
 
-    function show_footer()
+    function showFooter()
     {
         common_element_end('div');
         common_end_xml();
     }
 
+
+    function showInstructions()
+    {
+        global $xw;
+
+        common_element_start('dl', array('class' => 'system_notice'));
+        common_element('dt', null, 'Page Notice');
+
+        $loginmsg_part1 = _('To use the %s Facebook Application you need to login ' .
+            'with your username and password. Don\'t have a username yet? ');
+
+        $loginmsg_part2 = _(' a new account.');
+
+        common_element_start('dd');
+        common_element_start('p');
+        common_text(sprintf($loginmsg_part1, common_config('site', 'name')));
+        common_element('a',
+            array('href' => common_local_url('register')), _('Register'));
+        common_text($loginmsg_part2);
+        common_element_end('dd');
+        common_element_end('dl');
+    }
+
+
+    function showStylesheets() 
+    {
+        global $xw;
+        
+        common_element('link', array('rel' => 'stylesheet',
+                                     'type' => 'text/css',
+                                     'href' => getFacebookBaseCSS()));
+
+        common_element('link', array('rel' => 'stylesheet',
+                                     'type' => 'text/css',
+                                     'href' => getFacebookThemeCSS()));
+    }
+    
+    function showScripts() 
+    {
+        global $xw;
+        
+        common_element('script', array('type' => 'text/javascript',
+                                       'src' => getFacebookJS()));
+        
+    }
+
     function showLoginForm($msg = null)
     {
-        start_fbml();
+        startFBML();
 
-        common_element_start('a', array('href' => 'http://identi.ca'));
-        common_element('img', array('src' => 'http://theme.identi.ca/identica/logo.png',
-                                    'alt' => 'Identi.ca',
-                                    'id' => 'logo'));
-        common_element_end('a');
+        $this->showStylesheets();
+        $this->showScripts();
+
+        $this->showLogo();
+
+        common_element_start('div', array('class' => 'content'));
+        common_element('h1', null, _('Login'));
 
         if ($msg) {
              common_element('fb:error', array('message' => $msg));
         }
 
-        common_element("h2", null,
-            _('To add the Identi.ca application, you need to log into your Identi.ca account.'));
+        $this->showInstructions();
 
+        common_element_start('div', array('id' => 'content_inner'));
 
-        common_element_start('div', array('class' => 'instructions'));
-        common_element_start('p');
-        common_raw('Login with your username and password. Don\'t have a username yet?'
-        .' <a href="http://identi.ca/main/register">Register</a> a new account.');
-        common_element_end('p');
-        common_element_end('div');
-
-        common_element_start('div', array('id' => 'content'));
         common_element_start('form', array('method' => 'post',
+                                               'class' => 'form_settings',
                                                'id' => 'login',
                                                'action' => 'index.php'));
+
+        common_element_start('fieldset');
+        common_element('legend', null, _('Login to site'));
+
+        common_element_start('ul', array('class' => 'form_datas'));
+        common_element_start('li');
         common_input('nickname', _('Nickname'));
+        common_element_end('li');
+        common_element_start('li');
         common_password('password', _('Password'));
+        common_element_end('li');
+        common_element_end('ul');
 
         common_submit('submit', _('Login'));
         common_element_end('form');
@@ -114,6 +210,7 @@ class FacebookAction extends Action
         common_element('a', array('href' => common_local_url('recoverpassword')),
                        _('Lost or forgotten password?'));
         common_element_end('p');
+
         common_element_end('div');
 
         common_end_xml();
@@ -121,4 +218,53 @@ class FacebookAction extends Action
     }
 
 
+    function showNoticeForm($user) 
+    {
+    
+        global $xw;
+
+        common_element_start('form', array('id' => 'form_notice',
+                                           'method' => 'post',
+                                           'action' => 'index.php'));
+
+        common_element_start('fieldset');
+        common_element('legend', null, 'Send a notice');
+
+        common_element_start('ul', 'form_datas');
+        common_element_start('li', array('id' => 'noticcommon_elemente_text'));
+        common_element('label', array('for' => 'notice_data-text'),
+                            sprintf(_('What\'s up, %s?'), $user->nickname));
+
+        common_element('textarea', array('id' => 'notice_data-text',
+                                              'cols' => 35,
+                                              'rows' => 4,
+                                              'name' => 'status_textarea'));
+        common_element_end('li');
+        common_element_end('ul');
+
+        common_element_start('dl', 'form_note');
+        common_element('dt', null, _('Available characters'));
+        common_element('dd', array('id' => 'notice_text-count'),
+                            '140');
+        common_element_end('dl');
+
+        common_element_start('ul', array('class' => 'form_actions'));
+
+        common_element_start('li', array('id' => 'notice_submit'));
+        
+        common_submit('submit', _('Send'));
+        
+        /*
+        common_element('input', array('id' => 'notice_action-submit',
+                                           'class' => 'submit',
+                                           'name' => 'status_submit',
+                                           'type' => 'submit',
+                                           'value' => _('Send')));
+        */
+        common_element_end('li');
+        common_element_end('ul');    
+        common_element_end('fieldset');    
+        common_element_end('form');
+    }
+
 }
index 2529b8a4b8c6a9369be94dfb1ad9fee578a510de..a133ce8ba5dd987814fb068a6ba6e189fb08b219 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-require_once(INSTALLDIR.'/extlib/facebook/facebook.php');
-require_once(INSTALLDIR.'/lib/noticelist.php');
+require_once INSTALLDIR.'/extlib/facebook/facebook.php';
+require_once INSTALLDIR.'/lib/noticelist.php';
 
 define("FACEBOOK_SERVICE", 2); // Facebook is foreign_service ID 2
+define("FACEBOOK_NOTICE_PREFIX", 1);
+define("FACEBOOK_PROMPTED_UPDATE_PREF", 2);
 
 // Gets all the notices from users with a Facebook link since a given ID
 function get_facebook_notices($since)
@@ -42,7 +44,7 @@ function get_facebook()
     return new Facebook($apikey, $secret);
 }
 
-function start_fbml($indent = true)
+function startFBML($indent = true)
 {
     global $xw;
     $xw = new XMLWriter();
@@ -94,7 +96,7 @@ function update_profile_box($facebook, $fbuid, $user, $notice)
     $xw = new XMLWriter();
     $xw->openMemory();
 
-    $item = new NoticeListItem($notice);
+    $item = new FacebookNoticeListItem($notice);
     $item->show();
 
     $fbml = "<fb:wide>$style " . $xw->outputMemory(false) . "</fb:wide>";
@@ -104,3 +106,182 @@ function update_profile_box($facebook, $fbuid, $user, $notice)
 
     $facebook->api_client->profile_setFBML(null, $fbuid, $fbml, null, null, $fbml_main);
 }
+
+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";
+    return $cssurl;
+}
+
+function getFacebookThemeCSS() 
+{
+    # Add a timestamp to the CSS file so Facebook cache wont ignore our changes
+    $ts = filemtime(theme_file('css/facebookapp.theme.css'));
+    $cssurl = theme_path('css/facebookapp.theme.css') . "?ts=$ts";
+    return $cssurl;   
+}
+
+function getFacebookJS() {
+
+    # Add a timestamp to the FBJS file so Facebook cache wont ignore our changes
+    $ts = filemtime(INSTALLDIR.'/js/facebookapp.js');
+    $jsurl = common_path('js/facebookapp.js') . "?ts=$ts";
+    return $jsurl;
+}
+
+
+// Does a little before-after block for next/prev page
+
+function facebookPagination($have_before, $have_after, $page, $action, $args=null)
+{
+
+    if ($have_before || $have_after) {
+        common_element_start('div', array('id' => 'pagination'));
+        common_element_start('ul', array('id' => 'nav_pagination'));
+    }
+
+    if ($have_before) {
+        $pargs = array('page' => $page-1);
+        $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
+
+        common_element_start('li', 'before');
+        common_element('a', array('href' => "index.php?page=$newargs[page]", 'rel' => 'prev'),
+                       _('« After'));
+        common_element_end('li');
+    }
+
+    if ($have_after) {
+        $pargs = array('page' => $page+1);
+        $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
+        common_element_start('li', 'after');
+        common_element('a', array('href' => "index.php?page=$newargs[page]", 'rel' => 'next'),
+                       _('Before Â»'));
+        common_element_end('li');
+    }
+
+    if ($have_before || $have_after) {
+        common_element_end('ul');
+        common_element_end('div');
+    }
+}
+
+
+class FacebookNoticeList extends NoticeList
+{
+    /**
+     * show the list of notices
+     *
+     * "Uses up" the stream by looping through it. So, probably can't
+     * be called twice on the same list.
+     *
+     * @return int count of notices listed.
+     */
+
+    function show()
+    {
+        common_element_start('div', array('id' =>'notices_primary'));
+        common_element('h2', null, _('Notices'));
+        common_element_start('ul', array('class' => 'notices'));
+
+        $cnt = 0;
+
+        while ($this->notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
+            $cnt++;
+
+            if ($cnt > NOTICES_PER_PAGE) {
+                break;
+            }
+
+            $item = $this->newListItem($this->notice);
+            $item->show();
+        }
+
+        common_element_end('ul');
+        common_element_end('div');
+
+        return $cnt;
+    }
+
+    /**
+     * returns a new list item for the current notice
+     *
+     * Overridden to return a Facebook specific list item.
+     *
+     * @param Notice $notice the current notice
+     *
+     * @return FacebookNoticeListItem a list item for displaying the notice
+     * formatted for display in the Facebook App.
+     */
+
+    function newListItem($notice)
+    {
+        return new FacebookNoticeListItem($notice);
+    }
+
+}
+
+class FacebookNoticeListItem extends NoticeListItem
+{
+    /**
+     * recipe function for displaying a single notice in the Facebook App.
+     *
+     * Overridden to strip out some of the controls that we don't
+     * want to be available.
+     *
+     * @return void
+     */
+
+    function show()
+    {
+        $this->showStart();
+
+        common_element_start('div', 'entry-title');
+        $this->showAuthor();
+        $this->showContent();
+        common_element_end('div');
+
+        common_element_start('div', 'entry-content');
+        $this->showNoticeLink();
+        $this->showNoticeSource();
+        $this->showReplyTo();
+        common_element_end('div');
+
+        $this->showEnd();
+    }
+
+    function showStart()
+    {
+        // XXX: RDFa
+        // TODO: add notice_type class e.g., notice_video, notice_image
+        common_element_start('li', array('class' => 'hentry notice',
+                                         'id' => 'notice-' . $this->notice->id));
+    }
+
+    function showNoticeLink()
+    {
+        $noticeurl = common_local_url('shownotice',
+                                      array('notice' => $this->notice->id));
+        // XXX: we need to figure this out better. Is this right?
+        if (strcmp($this->notice->uri, $noticeurl) != 0 &&
+            preg_match('/^http/', $this->notice->uri)) {
+            $noticeurl = $this->notice->uri;
+        }
+
+        common_element_start('dl', 'timestamp');
+        common_element('dt', null, _('Published'));
+        common_element_start('dd', null);
+        common_element_start('a', array('rel' => 'bookmark',
+                                        'href' => $noticeurl));
+        $dt = common_date_iso8601($this->notice->created);
+        common_element('abbr', array('class' => 'published',
+                                     'title' => $dt),
+        common_date_string($this->notice->created));
+        common_element_end('a');
+        common_element_end('dd');
+        common_element_end('dl');
+    }
+
+}
+
index 8c91df384b215dd2f97803a1a6f1fc1de86ba6eb..0c54cec7cfd87cf6907479e29b6bb1c0f596ae70 100755 (executable)
@@ -67,9 +67,13 @@ while($notice->fetch()) {
         // If it's not a reply, or if the user WANTS to send replies...
         if (!preg_match('/@[a-zA-Z0-9_]{1,15}\b/u', $content) ||
             (($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) == FOREIGN_NOTICE_SEND_REPLY)) {
-                update_status($fbuid, $content);
-                update_profile_box($facebook, $fbuid, $user, $notice);
-                $cnt++;
+             
+                // Avoid a Loop
+                if ($notice->source != 'Facebook') {
+                    update_status($fbuid, $content);
+                    update_profile_box($facebook, $fbuid, $user, $notice);
+                    $cnt++;
+                }
             }
     }
 }
diff --git a/theme/base/css/facebookapp.base.css b/theme/base/css/facebookapp.base.css
new file mode 100644 (file)
index 0000000..eb7b47a
--- /dev/null
@@ -0,0 +1,285 @@
+/* theme: identica */
+html {
+background-color:#ddd;
+}
+body {
+font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+font-size:1em;
+background-color:#ddd;
+}
+input, textarea, select, option {
+font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+}
+input, textarea, select {
+border-color:#aaa;
+}
+
+input:focus, textarea:focus, select:focus {
+border-color:#A9BF4F;
+}
+input.submit {
+background-color:#A9BF4F;
+color:#fff;
+}
+
+a {
+color:#002E6E;
+}
+a:active {
+background-color:#ddd;
+}
+.notice p.entry-content a:visited {
+background-color:#fcfcfc;
+border-radius:4px;
+-moz-border-radius:4px;
+-webkit-border-radius:4px;
+}
+.notice p.entry-content .vcard a {
+background-color:#fcfffc;
+border-radius:4px;
+-moz-border-radius:4px;
+-webkit-border-radius:4px;
+}
+
+
+
+#aside_primary {
+background-color:#CEE1E9;
+}
+
+#form_notice textarea {
+}
+
+#form_notice label {
+color:#88171A;
+}
+#notice_text-count {
+color:#333;
+}
+#form_notice.warning #notice_text-count {
+color:#000;
+background-color:#A9BF4F;
+}
+#form_notice.warning #notice_data-text {
+border-color:#A9BF4F;
+}
+
+#form_notice #notice_data-attach_view {
+background-image:url(../images/icons/twotone/green/paper-clip.gif);
+background-repeat:no-repeat;
+background-position:0 45%;
+background-color:transparent;
+}
+
+
+#site_nav_global_primary a {
+}
+#form_notice .form_actions input.submit {
+}
+#nav_register a {
+background-color:#A9BF4F;
+color:#fff;
+text-decoration:none;
+font-weight:bold;
+padding:2px 4px;
+
+}
+#nav_login a {
+}
+
+
+#site_nav_local_views a {
+border-color:#fff;
+background-color:rgba(255, 255, 255, 0.2);
+}
+#site_nav_local_views a:hover {
+background-color:rgba(255, 255, 255, 0.7);
+}
+
+
+#content,
+#site_nav_local_views .current a {
+background-color:#fff;
+}
+
+
+#page_notice .error {
+background-color:#F7E8E8;
+}
+#page_notice .success {
+background-color:#EFF3DC;
+}
+
+#export_data li a {
+background-repeat:no-repeat;
+background-position:0 45%;
+}
+#export_data li a.rss {
+background-image:url(../../base/images/icons/icon_rss.jpg);
+}
+#export_data li a.atom {
+background-image:url(../../base/images/icons/icon_atom.jpg);
+}
+#export_data li a.foaf {
+background-image:url(../../base/images/icons/icon_foaf.gif);
+}
+#export_data li a.export_vcard {
+background-image:url(../../base/images/icons/icon_vcard.gif);
+}
+
+
+/*user_actions*/
+#user_actions li {
+border-top-color:#eee;
+}
+#user_actions a {
+color:#000;
+}
+#user_subscribe a,
+#TB_window input.submit,
+.form_user_subscribe input.submit {
+background:#CEE1E9 url(../images/icons/twotone/green/shield.gif) 0 45% no-repeat;
+}
+.form_user_unsubscribe input.submit {
+background-color:#647819;
+color:#fff;
+}
+#user_send-a-message a {
+background:url(../images/icons/twotone/green/quote.gif) 0 45% no-repeat;
+}
+.form_user_nudge input.submit {
+background:url(../images/icons/twotone/green/mail.gif) 0 45% no-repeat;
+}
+.form_user_block input.submit {
+background:url(../images/icons/twotone/green/against.gif) 0 45% no-repeat;
+}
+
+
+.user_tags .mark_hash {
+color:#555;
+}
+
+
+
+.vcard .fn {
+}
+.vcard .fn:hover {
+}
+
+
+
+
+/* NOTICES */
+.notices li.over {
+background-color:#fcfcfc;
+}
+
+
+.notice div.entry-content a {
+
+}
+.notice div.entry-content a:hover {
+}
+
+
+.notice-data a span {
+background-color:transparent;
+background-repeat:no-repeat;
+background-position:0 45%;
+}
+.notice_video .notice-data a span {
+background-image:url(../images/icons/twotone/green/camera.gif);
+}
+.notice_audio .notice-data a span {
+background-image:url(../images/icons/twotone/green/music.gif);
+}
+.notice_image .notice-data a span {
+background-image:url(../images/icons/twotone/green/search.gif);
+}
+.notice_event .notice-data a span {
+background-image:url(../images/icons/twotone/green/calendar.gif);
+}
+.notice_location .notice-data a span {
+background-image:url(../images/icons/twotone/green/flag.gif);
+}
+.notice_document .notice-data a span {
+background-image:url(../images/icons/twotone/green/document.gif);
+}
+
+.notice-options .notice_reply a,
+.notice-options form input.submit {
+background-color:transparent;
+}
+.notice-options .notice_reply a {
+background:transparent url(../images/icons/twotone/green/reply.gif) no-repeat 0 45%;
+}
+.notice-options form.form_favor input.submit {
+background:transparent url(../images/icons/twotone/green/favourite.gif) no-repeat 0 45%;
+}
+.notice-options form.form_disfavor input.submit {
+background:transparent url(../images/icons/twotone/green/disfavourite.gif) no-repeat 0 45%;
+}
+.notice-options .notice_delete a {
+background:transparent url(../images/icons/twotone/green/trash.gif) no-repeat 0 45%;
+}
+
+div.notice-options {
+opacity:0.3;
+}
+
+div.entry-content {
+color:#333;
+}
+div.notice-options a,
+div.notice-options input {
+font-family:sans-serif;
+}
+div.notice-options input {
+color:#002E6E;
+
+}
+.notices li.hover {
+background-color:#fcfcfc;
+}
+.notices li.hover div.entry-content,
+.notices li.hover div.notice-options {
+opacity:1;
+}
+
+.form_settings .form_note {
+background-color:#A9BF4F;
+}
+
+/*END: NOTICES */
+
+
+
+.pagination .nav_prev a,
+.pagination .nav_next a {
+background-repeat:no-repeat;
+}
+.pagination .nav_prev a {
+background-image:url(../images/icons/twotone/green/arrow-left.gif);
+background-position:0 45%;
+}
+.pagination .nav_next a {
+background-image:url(../images/icons/twotone/green/arrow-right.gif);
+background-position:100% 45%;
+}
+
+
+
+#home #intro #guide_steps li a {
+border-color:#ccc;
+color:#fff;
+}
+#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;
+}
+
diff --git a/theme/identica/css/facebookapp.theme.css b/theme/identica/css/facebookapp.theme.css
new file mode 100644 (file)
index 0000000..716f325
--- /dev/null
@@ -0,0 +1,1177 @@
+/* theme: base */
+* { margin:0; padding:0; }
+img { display:block; border:0; }
+a abbr { cursor: pointer; border-bottom:0; }
+table { border-collapse:collapse; }
+ol { list-style-position:inside; }
+html { font-size: 87.5%; background-color:#fff; height:100%; }
+body {
+background-color:#fff;
+color:#000;
+font-family:sans-serif;
+font-size:1em;
+line-height:1.65;
+position:relative;
+margin:0 auto;
+width:1004px;
+width:71.714em;
+}
+h1,h2,h3,h4,h5,h6 {
+       text-transform:uppercase;
+       margin-bottom:7px;
+}
+h1 {
+font-size:1.4em;
+line-height:1;
+margin-bottom:18px;
+}
+h2 { font-size:1.3em; }
+h3 { font-size:1.2em; }
+h4 { font-size:1.1em; }
+h5 { font-size:1em; }
+h6 { font-size:0.9em; }
+
+caption {
+font-weight:bold;
+}
+.opened { display: block !important;}
+.closed { display: none !important;}
+
+legend {
+font-weight:bold; 
+font-size:1.3em;
+text-transform:uppercase;
+}
+form {
+}
+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;
+}
+textarea {
+overflow:auto;
+}
+select, 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;
+/*margin:0 0 11px 0;*/
+}
+form ul li input {
+}
+
+input.checkbox {
+position:relative;
+top:2px;
+left:0;
+border:0;
+}
+
+#page_notice .error,
+#page_notice .success {
+padding:4px 7px;
+border-radius:4px;
+-moz-border-radius:4px;
+-webkit-border-radius:4px;
+}
+form label.submit {
+display:none;
+}
+.form_settings input.remove {
+margin-left:11px;
+}
+
+
+
+
+/* FORM SETTINGS */
+.form_settings fieldset {
+margin-bottom:29px;
+}
+
+.form_guide {
+font-style:italic;
+}
+
+
+.form_settings .form_datas li {
+width:100%;
+float:left;
+}
+
+.form_settings .form_datas label {
+float:left;
+}
+.form_settings .form_datas textarea,
+.form_settings .form_datas select,
+.form_settings .form_datas input {
+margin-left:11px;
+float:left;
+}
+
+.form_settings label {
+margin-top:2px;
+width:152px;
+}
+
+.form_actions label {
+display:none;
+}
+
+.form_settings #settings_autosubscribe label {
+display:inline;
+font-weight:bold;
+}
+
+#form_settings_profile legend,
+#form_login legend,
+#form_register legend {
+display:none;
+}
+
+.form_settings .form_datas p.form_guide {
+clear:both;
+margin-left:163px;
+margin-bottom:0;
+}
+
+.form_settings p {
+margin-bottom:11px;
+}
+
+.form_settings input.checkbox {
+margin-top:3px;
+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 {
+margin-left:0;
+}
+
+
+.form_settings .form_note {
+border-radius:4px;
+-moz-border-radius:4px;
+-webkit-border-radius:4px;
+padding:0 7px;
+}
+
+/* FORM SETTINGS */
+
+
+
+
+address {
+float:left;
+margin-bottom:18px;
+margin-left:18px;
+}
+address .fn,
+address .email {
+display:none;
+}
+
+
+
+#header {
+width:100%;
+position:relative;
+float:left;
+padding-top:18px;
+margin-bottom:29px;
+}
+
+#site_nav_global_primary {
+float:right;
+margin-right:18px;
+}
+#site_nav_global_primary ul li {
+display:inline;
+margin-left:11px;
+}
+
+
+.system_notice dt {
+font-weight:bold;
+text-transform:uppercase;
+display:none;
+}
+
+#site_notice {
+position:absolute;
+right:0;
+top:49px;
+float:right;
+width:322px;
+}
+#page_notice {
+clear:both;
+margin-bottom:18px;
+}
+
+
+
+
+#footer {
+float:left;
+width:64%;
+padding:18px;
+}
+
+
+
+#site_nav_local_views {
+width:100%;
+float:left;
+}
+#site_nav_local_views dt {
+display:none;
+}
+#site_nav_local_views li {
+float:left;
+margin-right:18px;
+list-style-type:none;
+}
+#site_nav_local_views a {
+float:left;
+text-decoration:none;
+padding:4px 11px;
+-moz-border-radius-topleft:4px;
+-moz-border-radius-topright:4px;
+-webkit-border-top-left-radius:4px;
+-webkit-border-top-right-radius:4px;
+border-width:1px;
+border-style:solid;
+border-bottom:0;
+text-shadow: 4px 4px 4px #ddd;
+font-weight:bold;
+}
+#site_nav_local_views .nav {
+float:left;
+width:100%;
+}
+
+
+#site_nav_global_primary dt,
+#site_nav_global_secondary dt {
+display:none;
+}
+/*
+#site_nav_global_primary .current a {
+font-weight:bold;
+border-style:solid;
+}
+*/
+#site_nav_global_secondary {
+margin-bottom:11px;
+}
+
+#site_nav_global_secondary ul li {
+display:inline;
+margin-right:11px;
+}
+#export_data li a {
+padding-left:20px;
+}
+#export_data li a.foaf {
+padding-left:30px;
+}
+#export_data li a.export_vcard {
+padding-left:28px;
+}
+
+
+
+#export_data ul {
+display:inline;
+}
+#export_data li {
+list-style-type:none;
+display:inline;
+margin-left:11px;
+}
+#export_data li:first-child {
+margin-left:0;
+}
+
+
+
+#licenses {
+font-size:0.9em;
+}
+
+#licenses dt {
+font-weight:bold;
+display:none;
+}
+#licenses dd {
+margin-bottom:11px;
+line-height:1.5;
+}
+
+#site_content_license_cc {
+margin-bottom:0;
+}
+#site_content_license_cc img {
+display:inline;
+vertical-align:top;
+margin-right:4px;
+}
+
+
+#wrap {
+       float:left;
+       margin:0 auto;
+    width:1004px;
+    width:71.714em;
+}
+
+
+#core {
+position:relative;
+width:100%;
+float:left;
+margin-bottom:1em;
+}
+
+#content {
+width:644px;
+padding:18px;
+float:left;
+border-radius:7px;
+-moz-border-radius:7px;
+-moz-border-radius-topleft:0;
+-webkit-border-radius:7px;
+-webkit-border-top-left-radius:0;
+}
+
+#content_inner {
+position:relative;
+width:100%;
+float;left;
+}
+
+#aside_primary {
+width:300px;
+float:left;
+margin-left:2px;
+padding:18px 4px 18px 18px;
+border-radius:7px;
+-moz-border-radius:7px;
+-webkit-border-radius:7px;
+}
+
+
+
+
+/*Start: FORM NOTICE*/
+#form_notice {
+width:384px;
+width:458px;
+float:left;
+margin-left:68px;
+position:relative;
+line-height:1;
+}
+#form_notice fieldset {
+border:0;
+padding:0;
+}
+#form_notice legend {
+display:none;
+}
+#form_notice textarea {
+border-radius:7px;
+-moz-border-radius:7px;
+-webkit-border-radius:7px;
+width:377px;
+width:370px;
+height:86px;
+line-height:1.5;
+padding:7px 7px 14px 7px;
+}
+#form_notice label {
+display:block;
+font-size:1.3em;
+margin-bottom:7px;
+}
+#form_notice .form_datas li {
+float:left;
+}
+
+#form_notice #notice_attach_file label,
+#form_notice #notice_submit label {
+display:none;
+}
+
+#form_notice #notice_attachment {
+margin-top:25px;
+margin-left:4px;
+}
+
+#form_notice .form_note {
+position:absolute;
+top:116px;
+right:98px;
+z-index:9;
+}
+
+#form_notice .form_note dt {
+font-weight:bold;
+display:none;
+}
+#notice_text-count {
+font-weight:bold;
+line-height:1.15;
+}
+
+#form_notice #notice_data-attach_view {
+/*position:absolute;*/
+top:25px;
+right:30px;
+margin-left:4px;
+padding:0;
+cursor:pointer;
+width:16px;
+height:16px;
+border:0;
+text-indent:-9999px;
+}
+#form_notice .form_actions {
+position:absolute;
+bottom:0;
+right:0;
+}
+#form_notice .form_actions input.submit {
+width:60px;
+padding:8px;
+}
+
+#form_notice li {
+margin-bottom:0;
+}
+/*end FORM NOTICE*/
+
+
+
+
+
+/* user_profile */
+#user_profile {
+position:relative;
+width:633px;
+min-height:123px;
+float:left;
+margin-bottom:17px;
+margin-left:0;
+}
+#user_profile dt,
+#user_statistics dt {
+font-weight:bold;
+}
+#user_profile .user_depiction {
+float:left;
+position:absolute;
+top:0;
+left:0;
+width:96px;
+}
+#user_profile .user_fn,
+#user_profile .user_nickname,
+#user_profile .user_location,
+#user_profile .user_url,
+#user_profile .user_note,
+#user_profile .user_tags {
+float:left;
+clear:left;
+margin-left:125px;
+width:322px;
+margin-bottom:4px;
+}
+
+#user_profile .user_fn,
+#user_profile .user_nickname {
+width:auto;
+clear:none;
+}
+#user_profile .user_nickname {
+margin-left:11px;
+}
+#user_profile .user_nickname .nickname {
+font-style:italic;
+font-weight:bold;
+margin-left:4px;
+margin-right:4px;
+}
+
+#user_profile .user_nickname dd:before {
+content: "(";
+}
+#user_profile .user_nickname dd:after {
+content: ")";
+}
+
+#user_profile dt {
+display:none;
+}
+#user_profile h2 {
+display:none;
+}
+/* user_profile */
+
+/*user_actions*/
+#user_actions {
+clear:left;
+float:left;
+position:absolute;
+top:0;
+right:0;
+}
+#user_actions h2 {
+display:none;
+}
+#user_actions ul {
+list-style-type:none;
+}
+#user_actions li {
+border-top-width:1px;
+border-top-style:dotted;
+}
+#user_actions li:first-child {
+border-top:0;
+}
+#user_actions fieldset {
+border:0;
+padding:0;
+}
+#user_actions legend {
+display:none;
+}
+
+#user_actions a,
+#user_actions input.submit {
+display:block;
+text-align:left;
+padding:4px 0 4px 19px;
+}
+#user_actions a {
+text-decoration:none;
+}
+#user_subscribe a,
+#TB_window input.submit,
+#user_actions input.submit {
+border:0;
+cursor:pointer;
+padding-left:16px;
+width:100%;
+font-size:0.9em;
+}
+
+#user_subscribe a {
+width:auto;
+padding-left:20px;
+}
+
+#user_subscribe a,
+#TB_window input.submit,
+.form_user_subscribe input.submit {
+font-weight:bold;
+}
+
+
+
+#user_send-a-message form {
+clear:left;
+width:322px;
+margin-top:18px;
+}
+
+#user_send-a-message textarea {
+width:96%;
+}
+
+.user_tags ul {
+list-style-type:none;
+}
+.user_tags li {
+display:inline;
+margin-right:1em;
+float:left;
+}
+
+
+
+.aside .section {
+margin-bottom:29px;
+clear:both;
+}
+.aside .section h2 {
+text-transform:uppercase;
+font-size:1em;
+}
+
+#user_statistics dt,
+#user_statistics dd {
+display:inline;
+}
+#user_statistics dt:after {
+content: ":";
+}
+
+
+#user_subscriptions,
+#user_subscriptions-common {
+float:left;
+}
+#user_subscriptions ul.users {
+width:220px;
+float:left;
+}
+#user_subscriptions .users li {
+list-style-type:none;
+float:left;
+margin-right:7px;
+margin-bottom:7px;
+}
+#user_subscriptions .users li .photo {
+width:24px;
+height:24px;
+margin-right:0;
+}
+#user_subscriptions .users li .fn {
+display:none;
+}
+.aside .section .more {
+clear:both;
+}
+
+
+
+
+
+/* NOTICE */
+.notice {
+position:relative;
+padding-top:18px;
+padding-bottom:18px;
+clear:both;
+float:left;
+width:644px;
+width:96.699%;
+width:100%;
+border-top:1px dashed #D1D9E4;
+/*-moz-border-radius:7px;*/
+}
+.notices li {
+list-style-type:none;
+/*margin-bottom:11px;*/
+}
+
+/* NOTICES */
+#notices_primary {
+float:left;
+width:644px;
+border-radius:7px;
+-moz-border-radius:7px;
+-webkit-border-radius:7px;
+}
+#notices_primary h2 {
+display:none;
+}
+.notice-data a span {
+display:block;
+padding-left:28px;
+}
+
+
+.notice .author {
+margin-right:11px;
+}
+.notice .author a {
+}
+.notice .author:after {
+/*content:":";*/
+}
+
+.vcard .photo {
+display:inline;
+margin-right:7px;
+margin-bottom:7px;
+float:left;
+}
+.vcard .url {
+text-decoration:none;
+}
+.vcard .url:hover {
+text-decoration:underline;
+}
+.vcard .fn {
+font-style:italic;
+}
+.vcard .fn:hover {
+
+}
+
+
+.notice .entry-title {
+float:left;
+width:100%;
+}
+.notice p.entry-content {
+display:inline;
+}
+
+.notice_video p.entry-content,
+.notice_audio p.entry-content,
+.notice_image p.entry-content,
+.notice_location p.entry-content,
+.notice_event p.entry-content,
+.notice_document p.entry-content {
+}
+#laconicat .notice p.entry-content {
+/*margin-left:199px;*/
+}
+.notice p.entry-content a {
+
+}
+.notice p.entry-content a:hover {
+
+}
+.notice p.entry-content .tag a {
+
+}
+.notice p.entry-content .tag a:hover {
+
+}
+
+
+.notice div.entry-content {
+/*border:1px solid blue;*/
+clear:left;
+float:left;
+width:48%;
+font-size:0.95em;
+}
+.notice div.entry-content a,
+.notice .notice-options a,
+.notice .notice-options input {
+
+}
+.notice .notice-options a,
+.notice .notice-options input {
+float:left;
+font-size:1.025em;
+}
+
+#laconicat .notice div.entry-content {
+/*margin-left:0;*/
+}
+
+.notice div.entry-content dl,
+.notice div.entry-content dt,
+.notice div.entry-content dd {
+display:inline;
+}
+.notice div.entry-content .timestamp dt,
+.notice div.entry-content .response dt {
+display:none;
+}
+.notice div.entry-content .timestamp a {
+display:inline-block;
+}
+.notice div.entry-content .device dt {
+text-transform:lowercase;
+}
+.notice div.entry-content a {
+
+}
+.notice div.entry-content a:hover {
+}
+
+
+
+.notice-data {
+position:absolute;
+top:18px;
+right:0;
+min-height:50px;
+margin-bottom:4px;
+}
+.notice .entry-content .notice-data dt {
+display:none;
+}
+
+.notice-data a {
+display:block;
+outline:none;
+}
+
+.notice-options {
+padding-left:2%;
+float:left;
+width:50%;
+position:relative;
+font-size:0.95em;
+}
+
+.notice-options a {
+float:left;
+}
+.notice-options .notice_delete,
+.notice-options .notice_reply,
+.notice-options .form_favor,
+.notice-options .form_disfavor {
+position:absolute;
+top:0;
+}
+.notice-options .form_favor,
+.notice-options .form_disfavor {
+left:0;
+}
+.notice-options .notice_reply {
+left:29px;
+}
+.notice-options .notice_delete {
+left:76px;
+}
+.notice-options .notice_reply dt {
+display:none;
+}
+
+.notice-options input,
+.notice-options a {
+text-indent:-9999px;
+outline:none;
+}
+
+.notice-options .notice_reply a,
+.notice-options form input.submit {
+display:block;
+border:0;
+}
+.notice-options .notice_reply a,
+.notice-options .notice_delete a {
+text-decoration:none;
+padding-left:16px;
+}
+
+.notice-options .notice_delete {
+
+}
+
+.notice-options form input.submit {
+cursor:pointer;
+width:16px;
+padding:2px 0;
+}
+
+.notice-options .notice_delete dt,
+.notice-options .form_favor legend,
+.notice-options .form_disfavor legend {
+display:none;
+}
+.notice-options .notice_delete fieldset,
+.notice-options .form_favor fieldset,
+.notice-options .form_disfavor fieldset {
+border:0;
+padding:0;
+}
+
+/*END: NOTICES */
+
+
+
+
+
+.pagination dt {
+font-weight:bold;
+display:none;
+}
+
+.pagination .nav {
+float:left;
+width:100%;
+list-style-type:none;
+}
+
+.pagination .nav_prev {
+float:left;
+}
+.pagination .nav_next {
+float:right;
+}
+
+.pagination a {
+display:block;
+text-decoration:none;
+font-weight:bold;
+padding:7px;
+border:1px dotted #D1D9E4;
+border-bottom:0;
+}
+
+.pagination .nav_prev a {
+-moz-border-radius-topright:7px;
+-webkit-border-top-right-radius:7px;
+padding-left:20px;
+border-left:0;
+}
+.pagination .nav_next a {
+-moz-border-radius-topleft:7px;
+-webkit-border-top-left-radius:7px;
+padding-right:20px;
+border-right:0;
+}
+
+
+/* END: NOTICE */
+
+
+
+
+
+
+
+/*START: LOAD ALONG WITH JS*/
+.notice .in-reply-to {
+       width:98%;
+       margin-left:2%;
+}
+.notice .in-reply-to li {
+background-color:#F7F9FB;
+}
+.notice .in-reply-to li .in-reply-to li {
+background-color:#E4E9F0;
+}
+.notice .in-reply-to li .in-reply-to li .in-reply-to li {
+background-color:#D1D9E4;
+}
+
+
+
+#user_actions #user_subscribe .form_note,
+#user_actions #user_subscribe .form_datas,
+#user_actions #user_subscribe .form_actions label {
+display:none;
+}
+#form_user-relationship .form_note,
+#form_user-relationship .form_datas,
+#form_user-relationship .form_actions label {
+display:block;
+}
+
+#user_actions #user-relationship_submit {
+margin-bottom:0;
+}
+#form_user-relationship .form_datas li label {
+margin-right:11px;
+}
+
+#user_relationship_xfn {
+/*z-index:1000;
+position:absolute;
+width:521px;
+height:322px;*/
+display:none;
+}
+#user_relationship_xfn fieldset {
+background-color:#fff;
+}
+
+/*END: LOAD ALONG WITH JS*/
+
+
+
+/* TOP_POSTERS */
+#top-posters caption {
+text-align:left;
+text-transform:uppercase;
+}
+
+#top-posters thead {
+display:none;
+}
+#top-poster_user {
+width:199px;
+}
+#top-poster_number-of-notices {
+width:123px;
+}
+#top-posters tbody td {
+padding-right:11px;
+padding-bottom:4px;
+}
+#top-posters img {
+margin-right:7px;
+height:24px;
+width:24px;
+}
+
+
+
+/* tagcloud */
+#tagcloud ul {
+list-style-type:none;
+}
+#tagcloud ul li {
+display:inline;
+margin-right:7px;
+line-height:1.4;
+}
+
+#tagcloud.section dt {
+text-transform:uppercase;
+font-weight:bold;
+}
+#tagcloud .weight_1 {
+font-size:1em;
+}
+#tagcloud .weight_2 {
+font-size:1.3em;
+}
+#tagcloud .weight_3 {
+font-size:1.6em;
+}
+#tagcloud .weight_4 {
+font-size:1.9em;
+}
+#tagcloud .weight_5 {
+font-size:2.2em;
+}
+
+
+
+#form_settings_photo .form_datas {
+clear:both;
+}
+
+
+
+
+#photo_original,
+#photo_preview {
+float:left;
+}
+#photo_preview,
+#settings_photo_action-crop {
+margin-left:29px;
+}
+#photo_preview_view {
+height:96px;
+width:96px;
+overflow:hidden;
+}
+
+
+
+
+.section .groups,
+#users_featured ul {
+list-style-type:none;
+}
+.section .groups li,
+#users_featured li {
+margin-top:11px;
+float:left;
+width:100%;
+}
+.section .groups li:first-child,
+#users_featured li:first-child {
+margin-top:0;
+}
+
+.section .groups .vcard,
+#users_featured .vcard {
+float:left;
+margin-bottom:-23px;
+}
+
+.section .groups dl,
+#users_featured dl {
+float:left;
+margin-left:63px;
+clear:left;
+}
+.section .groups dt,
+#users_featured dt {
+display:none;
+font-weight:bold;
+}
+
+
+
+#home.logged_out h1 {
+display:none;
+}
+
+#home #intro {
+margin-bottom:29px;
+float:left;
+width:100%;
+}
+
+#home #intro p {
+margin-bottom:18px;
+font-size:1.8em;
+}
+
+#home #intro #guide_steps {
+list-style-type:none;
+}
+#home #intro #guide_steps li {
+float:left;
+margin-left:18px;
+}
+#home #intro #guide_steps li:first-child {
+margin-left:0;
+}
+#home #intro #guide_steps li a {
+display:block;
+float:left;
+width:185px;
+height:109px;
+border-width:1px;
+border-style:dotted;
+text-decoration:none;
+border-radius:7px;
+-moz-border-radius:7px;
+-webkit-border-radius:7px;
+padding:7px;
+font-size:1.6em;
+font-weight:bold;
+text-align:center;
+}
+
+
+#testimonials {
+clear:both;
+}
diff --git a/theme/identica/facebookapp.css b/theme/identica/facebookapp.css
deleted file mode 100644 (file)
index b2bbbac..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-
-/* XXX: Most of this just copied out of display.css -- need to factor out what we really neeed -- Zach */
-
-body {
-    color: #193441;
-}
-
-a {
-color: #d1451a;
-text-decoration: none;
-}
-a:hover {
-text-decoration: underline;
-}
-img, img a {
-border: 0;
-}
-h1 {
-font-size: 14px;
-}
-
-#wrap {
-margin: 0 auto;
-padding: 0 20px;
-width: 760px;
-background: url(bg-header.gif) repeat-x #fbf2d7;
-}
-
-
-#notices {
-clear: both;
-margin: 0 auto;
-padding: 0;
-list-style-type: none;
-width: 600px;
-border-top: 1px solid #dec5b5;
-}
-#notices a:hover {
-text-decoration: underline;
-}
-.notice_single {
-clear: both;
-display: block;
-margin: 0;
-padding: 5px 5px 5px 0;
-min-height: 48px;
-font-family: Georgia, "Times New Roman", Times, serif;
-font-size: 13px;
-line-height: 16px;
-border-bottom: 1px solid #dec5b5;
-background-color:#FCFFF5;
-opacity:1;
-}
-.notice_single:hover {
-background-color: #f7ebcc;
-}
-.notice_single p {
-display: inline;
-margin: 0;
-padding: 0;
-}
-#notice_delete_form #confirmation_text {
-   display: block;
-font-size: 14px;
-font-weight: bold;
-}
-
-input#submit_yes, input#submit_no {
-margin: 18px 10px 0px 0px;
-padding: 4px;
-font-weight: bold;
-color: #fff6d5;
-background-color: #F60;
-cursor: pointer;
-border: 0;
-width: 40px;
-}
-input#submit_yes:hover, input#submit_no:hover {
-background-color: #701238;
-}
-.avatar.stream {
-float: left;
-margin: 0 10px 0.5em 0;
-}
-p.time {
-display: block;
-font-family: Verdana, Arial, Helvetica, sans-serif;
-font-size: 10px;
-line-height: 15px;
-}
-p.time a {
-color: #dab134;
-}
-
-
-/* ----- Forms General Style ----- */
-form {
-       margin: 0 auto;
-       padding: 0;
-       }
-form {
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 12px;
-       }
-form label {
-       display: block;
-       font-size: 12px;
-       font-weight: bold;
-       line-height: 18px;
-       }
-form input {
-       border: 1px solid #dec5b5;
-       width: 264px;
-       }
-input#submit, input.submit  {
-       display: block;
-       margin: 18px 0;
-       padding: 4px;
-       font-weight: bold;
-       color: #fff6d5;
-       background-color: #F60;
-       cursor: pointer;
-       border: 0;
-       width: auto;
-       }
-input#submit:hover, input.submit:hover {
-       background-color: #701238;
-       }
-input.checkbox {
-       /*width: 14px;
-       height: 14px;*/
-       width: auto;
-       border: 0;
-       }
-
-label.checkbox_label {
-    display: inline;
-    font-weight: normal;
-}
-
-textarea, input {
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       font-size: 12px;
-       color: #701238;
-       padding: 3px;
-       }
-textarea:focus, input:focus {
-       background-color: #f8ebc0;
-       }
-textarea {
-       width: 270px;
-       border: 1px solid #D8E2D7;
-       }
-.input_instructions {
-       margin-top: 3px;
-       display: block;
-       font-size: 11px;
-       line-height: 15px;
-       color: #924959;
-       font-family: Verdana, Arial, Helvetica, sans-serif;
-       }