]> git.mxchange.org Git - friendica-addons.git/commitdiff
Merge with main branch
authorTobias Hößl <tobias@hoessl.eu>
Tue, 17 Apr 2012 08:47:48 +0000 (08:47 +0000)
committerTobias Hößl <tobias@hoessl.eu>
Tue, 17 Apr 2012 08:47:48 +0000 (08:47 +0000)
29 files changed:
blogger.tgz [new file with mode: 0644]
blogger/blogger.css [new file with mode: 0755]
blogger/blogger.php [new file with mode: 0755]
convpath.tgz [new file with mode: 0644]
convpath/README [new file with mode: 0755]
convpath/convpath.php [new file with mode: 0644]
facebook.tgz
facebook/facebook.php
gravatar.tgz [new file with mode: 0644]
gravatar/README.md [new file with mode: 0644]
gravatar/admin.tpl [new file with mode: 0644]
gravatar/gravatar.php [new file with mode: 0644]
irc.tgz
irc/irc.css [new file with mode: 0644]
irc/irc.php
mathjax.tgz [new file with mode: 0644]
mathjax/README [new file with mode: 0644]
mathjax/admin.tpl [new file with mode: 0644]
mathjax/mathjax.php [new file with mode: 0644]
piwik.tgz
piwik/piwik.css
planets.tgz [new file with mode: 0644]
planets/planets.css [new file with mode: 0755]
planets/planets.php [new file with mode: 0755]
randplace.tgz
randplace/randplace.php
testdrive.tgz [new file with mode: 0644]
testdrive/README.md [new file with mode: 0644]
testdrive/testdrive.php [new file with mode: 0644]

diff --git a/blogger.tgz b/blogger.tgz
new file mode 100644 (file)
index 0000000..f30042f
Binary files /dev/null and b/blogger.tgz differ
diff --git a/blogger/blogger.css b/blogger/blogger.css
new file mode 100755 (executable)
index 0000000..4e2294e
--- /dev/null
@@ -0,0 +1,16 @@
+
+#blogger-enable-label, #blogger-username-label, #blogger-password-label, #blogger-bydefault-label {
+       float: left;
+       width: 200px;
+       margin-top: 10px;
+}
+
+#blogger-checkbox, #blogger-username, #blogger-password, #blogger-bydefault {
+       float: left;
+       margin-top: 10px;
+}
+
+#blogger-submit {
+       margin-top: 15px;
+}
+
diff --git a/blogger/blogger.php b/blogger/blogger.php
new file mode 100755 (executable)
index 0000000..5c9b439
--- /dev/null
@@ -0,0 +1,200 @@
+<?php
+
+/**
+ * Name: Blogger Post Connector
+ * Description: Post to Blogger (or anything else which uses blogger XMLRPC API)
+ * Version: 1.0
+ * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ */
+
+function blpost_install() {
+    register_hook('post_local',           'addon/blpost/blpost.php', 'blpost_post_local');
+    register_hook('notifier_normal',      'addon/blpost/blpost.php', 'blpost_send');
+    register_hook('jot_networks',         'addon/blpost/blpost.php', 'blpost_jot_nets');
+    register_hook('connector_settings',      'addon/blpost/blpost.php', 'blpost_settings');
+    register_hook('connector_settings_post', 'addon/blpost/blpost.php', 'blpost_settings_post');
+
+}
+function blpost_uninstall() {
+    unregister_hook('post_local',       'addon/blpost/blpost.php', 'blpost_post_local');
+    unregister_hook('notifier_normal',  'addon/blpost/blpost.php', 'blpost_send');
+    unregister_hook('jot_networks',     'addon/blpost/blpost.php', 'blpost_jot_nets');
+    unregister_hook('connector_settings',      'addon/blpost/blpost.php', 'blpost_settings');
+    unregister_hook('connector_settings_post', 'addon/blpost/blpost.php', 'blpost_settings_post');
+
+       // obsolete - remove
+    unregister_hook('post_local_end',   'addon/blpost/blpost.php', 'blpost_send');
+    unregister_hook('plugin_settings',  'addon/blpost/blpost.php', 'blpost_settings');
+    unregister_hook('plugin_settings_post',  'addon/blpost/blpost.php', 'blpost_settings_post');
+
+}
+
+
+function blpost_jot_nets(&$a,&$b) {
+    if(! local_user())
+        return;
+
+    $bl_post = get_pconfig(local_user(),'blpost','post');
+    if(intval($bl_post) == 1) {
+        $bl_defpost = get_pconfig(local_user(),'blpost','post_by_default');
+        $selected = ((intval($bl_defpost) == 1) ? ' checked="checked" ' : '');
+        $b .= '<div class="profile-jot-net"><input type="checkbox" name="blpost_enable" ' . $selected . ' value="1" /> '
+            . t('Post to blogger') . '</div>';
+    }
+}
+
+
+function blpost_settings(&$a,&$s) {
+
+    if(! local_user())
+        return;
+
+    /* Add our stylesheet to the page so we can make our settings look nice */
+
+    $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/blpost/blpost.css' . '" media="all" />' . "\r\n";
+
+    /* Get the current state of our config variables */
+
+    $enabled = get_pconfig(local_user(),'blpost','post');
+
+    $checked = (($enabled) ? ' checked="checked" ' : '');
+
+    $def_enabled = get_pconfig(local_user(),'blpost','post_by_default');
+
+    $def_checked = (($def_enabled) ? ' checked="checked" ' : '');
+
+       $bl_username = get_pconfig(local_user(), 'blpost', 'bl_username');
+       $bl_password = get_pconfig(local_user(), 'blpost', 'bl_password');
+       $bl_blog = get_pconfig(local_user(), 'blpost', 'bl_blog');
+
+
+    /* Add some HTML to the existing form */
+
+    $s .= '<div class="settings-block">';
+    $s .= '<h3>' . t('Blogger Post Settings') . '</h3>';
+    $s .= '<div id="blpost-enable-wrapper">';
+    $s .= '<label id="blpost-enable-label" for="blpost-checkbox">' . t('Enable Blogger Post Plugin') . '</label>';
+    $s .= '<input id="blpost-checkbox" type="checkbox" name="blpost" value="1" ' . $checked . '/>';
+    $s .= '</div><div class="clear"></div>';
+
+    $s .= '<div id="blpost-username-wrapper">';
+    $s .= '<label id="blpost-username-label" for="blpost-username">' . t('Blogger username') . '</label>';
+    $s .= '<input id="blpost-username" type="text" name="bl_username" value="' . $bl_username . '" />';
+    $s .= '</div><div class="clear"></div>';
+
+    $s .= '<div id="blpost-password-wrapper">';
+    $s .= '<label id="blpost-password-label" for="blpost-password">' . t('Blogger password') . '</label>';
+    $s .= '<input id="blpost-password" type="password" name="bl_password" value="' . $bl_password . '" />';
+    $s .= '</div><div class="clear"></div>';
+
+    $s .= '<div id="blpost-blog-wrapper">';
+    $s .= '<label id="blpost-blog-label" for="blpost-blog">' . t('Blogger API URL') . '</label>';
+    $s .= '<input id="blpost-blog" type="text" name="bl_blog" value="' . $bl_blog . '" />';
+    $s .= '</div><div class="clear"></div>';
+
+    $s .= '<div id="blpost-bydefault-wrapper">';
+    $s .= '<label id="blpost-bydefault-label" for="blpost-bydefault">' . t('Post to Blogger by default') . '</label>';
+    $s .= '<input id="blpost-bydefault" type="checkbox" name="bl_bydefault" value="1" ' . $def_checked . '/>';
+    $s .= '</div><div class="clear"></div>';
+
+    /* provide a submit button */
+
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blpost-submit" name="blpost-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
+
+}
+
+
+function blpost_settings_post(&$a,&$b) {
+
+       if(x($_POST,'blpost-submit')) {
+
+               set_pconfig(local_user(),'blpost','post',intval($_POST['blpost']));
+               set_pconfig(local_user(),'blpost','post_by_default',intval($_POST['bl_bydefault']));
+               set_pconfig(local_user(),'blpost','bl_username',trim($_POST['bl_username']));
+               set_pconfig(local_user(),'blpost','bl_password',trim($_POST['bl_password']));
+               set_pconfig(local_user(),'blpost','bl_blog',trim($_POST['bl_blog']));
+
+       }
+
+}
+
+function blpost_post_local(&$a,&$b) {
+
+       // This can probably be changed to allow editing by pointing to a different API endpoint
+
+       if($b['edit'])
+               return;
+
+       if((! local_user()) || (local_user() != $b['uid']))
+               return;
+
+       if($b['private'] || $b['parent'])
+               return;
+
+    $bl_post   = intval(get_pconfig(local_user(),'blpost','post'));
+
+       $bl_enable = (($bl_post && x($_REQUEST,'blpost_enable')) ? intval($_REQUEST['blpost_enable']) : 0);
+
+       if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'blpost','post_by_default')))
+               $bl_enable = 1;
+
+    if(! $bl_enable)
+       return;
+
+    if(strlen($b['postopts']))
+       $b['postopts'] .= ',';
+     $b['postopts'] .= 'blpost';
+}
+
+
+
+
+function blpost_send(&$a,&$b) {
+
+    if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
+        return;
+
+    if(! strstr($b['postopts'],'blpost'))
+        return;
+
+    if($b['parent'] != $b['id'])
+        return;
+
+
+       $bl_username = xmlify(get_pconfig($b['uid'],'blpost','bl_username'));
+       $bl_password = xmlify(get_pconfig($b['uid'],'blpost','bl_password'));
+       $bl_blog = get_pconfig($b['uid'],'blpost','bl_blog');
+
+       if($bl_username && $bl_password && $bl_blog) {
+
+               require_once('include/bbcode.php');
+
+               $title = '<title>' . (($b['title']) ? $b['title'] : t('Post from Friendica')) . '</title>';
+               $post = $title . bbcode($b['body']);
+               $post = xmlify($post);
+
+               $xml = <<< EOT
+<?xml version=\"1.0\" encoding=\"utf-8\"?>
+<methodCall>
+  <methodName>blogger.newPost</methodName>
+  <params>
+    <param><value><string/></value></param>
+    <param><value><string/></value></param>
+    <param><value><string>$bl_username</string></value></param>
+    <param><value><string>$bl_password</string></value></param>
+    <param><value><string>$post</string></value></param>
+    <param><value><int>1</int></value></param>
+  </params>
+</methodCall>
+
+EOT;
+
+               logger('blpost: data: ' . $xml, LOGGER_DATA);
+
+               if($bl_blog !== 'test')
+                       $x = post_url($bl_blog,$xml);
+               logger('posted to blogger: ' . (($x) ? $x : ''), LOGGER_DEBUG);
+
+       }
+}
+
diff --git a/convpath.tgz b/convpath.tgz
new file mode 100644 (file)
index 0000000..2c43d3d
Binary files /dev/null and b/convpath.tgz differ
diff --git a/convpath/README b/convpath/README
new file mode 100755 (executable)
index 0000000..9d1c307
--- /dev/null
@@ -0,0 +1,7 @@
+convpath
+
+This addon converts all internal paths according to the current scheme. 
+
+That means that if a page is called via https then all internal links are also converted into https.
+
+Same happens when you call your page with http.
diff --git a/convpath/convpath.php b/convpath/convpath.php
new file mode 100644 (file)
index 0000000..e5dc0b3
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Name: Convert Paths
+ * Description: Converts all internal paths according to the current scheme (http or https)
+ * Version: 1.0
+ * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
+ * 
+ */
+
+function convpath_install() {
+       register_hook('page_end', 'addon/convpath/convpath.php', 'convpath_page_end');
+       register_hook('page_header', 'addon/convpath/convpath.php', 'convpath_page_header');
+}
+
+
+function convpath_uninstall() {
+       unregister_hook('page_end', 'addon/convpath/convpath.php', 'convpath_page_end');
+       unregister_hook('page_header', 'addon/convpath/convpath.php', 'convpath_page_header');
+}
+
+function convpath_page_header(&$a, &$o){
+       $o = convpath_convert($o);
+}
+
+function convpath_page_end(&$a, &$o){
+       $o = convpath_convert($o);
+       $a->page['aside'] = convpath_convert($a->page['aside']);
+}
+
+/*
+Converts a given path according to the current scheme
+*/
+function convpath_convert($path) {
+       global $a;
+
+       if ($path == "")
+               return("");
+
+       $ssl = (substr($a->get_baseurl(), 0, 8) == "https://");
+
+       if ($ssl) {
+               $search = "http://".$a->get_hostname();
+               $replace = "https://".$a->get_hostname();
+       } else {
+               $search = "https://".$a->get_hostname();
+               $replace = "http://".$a->get_hostname();
+       }
+       $searcharr = array("src='".$search, 'src="'.$search);
+       $replacearr = array("src='".$replace, 'src="'.$replace);
+       $path = str_replace($searcharr, $replacearr, $path);
+
+       //$path = str_replace($search, $replace, $path);
+
+       return($path);
+}
index 563d39cc8f4965b8f54a60abcc1f2d9504958979..e3709ec48955c9965509593e6f21238148693d4e 100644 (file)
Binary files a/facebook.tgz and b/facebook.tgz differ
index 4e8866086f66a8d1746d948388c7c8eff7d3dd69..d681c4dc5d97c6b20a5732b9b38bf6aa0d9dfb35 100644 (file)
  * Detailed instructions how to use this plugin can be found at
  * https://github.com/friendica/friendica/wiki/How-to:-Friendica%E2%80%99s-Facebook-connector
  *
- * Vidoes and embeds will not be posted if there is no other content. Links
- * and images will be converted to a format suitable for the Facebook API and
- * long posts truncated - with a link to view the full post.
+ * Vidoes and embeds will not be posted if there is no other content. Links 
+ * and images will be converted to a format suitable for the Facebook API and 
+ * long posts truncated - with a link to view the full post. 
  *
  * Facebook contacts will not be able to view private photos, as they are not able to
- * authenticate to your site to establish identity. We will address this
+ * authenticate to your site to establish identity. We will address this 
  * in a future release.
  */
-
-/** TODO
+ /** TODO
  * - Implement a method for the administrator to delete all configuration data the plugin has created,
  *   e.g. the app_access_token
  */
@@ -34,30 +34,31 @@ define('FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL', 259200); // 3 days
 define('FACEBOOK_DEFAULT_POLL_INTERVAL', 60); // given in minutes
 define('FACEBOOK_MIN_POLL_INTERVAL', 5);
 
+require_once('include/security.php');
 
 function facebook_install() {
-    register_hook('post_local',       'addon/facebook/facebook.php', 'facebook_post_local');
-    register_hook('notifier_normal',  'addon/facebook/facebook.php', 'facebook_post_hook');
-    register_hook('jot_networks',     'addon/facebook/facebook.php', 'facebook_jot_nets');
-    register_hook('connector_settings',  'addon/facebook/facebook.php', 'facebook_plugin_settings');
-    register_hook('cron',             'addon/facebook/facebook.php', 'facebook_cron');
-    register_hook('enotify',          'addon/facebook/facebook.php', 'facebook_enotify');
-    register_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
+       register_hook('post_local',       'addon/facebook/facebook.php', 'facebook_post_local');
+       register_hook('notifier_normal',  'addon/facebook/facebook.php', 'facebook_post_hook');
+       register_hook('jot_networks',     'addon/facebook/facebook.php', 'facebook_jot_nets');
+       register_hook('connector_settings',  'addon/facebook/facebook.php', 'facebook_plugin_settings');
+       register_hook('cron',             'addon/facebook/facebook.php', 'facebook_cron');
+       register_hook('enotify',          'addon/facebook/facebook.php', 'facebook_enotify');
+       register_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
 }
 
 
 function facebook_uninstall() {
-    unregister_hook('post_local',       'addon/facebook/facebook.php', 'facebook_post_local');
-    unregister_hook('notifier_normal',  'addon/facebook/facebook.php', 'facebook_post_hook');
-    unregister_hook('jot_networks',     'addon/facebook/facebook.php', 'facebook_jot_nets');
-    unregister_hook('connector_settings',  'addon/facebook/facebook.php', 'facebook_plugin_settings');
-    unregister_hook('cron',             'addon/facebook/facebook.php', 'facebook_cron');
-    unregister_hook('enotify',          'addon/facebook/facebook.php', 'facebook_enotify');
-    unregister_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
-
-    // hook moved
-    unregister_hook('post_local_end',  'addon/facebook/facebook.php', 'facebook_post_hook');
-    unregister_hook('plugin_settings',  'addon/facebook/facebook.php', 'facebook_plugin_settings');
+       unregister_hook('post_local',       'addon/facebook/facebook.php', 'facebook_post_local');
+       unregister_hook('notifier_normal',  'addon/facebook/facebook.php', 'facebook_post_hook');
+       unregister_hook('jot_networks',     'addon/facebook/facebook.php', 'facebook_jot_nets');
+       unregister_hook('connector_settings',  'addon/facebook/facebook.php', 'facebook_plugin_settings');
+       unregister_hook('cron',             'addon/facebook/facebook.php', 'facebook_cron');
+       unregister_hook('enotify',          'addon/facebook/facebook.php', 'facebook_enotify');
+       unregister_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
+
+       // hook moved
+       unregister_hook('post_local_end',  'addon/facebook/facebook.php', 'facebook_post_hook');
+       unregister_hook('plugin_settings',  'addon/facebook/facebook.php', 'facebook_plugin_settings');
 }
 
 
@@ -70,153 +71,167 @@ function facebook_module() {}
 // If a->argv[1] is a nickname, this is a callback from Facebook oauth requests.
 // If $_REQUEST["realtime_cb"] is set, this is a callback from the Real-Time Updates API
 
+/**
+ * @param $a
+ * @return mixed
+ */
 function facebook_init(&$a) {
-
-    if (x($_REQUEST, "realtime_cb") && x($_REQUEST, "realtime_cb")) {
-        logger("facebook_init: Facebook Real-Time callback called", LOGGER_DEBUG);
-
-        if (x($_REQUEST, "hub_verify_token")) {
-            // this is the verification callback while registering for real time updates
-
-            $verify_token = get_config('facebook', 'cb_verify_token');
-            if ($verify_token != $_REQUEST["hub_verify_token"]) {
-                logger('facebook_init: Wrong Facebook Callback Verifier - expected ' . $verify_token . ', got ' . $_REQUEST["hub_verify_token"]);
-                return;
-            }
-
-            if (x($_REQUEST, "hub_challenge")) {
-                logger('facebook_init: Answering Challenge: ' . $_REQUEST["hub_challenge"], LOGGER_DATA);
-                echo $_REQUEST["hub_challenge"];
-                die();
-            }
-        }
-
-        require_once('include/items.php');
-
-        // this is a status update
-        $content = file_get_contents("php://input");
-        if (is_numeric($content)) $content = file_get_contents("php://input");
-        $js = json_decode($content);
-        logger(print_r($js, true), LOGGER_DATA);
-
-        if (!isset($js->object) || $js->object != "user" || !isset($js->entry)) {
-            logger('facebook_init: Could not parse Real-Time Update data', LOGGER_DEBUG);
-            return;
-        }
-
-        $affected_users = array("feed" => array(), "friends" => array());
-
-        foreach ($js->entry as $entry) {
-            $fbuser = $entry->uid;
-            foreach ($entry->changed_fields as $field) {
-                if (!isset($affected_users[$field])) {
-                    logger('facebook_init: Unknown field "' . $field . '"');
-                    continue;
-                }
-                if (in_array($fbuser, $affected_users[$field])) continue;
-
-                $r = q("SELECT `uid` FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'self_id' AND `v` = '%s' LIMIT 1", dbesc($fbuser));
-                if(! count($r))
-                    continue;
-                $uid = $r[0]['uid'];
-
-                $access_token = get_pconfig($uid,'facebook','access_token');
-                if(! $access_token)
-                    return;
-
-                switch ($field) {
-                    case "feed":
-                        logger('facebook_init: FB-User ' . $fbuser . ' / feed', LOGGER_DEBUG);
-
-                        if(! get_pconfig($uid,'facebook','no_wall')) {
-                            $private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
-                            $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
-                            if($s) {
-                                $j = json_decode($s);
-                                if (isset($j->data)) {
-                                    logger('facebook_init: wall: ' . print_r($j,true), LOGGER_DATA);
-                                    fb_consume_stream($uid,$j,($private_wall) ? false : true);
-                                } else {
-                                    logger('facebook_init: wall: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
-                                }
-                            }
-                        }
-
-                        break;
-                    case "friends":
-                        logger('facebook_init: FB-User ' . $fbuser . ' / friends', LOGGER_DEBUG);
-
-                        fb_get_friends($uid, false);
-                        set_pconfig($uid,'facebook','friend_check',time());
-                        break;
-                    default:
-                        logger('facebook_init: Unknown callback field for ' . $fbuser, LOGGER_NORMAL);
-                }
-                $affected_users[$field][] = $fbuser;
-            }
-        }
-    }
-
-
-    if($a->argc != 2)
-        return;
-    $nick = $a->argv[1];
-    if(strlen($nick))
-        $r = q("SELECT `uid` FROM `user` WHERE `nickname` = '%s' LIMIT 1",
-            dbesc($nick)
-        );
-    if(! count($r))
-        return;
-
-    $uid           = $r[0]['uid'];
-    $auth_code     = (x($_GET, 'code') ? $_GET['code'] : '');
-    $error         = (x($_GET, 'error_description') ? $_GET['error_description'] : '');
-
-    if($error)
-        logger('facebook_init: Error: ' . $error);
-
-    if($auth_code && $uid) {
-
-        $appid = get_config('facebook','appid');
-        $appsecret = get_config('facebook', 'appsecret');
-
-        $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id='
-            . $appid . '&client_secret=' . $appsecret . '&redirect_uri='
-            . urlencode($a->get_baseurl() . '/facebook/' . $nick)
-            . '&code=' . $auth_code);
-
-        logger('facebook_init: returned access token: ' . $x, LOGGER_DATA);
-
-        if(strpos($x,'access_token=') !== false) {
-            $token = str_replace('access_token=', '', $x);
-            if(strpos($token,'&') !== false)
-                $token = substr($token,0,strpos($token,'&'));
-            set_pconfig($uid,'facebook','access_token',$token);
-            set_pconfig($uid,'facebook','post','1');
-            if(get_pconfig($uid,'facebook','no_linking') === false)
-                set_pconfig($uid,'facebook','no_linking',1);
-            fb_get_self($uid);
-            fb_get_friends($uid, true);
-            fb_consume_all($uid);
-
-        }
-
-    }
+       
+       if (x($_REQUEST, "realtime_cb") && x($_REQUEST, "realtime_cb")) {
+               logger("facebook_init: Facebook Real-Time callback called", LOGGER_DEBUG);
+               
+               if (x($_REQUEST, "hub_verify_token")) {
+                       // this is the verification callback while registering for real time updates
+                       
+                       $verify_token = get_config('facebook', 'cb_verify_token');
+                       if ($verify_token != $_REQUEST["hub_verify_token"]) {
+                               logger('facebook_init: Wrong Facebook Callback Verifier - expected ' . $verify_token . ', got ' . $_REQUEST["hub_verify_token"]);
+                               return;
+                       }
+                       
+                       if (x($_REQUEST, "hub_challenge")) {
+                               logger('facebook_init: Answering Challenge: ' . $_REQUEST["hub_challenge"], LOGGER_DATA);
+                               echo $_REQUEST["hub_challenge"];
+                               die();
+                       }
+               }
+               
+               require_once('include/items.php');
+               
+               // this is a status update
+               $content = file_get_contents("php://input");
+               if (is_numeric($content)) $content = file_get_contents("php://input");
+               $js = json_decode($content);
+               logger(print_r($js, true), LOGGER_DATA);
+               
+               if (!isset($js->object) || $js->object != "user" || !isset($js->entry)) {
+                       logger('facebook_init: Could not parse Real-Time Update data', LOGGER_DEBUG);
+                       return;
+               }
+               
+               $affected_users = array("feed" => array(), "friends" => array());
+               
+               foreach ($js->entry as $entry) {
+                       $fbuser = $entry->uid;
+                       foreach ($entry->changed_fields as $field) {
+                               if (!isset($affected_users[$field])) {
+                                       logger('facebook_init: Unknown field "' . $field . '"');
+                                       continue;
+                               }
+                               if (in_array($fbuser, $affected_users[$field])) continue;
+                               
+                               $r = q("SELECT `uid` FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'self_id' AND `v` = '%s' LIMIT 1", dbesc($fbuser));
+                               if(! count($r))
+                                       continue;
+                               $uid = $r[0]['uid'];
+                               
+                               $access_token = get_pconfig($uid,'facebook','access_token');
+                               if(! $access_token)
+                                       return;
+                               
+                               switch ($field) {
+                                       case "feed":
+                                               logger('facebook_init: FB-User ' . $fbuser . ' / feed', LOGGER_DEBUG);
+                                               
+                                               if(! get_pconfig($uid,'facebook','no_wall')) {
+                                                       $private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
+                                                       $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
+                                                       if($s) {
+                                                               $j = json_decode($s);
+                                                               if (isset($j->data)) {
+                                                                       logger('facebook_init: wall: ' . print_r($j,true), LOGGER_DATA);
+                                                                       fb_consume_stream($uid,$j,($private_wall) ? false : true);
+                                                               } else {
+                                                                       logger('facebook_init: wall: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
+                                                               }
+                                                       }
+                                               }
+                                               
+                                       break;
+                                       case "friends":
+                                               logger('facebook_init: FB-User ' . $fbuser . ' / friends', LOGGER_DEBUG);
+                                               
+                                               fb_get_friends($uid, false);
+                                               set_pconfig($uid,'facebook','friend_check',time());
+                                       break;
+                                       default:
+                                               logger('facebook_init: Unknown callback field for ' . $fbuser, LOGGER_NORMAL);
+                               }
+                               $affected_users[$field][] = $fbuser;
+                       }
+               }
+       }
+
+       
+       if($a->argc != 2)
+               return;
+       $nick = $a->argv[1];
+       if(strlen($nick))
+               $r = q("SELECT `uid` FROM `user` WHERE `nickname` = '%s' LIMIT 1",
+                               dbesc($nick)
+               );
+       if(! count($r))
+               return;
+
+       $uid           = $r[0]['uid'];
+       $auth_code     = (x($_GET, 'code') ? $_GET['code'] : '');
+       $error         = (x($_GET, 'error_description') ? $_GET['error_description'] : '');
+
+
+       if($error)
+               logger('facebook_init: Error: ' . $error);
+
+       if($auth_code && $uid) {
+
+               $appid = get_config('facebook','appid');
+               $appsecret = get_config('facebook', 'appsecret');
+
+               $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id='
+                       . $appid . '&client_secret=' . $appsecret . '&redirect_uri='
+                       . urlencode($a->get_baseurl() . '/facebook/' . $nick) 
+                       . '&code=' . $auth_code);
+
+               logger('facebook_init: returned access token: ' . $x, LOGGER_DATA);
+
+               if(strpos($x,'access_token=') !== false) {
+                       $token = str_replace('access_token=', '', $x);
+                       if(strpos($token,'&') !== false)
+                               $token = substr($token,0,strpos($token,'&'));
+                       set_pconfig($uid,'facebook','access_token',$token);
+                       set_pconfig($uid,'facebook','post','1');
+                       if(get_pconfig($uid,'facebook','no_linking') === false)
+                               set_pconfig($uid,'facebook','no_linking',1);
+                       fb_get_self($uid);
+                       fb_get_friends($uid, true);
+                       fb_consume_all($uid);
+
+               }
+
+       }
 
 }
 
 
+/**
+ * @param $uid
+ * @return mixed
+ */
 function fb_get_self($uid) {
-    $access_token = get_pconfig($uid,'facebook','access_token');
-    if(! $access_token)
-        return;
-    $s = fetch_url('https://graph.facebook.com/me/?access_token=' . $access_token);
-    if($s) {
-        $j = json_decode($s);
-        set_pconfig($uid,'facebook','self_id',(string) $j->id);
-    }
+       $access_token = get_pconfig($uid,'facebook','access_token');
+       if(! $access_token)
+               return;
+       $s = fetch_url('https://graph.facebook.com/me/?access_token=' . $access_token);
+       if($s) {
+               $j = json_decode($s);
+               set_pconfig($uid,'facebook','self_id',(string) $j->id);
+       }
 }
 
+/**
+ * @param $uid
+ * @param $access_token
+ * @param $persons
+ */
 function fb_get_friends_sync_new($uid, $access_token, $persons) {
     $persons_todo = array();
     foreach ($persons as $person) {
@@ -236,6 +251,11 @@ function fb_get_friends_sync_new($uid, $access_token, $persons) {
     }
 }
 
+/**
+ * @param $uid
+ * @param $contact
+ * @return mixed
+ */
 function fb_get_friends_sync_parsecontact($uid, $contact) {
     $contact->link = 'http://facebook.com/profile.php?id=' . $contact->id;
 
@@ -259,14 +279,14 @@ function fb_get_friends_sync_parsecontact($uid, $contact) {
 
             $photos = import_profile_photo('https://graph.facebook.com/' . $contact->id . '/picture', $uid, $r[0]['id']);
 
-            $r = q("UPDATE `contact` SET `photo` = '%s', 
-                                       `thumb` = '%s',
-                                       `micro` = '%s', 
-                                       `name-date` = '%s', 
-                                       `uri-date` = '%s', 
-                                       `avatar-date` = '%s'
-                                       WHERE `id` = %d LIMIT 1
-                               ",
+            $r = q("UPDATE `contact` SET `photo` = '%s',
+                                        `thumb` = '%s',
+                                        `micro` = '%s',
+                                        `name-date` = '%s',
+                                        `uri-date` = '%s',
+                                        `avatar-date` = '%s'
+                                        WHERE `id` = %d LIMIT 1
+                                ",
                 dbesc($photos[0]),
                 dbesc($photos[1]),
                 dbesc($photos[2]),
@@ -280,11 +300,11 @@ function fb_get_friends_sync_parsecontact($uid, $contact) {
     }
     else {
 
-        // create contact record 
-        $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`, 
-                               `name`, `nick`, `photo`, `network`, `rel`, `priority`,
-                               `writable`, `blocked`, `readonly`, `pending` )
-                               VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
+        // create contact record
+        $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`,
+                                `name`, `nick`, `photo`, `network`, `rel`, `priority`,
+                                `writable`, `blocked`, `readonly`, `pending` )
+                                VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
             intval($uid),
             dbesc(datetime_convert()),
             dbesc($contact->link),
@@ -319,14 +339,14 @@ function fb_get_friends_sync_parsecontact($uid, $contact) {
 
     $photos = import_profile_photo($r[0]['photo'],$uid,$contact_id);
 
-    $r = q("UPDATE `contact` SET `photo` = '%s', 
-                       `thumb` = '%s',
-                       `micro` = '%s', 
-                       `name-date` = '%s', 
-                       `uri-date` = '%s', 
-                       `avatar-date` = '%s'
-                       WHERE `id` = %d LIMIT 1
-               ",
+    $r = q("UPDATE `contact` SET `photo` = '%s',
+                        `thumb` = '%s',
+                        `micro` = '%s',
+                        `name-date` = '%s',
+                        `uri-date` = '%s',
+                        `avatar-date` = '%s'
+                        WHERE `id` = %d LIMIT 1
+                ",
         dbesc($photos[0]),
         dbesc($photos[1]),
         dbesc($photos[2]),
@@ -337,6 +357,12 @@ function fb_get_friends_sync_parsecontact($uid, $contact) {
     );
 }
 
+/**
+ * @param $uid
+ * @param $access_token
+ * @param $persons
+ * @return mixed
+ */
 function fb_get_friends_sync_full($uid, $access_token, $persons) {
     if (count($persons) == 0) return;
     $nums = Ceil(count($persons) / 50);
@@ -355,1392 +381,1508 @@ function fb_get_friends_sync_full($uid, $access_token, $persons) {
     }
 }
 
-// if $fullsync is true, only new contacts are searched for
-
-function fb_get_friends($uid, $fullsync = true) {
 
-    $r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
-        intval($uid)
-    );
-    if(! count($r))
-        return;
 
-    $access_token = get_pconfig($uid,'facebook','access_token');
+// if $fullsync is true, only new contacts are searched for
 
-    $no_linking = get_pconfig($uid,'facebook','no_linking');
-    if($no_linking)
-        return;
+/**
+ * @param $uid
+ * @param bool $fullsync
+ * @return mixed
+ */
+function fb_get_friends($uid, $fullsync = true) {
 
-    if(! $access_token)
-        return;
-    $s = fetch_url('https://graph.facebook.com/me/friends?access_token=' . $access_token);
-    if($s) {
-        logger('facebook: fb_get_friends: ' . $s, LOGGER_DATA);
-        $j = json_decode($s);
-        logger('facebook: fb_get_friends: json: ' . print_r($j,true), LOGGER_DATA);
-        if(! $j->data)
-            return;
-
-        $persons_todo = array();
+       $r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
+               intval($uid)
+       );
+       if(! count($r))
+               return;
+
+       $access_token = get_pconfig($uid,'facebook','access_token');
+
+       $no_linking = get_pconfig($uid,'facebook','no_linking');
+       if($no_linking)
+               return;
+
+       if(! $access_token)
+               return;
+       $s = fetch_url('https://graph.facebook.com/me/friends?access_token=' . $access_token);
+       if($s) {
+               logger('facebook: fb_get_friends: ' . $s, LOGGER_DATA);
+               $j = json_decode($s);
+               logger('facebook: fb_get_friends: json: ' . print_r($j,true), LOGGER_DATA);
+               if(! $j->data)
+                       return;
+
+           $persons_todo = array();
         foreach($j->data as $person) $persons_todo[] = $person;
 
         if ($fullsync)
             fb_get_friends_sync_full($uid, $access_token, $persons_todo);
         else
             fb_get_friends_sync_new($uid, $access_token, $persons_todo);
-    }
+       }
 }
 
 // This is the POST method to the facebook settings page
 // Content is posted to Facebook in the function facebook_post_hook() 
 
+/**
+ * @param $a
+ * @return mixed
+ */
 function facebook_post(&$a) {
 
-    $uid = local_user();
-    if($uid){
-
-        $value = ((x($_POST,'post_by_default')) ? intval($_POST['post_by_default']) : 0);
-        set_pconfig($uid,'facebook','post_by_default', $value);
+       $uid = local_user();
+       if($uid){
 
-        $no_linking = get_pconfig($uid,'facebook','no_linking');
+               $value = ((x($_POST,'post_by_default')) ? intval($_POST['post_by_default']) : 0);
+               set_pconfig($uid,'facebook','post_by_default', $value);
 
-        $no_wall = ((x($_POST,'facebook_no_wall')) ? intval($_POST['facebook_no_wall']) : 0);
-        set_pconfig($uid,'facebook','no_wall',$no_wall);
+               $no_linking = get_pconfig($uid,'facebook','no_linking');
 
-        $private_wall = ((x($_POST,'facebook_private_wall')) ? intval($_POST['facebook_private_wall']) : 0);
-        set_pconfig($uid,'facebook','private_wall',$private_wall);
+               $no_wall = ((x($_POST,'facebook_no_wall')) ? intval($_POST['facebook_no_wall']) : 0);
+               set_pconfig($uid,'facebook','no_wall',$no_wall);
 
+               $private_wall = ((x($_POST,'facebook_private_wall')) ? intval($_POST['facebook_private_wall']) : 0);
+               set_pconfig($uid,'facebook','private_wall',$private_wall);
+       
 
-        set_pconfig($uid,'facebook','blocked_apps',escape_tags(trim($_POST['blocked_apps'])));
+               set_pconfig($uid,'facebook','blocked_apps',escape_tags(trim($_POST['blocked_apps'])));
 
-        $linkvalue = ((x($_POST,'facebook_linking')) ? intval($_POST['facebook_linking']) : 0);
-        set_pconfig($uid,'facebook','no_linking', (($linkvalue) ? 0 : 1));
+               $linkvalue = ((x($_POST,'facebook_linking')) ? intval($_POST['facebook_linking']) : 0);
+               set_pconfig($uid,'facebook','no_linking', (($linkvalue) ? 0 : 1));
 
-        // FB linkage was allowed but has just been turned off - remove all FB contacts and posts
+               // FB linkage was allowed but has just been turned off - remove all FB contacts and posts
 
-        if((! intval($no_linking)) && (! intval($linkvalue))) {
-            $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `network` = '%s' ",
-                intval($uid),
-                dbesc(NETWORK_FACEBOOK)
-            );
-            if(count($r)) {
-                require_once('include/Contact.php');
-                foreach($r as $rr)
-                    contact_remove($rr['id']);
-            }
-        }
-        elseif(intval($no_linking) && intval($linkvalue)) {
-            // FB linkage is now allowed - import stuff.
-            fb_get_self($uid);
-            fb_get_friends($uid, true);
-            fb_consume_all($uid);
-        }
+               if((! intval($no_linking)) && (! intval($linkvalue))) {
+                       $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `network` = '%s' ",
+                               intval($uid),
+                               dbesc(NETWORK_FACEBOOK)
+                       );
+                       if(count($r)) {
+                               require_once('include/Contact.php');
+                               foreach($r as $rr)
+                                       contact_remove($rr['id']);
+                       }
+               }
+               elseif(intval($no_linking) && intval($linkvalue)) {
+                       // FB linkage is now allowed - import stuff.
+                       fb_get_self($uid);
+                       fb_get_friends($uid, true);
+                       fb_consume_all($uid);
+               }
 
-        info( t('Settings updated.') . EOL);
-    }
+               info( t('Settings updated.') . EOL);
+       } 
 
-    return;
+       return;         
 }
 
 // Facebook settings form
 
+/**
+ * @param $a
+ * @return string
+ */
 function facebook_content(&$a) {
 
-    if(! local_user()) {
-        notice( t('Permission denied.') . EOL);
-        return '';
-    }
+       if(! local_user()) {
+               notice( t('Permission denied.') . EOL);
+               return '';
+       }
 
-    if($a->argc > 1 && $a->argv[1] === 'remove') {
-        del_pconfig(local_user(),'facebook','post');
-        info( t('Facebook disabled') . EOL);
-    }
+       if($a->argc > 1 && $a->argv[1] === 'remove') {
+               del_pconfig(local_user(),'facebook','post');
+               info( t('Facebook disabled') . EOL);
+       }
 
-    if($a->argc > 1 && $a->argv[1] === 'friends') {
-        fb_get_friends(local_user(), true);
-        info( t('Updating contacts') . EOL);
-    }
+       if($a->argc > 1 && $a->argv[1] === 'friends') {
+               fb_get_friends(local_user(), true);
+               info( t('Updating contacts') . EOL);
+       }
 
-    $o = '';
-
-    $fb_installed = false;
-    if (get_pconfig(local_user(),'facebook','post')) {
-        $access_token = get_pconfig(local_user(),'facebook','access_token');
-        if ($access_token) {
-            $private_wall = intval(get_pconfig(local_user(),'facebook','private_wall'));
-            $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
-            if($s) {
-                $j = json_decode($s);
-                if (isset($j->data)) $fb_installed = true;
-            }
-        }
-    }
+       $o = '';
+       
+       $fb_installed = false;
+       if (get_pconfig(local_user(),'facebook','post')) {
+               $access_token = get_pconfig(local_user(),'facebook','access_token');
+               if ($access_token) {
+                       $private_wall = intval(get_pconfig(local_user(),'facebook','private_wall'));
+                       $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
+                       if($s) {
+                               $j = json_decode($s);
+                               if (isset($j->data)) $fb_installed = true;
+                       }
+               }
+       }
+       
+       $appid = get_config('facebook','appid');
 
-    $appid = get_config('facebook','appid');
+       if(! $appid) {
+               notice( t('Facebook API key is missing.') . EOL);
+               return '';
+       }
 
-    if(! $appid) {
-        notice( t('Facebook API key is missing.') . EOL);
-        return '';
-    }
-
-    $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'
-        . $a->get_baseurl() . '/addon/facebook/facebook.css' . '" media="all" />' . "\r\n";
+       $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' 
+               . $a->get_baseurl() . '/addon/facebook/facebook.css' . '" media="all" />' . "\r\n";
 
-    $o .= '<h3>' . t('Facebook Connect') . '</h3>';
+       $o .= '<h3>' . t('Facebook Connect') . '</h3>';
 
-    if(! $fb_installed) {
-        $o .= '<div id="facebook-enable-wrapper">';
+       if(! $fb_installed) { 
+               $o .= '<div id="facebook-enable-wrapper">';
 
-        $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri='
-            . $a->get_baseurl() . '/facebook/' . $a->user['nickname'] . '&scope=publish_stream,read_stream,offline_access">' . t('Install Facebook connector for this account.') . '</a>';
-        $o .= '</div>';
-    }
+               $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri=' 
+                       . $a->get_baseurl() . '/facebook/' . $a->user['nickname'] . '&scope=publish_stream,read_stream,offline_access">' . t('Install Facebook connector for this account.') . '</a>';
+               $o .= '</div>';
+       }
 
-    if($fb_installed) {
-        $o .= '<div id="facebook-disable-wrapper">';
+       if($fb_installed) {
+               $o .= '<div id="facebook-disable-wrapper">';
 
-        $o .= '<a href="' . $a->get_baseurl() . '/facebook/remove' . '">' . t('Remove Facebook connector') . '</a></div>';
+               $o .= '<a href="' . $a->get_baseurl() . '/facebook/remove' . '">' . t('Remove Facebook connector') . '</a></div>';
 
-        $o .= '<div id="facebook-enable-wrapper">';
+               $o .= '<div id="facebook-enable-wrapper">';
 
-        $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri='
-            . $a->get_baseurl() . '/facebook/' . $a->user['nickname'] . '&scope=publish_stream,read_stream,offline_access">' . t('Re-authenticate [This is necessary whenever your Facebook password is changed.]') . '</a>';
-        $o .= '</div>';
+               $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri=' 
+                       . $a->get_baseurl() . '/facebook/' . $a->user['nickname'] . '&scope=publish_stream,read_stream,offline_access">' . t('Re-authenticate [This is necessary whenever your Facebook password is changed.]') . '</a>';
+               $o .= '</div>';
+       
+               $o .= '<div id="facebook-post-default-form">';
+               $o .= '<form action="facebook" method="post" >';
+               $post_by_default = get_pconfig(local_user(),'facebook','post_by_default');
+               $checked = (($post_by_default) ? ' checked="checked" ' : '');
+               $o .= '<input type="checkbox" name="post_by_default" value="1"' . $checked . '/>' . ' ' . t('Post to Facebook by default') . EOL;
 
-        $o .= '<div id="facebook-post-default-form">';
-        $o .= '<form action="facebook" method="post" >';
-        $post_by_default = get_pconfig(local_user(),'facebook','post_by_default');
-        $checked = (($post_by_default) ? ' checked="checked" ' : '');
-        $o .= '<input type="checkbox" name="post_by_default" value="1"' . $checked . '/>' . ' ' . t('Post to Facebook by default') . EOL;
+               $no_linking = get_pconfig(local_user(),'facebook','no_linking');
+               $checked = (($no_linking) ? '' : ' checked="checked" ');
+               $o .= '<input type="checkbox" name="facebook_linking" value="1"' . $checked . '/>' . ' ' . t('Link all your Facebook friends and conversations on this website') . EOL ;
 
-        $no_linking = get_pconfig(local_user(),'facebook','no_linking');
-        $checked = (($no_linking) ? '' : ' checked="checked" ');
-        $o .= '<input type="checkbox" name="facebook_linking" value="1"' . $checked . '/>' . ' ' . t('Link all your Facebook friends and conversations on this website') . EOL ;
+               $o .= '<p>' . t('Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>.');
+               $o .= ' ' . t('On this website, your Facebook friend stream is only visible to you.');
+               $o .= ' ' . t('The following settings determine the privacy of your Facebook profile wall on this website.') . '</p>';
 
-        $o .= '<p>' . t('Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>.');
-        $o .= ' ' . t('On this website, your Facebook friend stream is only visible to you.');
-        $o .= ' ' . t('The following settings determine the privacy of your Facebook profile wall on this website.') . '</p>';
+               $private_wall = get_pconfig(local_user(),'facebook','private_wall');
+               $checked = (($private_wall) ? ' checked="checked" ' : '');
+               $o .= '<input type="checkbox" name="facebook_private_wall" value="1"' . $checked . '/>' . ' ' . t('On this website your Facebook profile wall conversations will only be visible to you') . EOL ;
 
-        $private_wall = get_pconfig(local_user(),'facebook','private_wall');
-        $checked = (($private_wall) ? ' checked="checked" ' : '');
-        $o .= '<input type="checkbox" name="facebook_private_wall" value="1"' . $checked . '/>' . ' ' . t('On this website your Facebook profile wall conversations will only be visible to you') . EOL ;
 
+               $no_wall = get_pconfig(local_user(),'facebook','no_wall');
+               $checked = (($no_wall) ? ' checked="checked" ' : '');
+               $o .= '<input type="checkbox" name="facebook_no_wall" value="1"' . $checked . '/>' . ' ' . t('Do not import your Facebook profile wall conversations') . EOL ;
 
-        $no_wall = get_pconfig(local_user(),'facebook','no_wall');
-        $checked = (($no_wall) ? ' checked="checked" ' : '');
-        $o .= '<input type="checkbox" name="facebook_no_wall" value="1"' . $checked . '/>' . ' ' . t('Do not import your Facebook profile wall conversations') . EOL ;
+               $o .= '<p>' . t('If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations.') . '</p>';
 
-        $o .= '<p>' . t('If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations.') . '</p>';
 
+               $blocked_apps = get_pconfig(local_user(),'facebook','blocked_apps');
 
-        $blocked_apps = get_pconfig(local_user(),'facebook','blocked_apps');
+               $o .= '<div><label id="blocked-apps-label" for="blocked-apps">' . t('Comma separated applications to ignore') . ' </label></div>';
+       $o .= '<div><textarea id="blocked-apps" name="blocked_apps" >' . htmlspecialchars($blocked_apps) . '</textarea></div>';
 
-        $o .= '<div><label id="blocked-apps-label" for="blocked-apps">' . t('Comma separated applications to ignore') . ' </label></div>';
-        $o .= '<div><textarea id="blocked-apps" name="blocked_apps" >' . htmlspecialchars($blocked_apps) . '</textarea></div>';
-
-        $o .= '<input type="submit" name="submit" value="' . t('Submit') . '" /></form></div>';
-    }
+               $o .= '<input type="submit" name="submit" value="' . t('Submit') . '" /></form></div>';
+       }
 
-    return $o;
+       return $o;
 }
 
 
-
+/**
+ * @param $a
+ * @param $b
+ * @return mixed
+ */
 function facebook_cron($a,$b) {
 
-    $last = get_config('facebook','last_poll');
-
-    $poll_interval = intval(get_config('facebook','poll_interval'));
-    if(! $poll_interval)
-        $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
-
-    if($last) {
-        $next = $last + $poll_interval;
-        if($next > time())
-            return;
-    }
-
-    logger('facebook_cron');
-
-
-    // Find the FB users on this site and randomize in case one of them
-    // uses an obscene amount of memory. It may kill this queue run
-    // but hopefully we'll get a few others through on each run.
-
-    $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'post' AND `v` = '1' ORDER BY RAND() ");
-    if(count($r)) {
-        foreach($r as $rr) {
-            if(get_pconfig($rr['uid'],'facebook','no_linking'))
-                continue;
-            $ab = intval(get_config('system','account_abandon_days'));
-            if($ab > 0) {
-                $z = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY LIMIT 1",
-                    intval($rr['uid']),
-                    intval($ab)
-                );
-                if(! count($z))
-                    continue;
-            }
-
-            // check for new friends once a day
-            $last_friend_check = get_pconfig($rr['uid'],'facebook','friend_check');
-            if($last_friend_check)
-                $next_friend_check = $last_friend_check + 86400;
-            if($next_friend_check <= time()) {
-                fb_get_friends($rr['uid'], true);
-                set_pconfig($rr['uid'],'facebook','friend_check',time());
-            }
-            fb_consume_all($rr['uid']);
-        }
-    }
-
-    if (get_config('facebook', 'realtime_active') == 1) {
-        if (!facebook_check_realtime_active()) {
-
-            logger('facebook_cron: Facebook is not sending Real-Time Updates any more, although it is supposed to. Trying to fix it...', LOGGER_NORMAL);
-            facebook_subscription_add_users();
-
-            if (facebook_check_realtime_active())
-                logger('facebook_cron: Successful', LOGGER_NORMAL);
-            else {
-                logger('facebook_cron: Failed', LOGGER_NORMAL);
-
-                if(strlen($a->config['admin_email']) && !get_config('facebook', 'realtime_err_mailsent')) {
-                    $res = mail($a->config['admin_email'], t('Problems with Facebook Real-Time Updates'),
-                        "Hi!\n\nThere's a problem with the Facebook Real-Time Updates that cannot be solved automatically. Maybe a permission issue?\n\nPlease try to re-activate it on " . $a->config["system"]["url"] . "/admin/plugins/facebook\n\nThis e-mail will only be sent once.",
-                        'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
-                            . 'Content-type: text/plain; charset=UTF-8' . "\n"
-                            . 'Content-transfer-encoding: 8bit'
-                    );
-
-                    set_config('facebook', 'realtime_err_mailsent', 1);
-                }
-            }
-        } else { // !facebook_check_realtime_active()
-            del_config('facebook', 'realtime_err_mailsent');
-        }
-    }
-
-    set_config('facebook','last_poll', time());
+       $last = get_config('facebook','last_poll');
+       
+       $poll_interval = intval(get_config('facebook','poll_interval'));
+       if(! $poll_interval)
+               $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
+
+       if($last) {
+               $next = $last + $poll_interval;
+               if($next > time()) 
+                       return;
+       }
+
+       logger('facebook_cron');
+
+
+       // Find the FB users on this site and randomize in case one of them
+       // uses an obscene amount of memory. It may kill this queue run
+       // but hopefully we'll get a few others through on each run. 
+
+       $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'post' AND `v` = '1' ORDER BY RAND() ");
+       if(count($r)) {
+               foreach($r as $rr) {
+                       if(get_pconfig($rr['uid'],'facebook','no_linking'))
+                               continue;
+                       $ab = intval(get_config('system','account_abandon_days'));
+                       if($ab > 0) {
+                               $z = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY LIMIT 1",
+                                       intval($rr['uid']),
+                                       intval($ab)
+                               );
+                               if(! count($z))
+                                       continue;
+                       }
+
+                       // check for new friends once a day
+                       $last_friend_check = get_pconfig($rr['uid'],'facebook','friend_check');
+                       if($last_friend_check) 
+                               $next_friend_check = $last_friend_check + 86400;
+                       if($next_friend_check <= time()) {
+                               fb_get_friends($rr['uid'], true);
+                               set_pconfig($rr['uid'],'facebook','friend_check',time());
+                       }
+                       fb_consume_all($rr['uid']);
+               }
+       }
+       
+       if (get_config('facebook', 'realtime_active') == 1) {
+               if (!facebook_check_realtime_active()) {
+                       
+                       logger('facebook_cron: Facebook is not sending Real-Time Updates any more, although it is supposed to. Trying to fix it...', LOGGER_NORMAL);
+                       facebook_subscription_add_users();
+                       
+                       if (facebook_check_realtime_active()) 
+                               logger('facebook_cron: Successful', LOGGER_NORMAL);
+                       else {
+                               logger('facebook_cron: Failed', LOGGER_NORMAL);
+                               
+                               if(strlen($a->config['admin_email']) && !get_config('facebook', 'realtime_err_mailsent')) {
+                                       $res = mail($a->config['admin_email'], t('Problems with Facebook Real-Time Updates'), 
+                                               "Hi!\n\nThere's a problem with the Facebook Real-Time Updates that cannot be solved automatically. Maybe a permission issue?\n\nPlease try to re-activate it on " . $a->config["system"]["url"] . "/admin/plugins/facebook\n\nThis e-mail will only be sent once.",
+                                               'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
+                                               . 'Content-type: text/plain; charset=UTF-8' . "\n"
+                                               . 'Content-transfer-encoding: 8bit'
+                                       );
+                                       
+                                       set_config('facebook', 'realtime_err_mailsent', 1);
+                               }
+                       }
+               } else { // !facebook_check_realtime_active()
+                       del_config('facebook', 'realtime_err_mailsent');
+               }
+       }
+       
+       set_config('facebook','last_poll', time());
 
 }
 
 
-
+/**
+ * @param $a
+ * @param $b
+ */
 function facebook_plugin_settings(&$a,&$b) {
 
-    $b .= '<div class="settings-block">';
-    $b .= '<h3>' . t('Facebook') . '</h3>';
-    $b .= '<a href="facebook">' . t('Facebook Connector Settings') . '</a><br />';
-    $b .= '</div>';
+       $b .= '<div class="settings-block">';
+       $b .= '<h3>' . t('Facebook') . '</h3>';
+       $b .= '<a href="facebook">' . t('Facebook Connector Settings') . '</a><br />';
+       $b .= '</div>';
 
 }
 
 
+/**
+ * @param $a
+ * @param $o
+ */
 function facebook_plugin_admin(&$a, &$o){
-    $o = '<input type="hidden" name="form_security_token" value="' . get_form_security_token("fbsave") . '">';
-
-    $o .= '<h4>' . t('Facebook API Key') . '</h4>';
-
-    $appid  = get_config('facebook', 'appid'  );
-    $appsecret = get_config('facebook', 'appsecret' );
-    $poll_interval = get_config('facebook', 'poll_interval' );
-    if (!$poll_interval) $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
-
-    $ret1 = q("SELECT `v` FROM `config` WHERE `cat` = 'facebook' AND `k` = 'appid' LIMIT 1");
-    $ret2 = q("SELECT `v` FROM `config` WHERE `cat` = 'facebook' AND `k` = 'appsecret' LIMIT 1");
-    if ((count($ret1) > 0 && $ret1[0]['v'] != $appid) || (count($ret2) > 0 && $ret2[0]['v'] != $appsecret)) $o .= t('Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>');
-
-    $working_connection = false;
-    if ($appid && $appsecret) {
-        $subs = facebook_subscriptions_get();
-        if ($subs === null) $o .= t('Error: the given API Key seems to be incorrect (the application access token could not be retrieved).') . '<br>';
-        elseif (is_array($subs)) {
-            $o .= t('The given API Key seems to work correctly.') . '<br>';
-            $working_connection = true;
-        } else $o .= t('The correctness of the API Key could not be detected. Somthing strange\'s going on.') . '<br>';
-    }
 
-    $o .= '<label for="fb_appid">' . t('App-ID / API-Key') . '</label><input name="appid" type="text" value="' . escape_tags($appid ? $appid : "") . '"><br style="clear: both;">';
-    $o .= '<label for="fb_appsecret">' . t('Application secret') . '</label><input name="appsecret" type="text" value="' . escape_tags($appsecret ? $appsecret : "") . '"><br style="clear: both;">';
-    $o .= '<label for="fb_poll_interval">' . sprintf(t('Polling Interval (min. %1$s minutes)'), FACEBOOK_MIN_POLL_INTERVAL) . '</label><input name="poll_interval" type="number" min="' . FACEBOOK_MIN_POLL_INTERVAL . '" value="' . $poll_interval . '"><br style="clear: both;">';
-    $o .= '<input type="submit" name="fb_save_keys" value="' . t('Save') . '">';
 
-    if ($working_connection) {
-        $o .= '<h4>' . t('Real-Time Updates') . '</h4>';
-
-        $activated = facebook_check_realtime_active();
-        if ($activated) {
-            $o .= t('Real-Time Updates are activated.') . '<br><br>';
-            $o .= '<input type="submit" name="real_time_deactivate" value="' . t('Deactivate Real-Time Updates') . '">';
-        } else {
-            $o .= t('Real-Time Updates not activated.') . '<br><input type="submit" name="real_time_activate" value="' . t('Activate Real-Time Updates') . '">';
-        }
-    }
+       $o = '<input type="hidden" name="form_security_token" value="' . get_form_security_token("fbsave") . '">';
+       
+       $o .= '<h4>' . t('Facebook API Key') . '</h4>';
+       
+       $appid  = get_config('facebook', 'appid'  );
+       $appsecret = get_config('facebook', 'appsecret' );
+       $poll_interval = get_config('facebook', 'poll_interval' );
+       if (!$poll_interval) $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
+       
+       $ret1 = q("SELECT `v` FROM `config` WHERE `cat` = 'facebook' AND `k` = 'appid' LIMIT 1");
+       $ret2 = q("SELECT `v` FROM `config` WHERE `cat` = 'facebook' AND `k` = 'appsecret' LIMIT 1");
+       if ((count($ret1) > 0 && $ret1[0]['v'] != $appid) || (count($ret2) > 0 && $ret2[0]['v'] != $appsecret)) $o .= t('Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>');
+       
+       $working_connection = false;
+       if ($appid && $appsecret) {
+               $subs = facebook_subscriptions_get();
+               if ($subs === null) $o .= t('Error: the given API Key seems to be incorrect (the application access token could not be retrieved).') . '<br>';
+               elseif (is_array($subs)) {
+                       $o .= t('The given API Key seems to work correctly.') . '<br>';
+                       $working_connection = true;
+               } else $o .= t('The correctness of the API Key could not be detected. Somthing strange\'s going on.') . '<br>';
+       }
+       
+       $o .= '<label for="fb_appid">' . t('App-ID / API-Key') . '</label><input name="appid" type="text" value="' . escape_tags($appid ? $appid : "") . '"><br style="clear: both;">';
+       $o .= '<label for="fb_appsecret">' . t('Application secret') . '</label><input name="appsecret" type="text" value="' . escape_tags($appsecret ? $appsecret : "") . '"><br style="clear: both;">';
+       $o .= '<label for="fb_poll_interval">' . sprintf(t('Polling Interval (min. %1$s minutes)'), FACEBOOK_MIN_POLL_INTERVAL) . '</label><input name="poll_interval" type="number" min="' . FACEBOOK_MIN_POLL_INTERVAL . '" value="' . $poll_interval . '"><br style="clear: both;">';
+       $o .= '<input type="submit" name="fb_save_keys" value="' . t('Save') . '">';
+       
+       if ($working_connection) {
+               $o .= '<h4>' . t('Real-Time Updates') . '</h4>';
+               
+               $activated = facebook_check_realtime_active();
+               if ($activated) {
+                       $o .= t('Real-Time Updates are activated.') . '<br><br>';
+                       $o .= '<input type="submit" name="real_time_deactivate" value="' . t('Deactivate Real-Time Updates') . '">';
+               } else {
+                       $o .= t('Real-Time Updates not activated.') . '<br><input type="submit" name="real_time_activate" value="' . t('Activate Real-Time Updates') . '">';
+               }
+       }
 }
 
+/**
+ * @param $a
+ * @param $o
+ */
 function facebook_plugin_admin_post(&$a, &$o){
-    check_form_security_token_redirectOnErr('/admin/plugins/facebook', 'fbsave');
-
-    if (x($_REQUEST,'fb_save_keys')) {
-        set_config('facebook', 'appid', $_REQUEST['appid']);
-        set_config('facebook', 'appsecret', $_REQUEST['appsecret']);
-        $poll_interval = IntVal($_REQUEST['poll_interval']);
-        if ($poll_interval >= FACEBOOK_MIN_POLL_INTERVAL) set_config('facebook', 'poll_interval', $poll_interval);
-        del_config('facebook', 'app_access_token');
-        info(t('The new values have been saved.'));
-    }
-    if (x($_REQUEST,'real_time_activate')) {
-        facebook_subscription_add_users();
-    }
-    if (x($_REQUEST,'real_time_deactivate')) {
-        facebook_subscription_del_users();
-    }
+       check_form_security_token_redirectOnErr('/admin/plugins/facebook', 'fbsave');
+       
+       if (x($_REQUEST,'fb_save_keys')) {
+               set_config('facebook', 'appid', $_REQUEST['appid']);
+               set_config('facebook', 'appsecret', $_REQUEST['appsecret']);
+               $poll_interval = IntVal($_REQUEST['poll_interval']);
+               if ($poll_interval >= FACEBOOK_MIN_POLL_INTERVAL) set_config('facebook', 'poll_interval', $poll_interval);
+               del_config('facebook', 'app_access_token');
+               info(t('The new values have been saved.'));
+       }
+       if (x($_REQUEST,'real_time_activate')) {
+               facebook_subscription_add_users();
+       }
+       if (x($_REQUEST,'real_time_deactivate')) {
+               facebook_subscription_del_users();
+       }
 }
 
+/**
+ * @param $a
+ * @param $b
+ * @return mixed
+ */
 function facebook_jot_nets(&$a,&$b) {
-    if(! local_user())
-        return;
-
-    $fb_post = get_pconfig(local_user(),'facebook','post');
-    if(intval($fb_post) == 1) {
-        $fb_defpost = get_pconfig(local_user(),'facebook','post_by_default');
-        $selected = ((intval($fb_defpost) == 1) ? ' checked="checked" ' : '');
-        $b .= '<div class="profile-jot-net"><input type="checkbox" name="facebook_enable"' . $selected . ' value="1" /> '
-            . t('Post to Facebook') . '</div>';
-    }
+       if(! local_user())
+               return;
+
+       $fb_post = get_pconfig(local_user(),'facebook','post');
+       if(intval($fb_post) == 1) {
+               $fb_defpost = get_pconfig(local_user(),'facebook','post_by_default');
+               $selected = ((intval($fb_defpost) == 1) ? ' checked="checked" ' : '');
+               $b .= '<div class="profile-jot-net"><input type="checkbox" name="facebook_enable"' . $selected . ' value="1" /> ' 
+                       . t('Post to Facebook') . '</div>';     
+       }
 }
 
 
+/**
+ * @param $a
+ * @param $b
+ * @return mixed
+ */
 function facebook_post_hook(&$a,&$b) {
 
 
-    if($b['deleted'] || ($b['created'] !== $b['edited']))
-        return;
-
-    /**
-     * Post to Facebook stream
-     */
-
-    require_once('include/group.php');
-    require_once('include/html2plain.php');
+       if($b['deleted'] || ($b['created'] !== $b['edited']))
+               return;
 
-    logger('Facebook post');
+       /**
+        * Post to Facebook stream
+        */
 
-    $reply = false;
-    $likes = false;
+       require_once('include/group.php');
+       require_once('include/html2plain.php');
 
-    $toplevel = (($b['id'] == $b['parent']) ? true : false);
+       logger('Facebook post');
 
+       $reply = false;
+       $likes = false;
 
-    $linking = ((get_pconfig($b['uid'],'facebook','no_linking')) ? 0 : 1);
+       $toplevel = (($b['id'] == $b['parent']) ? true : false);
 
-    if((! $toplevel) && ($linking)) {
-        $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-            intval($b['parent']),
-            intval($b['uid'])
-        );
-        if(count($r) && substr($r[0]['uri'],0,4) === 'fb::')
-            $reply = substr($r[0]['uri'],4);
-        elseif(count($r) && substr($r[0]['extid'],0,4) === 'fb::')
-            $reply = substr($r[0]['extid'],4);
-        else
-            return;
 
-        $u = q("SELECT * FROM user where uid = %d limit 1",
-            intval($b['uid'])
-        );
-        if(! count($u))
-            return;
+       $linking = ((get_pconfig($b['uid'],'facebook','no_linking')) ? 0 : 1);
 
-        // only accept comments from the item owner. Other contacts are unknown to FB.
+       if((! $toplevel) && ($linking)) {
+               $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+                       intval($b['parent']),
+                       intval($b['uid'])
+               );
+               if(count($r) && substr($r[0]['uri'],0,4) === 'fb::')
+                       $reply = substr($r[0]['uri'],4);
+               elseif(count($r) && substr($r[0]['extid'],0,4) === 'fb::')
+                       $reply = substr($r[0]['extid'],4);
+               else
+                       return;
 
-        if(! link_compare($b['author-link'], $a->get_baseurl() . '/profile/' . $u[0]['nickname']))
-            return;
+               $u = q("SELECT * FROM user where uid = %d limit 1",
+                       intval($b['uid'])
+               );
+               if(! count($u))
+                       return;
 
+               // only accept comments from the item owner. Other contacts are unknown to FB.
+               if(! link_compare($b['author-link'], $a->get_baseurl() . '/profile/' . $u[0]['nickname']))
+                       return;
+               
 
-        logger('facebook reply id=' . $reply);
-    }
-
-    if(strstr($b['postopts'],'facebook') || ($b['private']) || ($reply)) {
+               logger('facebook reply id=' . $reply);
+       }
 
-        if($b['private'] && $reply === false) {
-            $allow_people = expand_acl($b['allow_cid']);
-            $allow_groups = expand_groups(expand_acl($b['allow_gid']));
-            $deny_people  = expand_acl($b['deny_cid']);
-            $deny_groups  = expand_groups(expand_acl($b['deny_gid']));
+       if(strstr($b['postopts'],'facebook') || ($b['private']) || ($reply)) {
 
-            $recipients = array_unique(array_merge($allow_people,$allow_groups));
-            $deny = array_unique(array_merge($deny_people,$deny_groups));
-
-            $allow_str = dbesc(implode(', ',$recipients));
-            if($allow_str) {
-                $r = q("SELECT `notify` FROM `contact` WHERE `id` IN ( $allow_str ) AND `network` = 'face'");
-                $allow_arr = array();
-                if(count($r))
-                    foreach($r as $rr)
-                        $allow_arr[] = $rr['notify'];
-            }
+               if($b['private'] && $reply === false) {
+                       $allow_people = expand_acl($b['allow_cid']);
+                       $allow_groups = expand_groups(expand_acl($b['allow_gid']));
+                       $deny_people  = expand_acl($b['deny_cid']);
+                       $deny_groups  = expand_groups(expand_acl($b['deny_gid']));
 
-            $deny_str = dbesc(implode(', ',$deny));
-            if($deny_str) {
-                $r = q("SELECT `notify` FROM `contact` WHERE `id` IN ( $deny_str ) AND `network` = 'face'");
-                $deny_arr = array();
-                if(count($r))
-                    foreach($r as $rr)
-                        $deny_arr[] = $rr['notify'];
-            }
+                       $recipients = array_unique(array_merge($allow_people,$allow_groups));
+                       $deny = array_unique(array_merge($deny_people,$deny_groups));
 
-            if(count($deny_arr) && (! count($allow_arr))) {
+                       $allow_str = dbesc(implode(', ',$recipients));
+                       if($allow_str) {
+                               $r = q("SELECT `notify` FROM `contact` WHERE `id` IN ( $allow_str ) AND `network` = 'face'"); 
+                               $allow_arr = array();
+                               if(count($r)) 
+                                       foreach($r as $rr)
+                                               $allow_arr[] = $rr['notify'];
+                       }
 
-                // One or more FB folks were denied access but nobody on FB was specifically allowed access.
-                // This might cause the post to be open to public on Facebook, but only to selected members
-                // on another network. Since this could potentially leak a post to somebody who was denied,
-                // we will skip posting it to Facebook with a slightly vague but relevant message that will
-                // hopefully lead somebody to this code comment for a better explanation of what went wrong.
+                       $deny_str = dbesc(implode(', ',$deny));
+                       if($deny_str) {
+                               $r = q("SELECT `notify` FROM `contact` WHERE `id` IN ( $deny_str ) AND `network` = 'face'"); 
+                               $deny_arr = array();
+                               if(count($r)) 
+                                       foreach($r as $rr)
+                                               $deny_arr[] = $rr['notify'];
+                       }
 
-                notice( t('Post to Facebook cancelled because of multi-network access permission conflict.') . EOL);
-                return;
-            }
+                       if(count($deny_arr) && (! count($allow_arr))) {
 
+                               // One or more FB folks were denied access but nobody on FB was specifically allowed access.
+                               // This might cause the post to be open to public on Facebook, but only to selected members
+                               // on another network. Since this could potentially leak a post to somebody who was denied, 
+                               // we will skip posting it to Facebook with a slightly vague but relevant message that will 
+                               // hopefully lead somebody to this code comment for a better explanation of what went wrong.
 
-            // if it's a private message but no Facebook members are allowed or denied, skip Facebook post
+                               notice( t('Post to Facebook cancelled because of multi-network access permission conflict.') . EOL);
+                               return;
+                       }
 
-            if((! count($allow_arr)) && (! count($deny_arr)))
-                return;
-        }
 
-        if($b['verb'] == ACTIVITY_LIKE)
-            $likes = true;
+                       // if it's a private message but no Facebook members are allowed or denied, skip Facebook post
 
+                       if((! count($allow_arr)) && (! count($deny_arr)))
+                               return;
+               }
 
-        $appid  = get_config('facebook', 'appid'  );
-        $secret = get_config('facebook', 'appsecret' );
+               if($b['verb'] == ACTIVITY_LIKE)
+                       $likes = true;                          
 
-        if($appid && $secret) {
 
-            logger('facebook: have appid+secret');
+               $appid  = get_config('facebook', 'appid'  );
+               $secret = get_config('facebook', 'appsecret' );
 
-            $fb_token  = get_pconfig($b['uid'],'facebook','access_token');
+               if($appid && $secret) {
 
+                       logger('facebook: have appid+secret');
 
-            // post to facebook if it's a public post and we've ticked the 'post to Facebook' box,
-            // or it's a private message with facebook participants
-            // or it's a reply or likes action to an existing facebook post
+                       $fb_token  = get_pconfig($b['uid'],'facebook','access_token');
 
-            if($fb_token && ($toplevel || $b['private'] || $reply)) {
-                logger('facebook: able to post');
-                require_once('library/facebook.php');
-                require_once('include/bbcode.php');
 
-                $msg = $b['body'];
+                       // post to facebook if it's a public post and we've ticked the 'post to Facebook' box, 
+                       // or it's a private message with facebook participants
+                       // or it's a reply or likes action to an existing facebook post                 
 
-                logger('Facebook post: original msg=' . $msg, LOGGER_DATA);
+                       if($fb_token && ($toplevel || $b['private'] || $reply)) {
+                               logger('facebook: able to post');
+                               require_once('library/facebook.php');
+                               require_once('include/bbcode.php');     
 
-                // make links readable before we strip the code
+                               $msg = $b['body'];
 
-                // unless it's a dislike - just send the text as a comment
+                               logger('Facebook post: original msg=' . $msg, LOGGER_DATA);
 
-                if($b['verb'] == ACTIVITY_DISLIKE)
-                    $msg = trim(strip_tags(bbcode($msg)));
+                               // make links readable before we strip the code
 
-                // Old code
-                /*$search_str = $a->get_baseurl() . '/search';
+                               // unless it's a dislike - just send the text as a comment
 
-                    if(preg_match("/\[url=(.*?)\](.*?)\[\/url\]/is",$msg,$matches)) {
+                               if($b['verb'] == ACTIVITY_DISLIKE)
+                                       $msg = trim(strip_tags(bbcode($msg)));
 
-                        // don't use hashtags for message link
+                               // Old code
+                               /*$search_str = $a->get_baseurl() . '/search';
 
-                        if(strpos($matches[2],$search_str) === false) {
-                            $link = $matches[1];
-                            if(substr($matches[2],0,5) != '[img]')
-                                $linkname = $matches[2];
-                        }
-                    }
+                               if(preg_match("/\[url=(.*?)\](.*?)\[\/url\]/is",$msg,$matches)) {
 
-                    // strip tag links to avoid link clutter, this really should be
-                    // configurable because we're losing information
+                                       // don't use hashtags for message link
 
-                    $msg = preg_replace("/\#\[url=(.*?)\](.*?)\[\/url\]/is",'#$2',$msg);
+                                       if(strpos($matches[2],$search_str) === false) {
+                                               $link = $matches[1];
+                                               if(substr($matches[2],0,5) != '[img]')
+                                                       $linkname = $matches[2];
+                                       }
+                               }
 
-                    // provide the link separately for normal links
-                    $msg = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/is",'$2 $1',$msg);
+                               // strip tag links to avoid link clutter, this really should be 
+                               // configurable because we're losing information
 
-                    if(preg_match("/\[img\](.*?)\[\/img\]/is",$msg,$matches))
-                        $image = $matches[1];
+                               $msg = preg_replace("/\#\[url=(.*?)\](.*?)\[\/url\]/is",'#$2',$msg);
 
-                    $msg = preg_replace("/\[img\](.*?)\[\/img\]/is", t('Image: ') . '$1', $msg);
+                               // provide the link separately for normal links
+                               $msg = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/is",'$2 $1',$msg);
 
-                    if((strpos($link,z_root()) !== false) && (! $image))
-                        $image = $a->get_baseurl() . '/images/friendica-64.jpg';
+                               if(preg_match("/\[img\](.*?)\[\/img\]/is",$msg,$matches))
+                                       $image = $matches[1];
 
-                    $msg = trim(strip_tags(bbcode($msg)));*/
+                               $msg = preg_replace("/\[img\](.*?)\[\/img\]/is", t('Image: ') . '$1', $msg);
 
-                // New code
+                               if((strpos($link,z_root()) !== false) && (! $image))
+                                       $image = $a->get_baseurl() . '/images/friendica-64.jpg';
 
-                // Looking for the first image
-                $image = '';
-                if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$b['body'],$matches))
-                    $image = $matches[3];
+                               $msg = trim(strip_tags(bbcode($msg)));*/
 
-                if ($image != '')
-                    if(preg_match("/\[img\](.*?)\[\/img\]/is",$b['body'],$matches))
-                        $image = $matches[1];
+                               // New code
 
-                // Checking for a bookmark element
-                $body = $b['body'];
-                if (strpos($body, "[bookmark") !== false) {
-                    // splitting the text in two parts:
-                    // before and after the bookmark
-                    $pos = strpos($body, "[bookmark");
-                    $body1 = substr($body, 0, $pos);
-                    $body2 = substr($body, $pos);
+                               // Looking for the first image
+                               $image = '';
+                               if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$b['body'],$matches))
+                                       $image = $matches[3];
 
-                    // Removing the bookmark and all quotes after the bookmark
-                    // they are mostly only the content after the bookmark.
-                    $body2 = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'',$body2);
-                    $body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2);
-                    $body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2);
+                               if ($image == '')
+                                       if(preg_match("/\[img\](.*?)\[\/img\]/is",$b['body'],$matches))
+                                               $image = $matches[1];
 
-                    $body = $body1.$body2;
-                }
+                               // Checking for a bookmark element
+                               $body = $b['body'];
+                               if (strpos($body, "[bookmark") !== false) {
+                                       // splitting the text in two parts:
+                                       // before and after the bookmark
+                                       $pos = strpos($body, "[bookmark");
+                                       $body1 = substr($body, 0, $pos);
+                                       $body2 = substr($body, $pos);
 
-                // At first convert the text to html
-                $html = bbcode($body);
+                                       // Removing the bookmark and all quotes after the bookmark
+                                       // they are mostly only the content after the bookmark.
+                                       $body2 = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'',$body2);
+                                       $body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2);
+                                       $body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2);
 
-                // Then convert it to plain text
-                $msg = trim($b['title']." \n\n".html2plain($html, 0, true));
-                $msg = html_entity_decode($msg,ENT_QUOTES,'UTF-8');
+                                       $body = $body1.$body2;
+                               }
 
-                // Removing multiple newlines
-                while (strpos($msg, "\n\n\n") !== false)
-                    $msg = str_replace("\n\n\n", "\n\n", $msg);
-
-                // add any attachments as text urls
-                $arr = explode(',',$b['attach']);
-
-                if(count($arr)) {
-                    $msg .= "\n";
-                    foreach($arr as $r) {
-                        $matches = false;
-                        $cnt = preg_match('|\[attach\]href=\"(.*?)\" size=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches);
-                        if($cnt) {
-                            $msg .= "\n".$matches[1];
-                        }
-                    }
-                }
-
-                $link = '';
-                $linkname = '';
-                // look for bookmark-bbcode and handle it with priority
-                if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches)) {
-                    $link = $matches[1];
-                    $linkname = $matches[2];
-                }
-
-                // If there is no bookmark element then take the first link
-                if ($link == '') {
-                    $links = collecturls($html);
-                    if (sizeof($links) > 0) {
-                        reset($links);
-                        $link = current($links);
-                    }
-                }
-
-                // Remove trailing and leading spaces
-                $msg = trim($msg);
-
-                // Since facebook increased the maxpostlen massively this never should happen again :)
-                if (strlen($msg) > FACEBOOK_MAXPOSTLEN) {
-                    $shortlink = "";
-                    require_once('library/slinky.php');
-
-                    $display_url = $b['plink'];
-
-                    $slinky = new Slinky( $display_url );
-                    // setup a cascade of shortening services
-                    // try to get a short link from these services
-                    // in the order ur1.ca, trim, id.gd, tinyurl
-                    $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
-                    $shortlink = $slinky->short();
-                    // the new message will be shortened such that "... $shortlink"
-                    // will fit into the character limit
-                    $msg = substr($msg, 0, FACEBOOK_MAXPOSTLEN - strlen($shortlink) - 4);
-                    $msg .= '... ' . $shortlink;
-                }
-
-                // Fallback - if message is empty
-                if(!strlen($msg))
-                    $msg = $link;
-
-                if(!strlen($msg))
-                    $msg = $image;
-
-                if(!strlen($msg))
-                    $msg = $linkname;
-
-                // If there is nothing to post then exit
-                if(!strlen($msg))
-                    return;
-
-                logger('Facebook post: msg=' . $msg, LOGGER_DATA);
-
-                if($likes) {
-                    $postvars = array('access_token' => $fb_token);
-                }
-                else {
-                    $postvars = array(
-                        'access_token' => $fb_token,
-                        'message' => $msg
-                    );
-                    if(isset($image))
-                        $postvars['picture'] = $image;
-                    if(isset($link))
-                        $postvars['link'] = $link;
-                    if(isset($linkname))
-                        $postvars['name'] = $linkname;
-                }
-
-                if(($b['private']) && ($toplevel)) {
-                    $postvars['privacy'] = '{"value": "CUSTOM", "friends": "SOME_FRIENDS"';
-                    if(count($allow_arr))
-                        $postvars['privacy'] .= ',"allow": "' . implode(',',$allow_arr) . '"';
-                    if(count($deny_arr))
-                        $postvars['privacy'] .= ',"deny": "' . implode(',',$deny_arr) . '"';
-                    $postvars['privacy'] .= '}';
-
-                }
-
-                if($reply) {
-                    $url = 'https://graph.facebook.com/' . $reply . '/' . (($likes) ? 'likes' : 'comments');
-                }
-                else {
-                    $url = 'https://graph.facebook.com/me/feed';
-                    if($b['plink'])
-                        $postvars['actions'] = '{"name": "' . t('View on Friendica') . '", "link": "' .  $b['plink'] . '"}';
-                }
-
-                logger('facebook: post to ' . $url);
-                logger('facebook: postvars: ' . print_r($postvars,true));
-
-                // "test_mode" prevents anything from actually being posted.
-                // Otherwise, let's do it.
-
-                if(! get_config('facebook','test_mode')) {
-                    $x = post_url($url, $postvars);
-                    logger('Facebook post returns: ' . $x, LOGGER_DEBUG);
-
-                    $retj = json_decode($x);
-                    if($retj->id) {
-                        q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d LIMIT 1",
-                            dbesc('fb::' . $retj->id),
-                            intval($b['id'])
-                        );
-                    }
-                    else {
-                        if(! $likes) {
-                            $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $postvars));
-                            require_once('include/queue_fn.php');
-                            add_to_queue($a->contact,NETWORK_FACEBOOK,$s);
-                            notice( t('Facebook post failed. Queued for retry.') . EOL);
-                        }
-
-                        if (isset($retj->error) && $retj->error->type == "OAuthException" && $retj->error->code == 190) {
-                            logger('Facebook session has expired due to changed password.', LOGGER_DEBUG);
-
-                            $last_notification = get_pconfig($b['uid'], 'facebook', 'session_expired_mailsent');
-                            if (!$last_notification || $last_notification < (time() - FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL)) {
-                                require_once('include/enotify.php');
-
-                                $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($b['uid']) );
-                                notification(array(
-                                    'uid' => $b['uid'],
-                                    'type' => NOTIFY_SYSTEM,
-                                    'system_type' => 'facebook_connection_invalid',
-                                    'language'     => $r[0]['language'],
-                                    'to_name'      => $r[0]['username'],
-                                    'to_email'     => $r[0]['email'],
-                                    'source_name'  => t('Administrator'),
-                                    'source_link'  => $a->config["system"]["url"],
-                                    'source_photo' => $a->config["system"]["url"] . '/images/person-80.jpg',
-                                ));
-
-                                set_pconfig($b['uid'], 'facebook', 'session_expired_mailsent', time());
-                            } else logger('Facebook: No notification, as the last one was sent on ' . $last_notification, LOGGER_DEBUG);
-                        }
-                    }
-                }
-            }
-        }
-    }
+                               // At first convert the text to html
+                               $html = bbcode($body);
+
+                               // Then convert it to plain text
+                               $msg = trim($b['title']." \n\n".html2plain($html, 0, true));
+                               $msg = html_entity_decode($msg,ENT_QUOTES,'UTF-8');
+
+                               // Removing multiple newlines
+                               while (strpos($msg, "\n\n\n") !== false)
+                                       $msg = str_replace("\n\n\n", "\n\n", $msg);
+
+                               // add any attachments as text urls
+                               $arr = explode(',',$b['attach']);
+
+                               if(count($arr)) {
+                                       $msg .= "\n";
+                                       foreach($arr as $r) {
+                                               $matches = false;
+                                               $cnt = preg_match('|\[attach\]href=\"(.*?)\" size=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches);
+                                               if($cnt) {
+                                                       $msg .= "\n".$matches[1];
+                                               }
+                                       }
+                               }
+
+                               $link = '';
+                               $linkname = '';
+                               // look for bookmark-bbcode and handle it with priority
+                               if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches)) {
+                                       $link = $matches[1];
+                                       $linkname = $matches[2];
+                               }
+
+                               // If there is no bookmark element then take the first link
+                               if ($link == '') {
+                                       $links = collecturls($html);
+                                       if (sizeof($links) > 0) {
+                                               reset($links);
+                                               $link = current($links);
+                                       }
+                               }
+
+                               // Remove trailing and leading spaces
+                               $msg = trim($msg);
+
+                               // Since facebook increased the maxpostlen massively this never should happen again :)
+                               if (strlen($msg) > FACEBOOK_MAXPOSTLEN) {
+                                       $shortlink = "";
+                                       require_once('library/slinky.php');
+
+                                       $display_url = $b['plink'];
+
+                                       $slinky = new Slinky( $display_url );
+                                       // setup a cascade of shortening services
+                                       // try to get a short link from these services
+                                       // in the order ur1.ca, trim, id.gd, tinyurl
+                                       $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
+                                       $shortlink = $slinky->short();
+                                       // the new message will be shortened such that "... $shortlink"
+                                       // will fit into the character limit
+                                       $msg = substr($msg, 0, FACEBOOK_MAXPOSTLEN - strlen($shortlink) - 4);
+                                       $msg .= '... ' . $shortlink;
+                               }
+
+                               // Fallback - if message is empty
+                               if(!strlen($msg))
+                                       $msg = $link;
+
+                               if(!strlen($msg))
+                                       $msg = $image;
+
+                               if(!strlen($msg))
+                                       $msg = $linkname;
+
+                               // If there is nothing to post then exit
+                               if(!strlen($msg))
+                                       return;
+
+                               logger('Facebook post: msg=' . $msg, LOGGER_DATA);
+
+                               if($likes) { 
+                                       $postvars = array('access_token' => $fb_token);
+                               }
+                               else {
+                                       $postvars = array(
+                                               'access_token' => $fb_token, 
+                                               'message' => $msg
+                                       );
+                                       if(isset($image)) {
+                                               $postvars['picture'] = $image;
+                                               //$postvars['type'] = "photo";
+                                       }
+                                       if(isset($link)) {
+                                               $postvars['link'] = $link;
+                                               //$postvars['type'] = "link";
+                                       }
+                                       if(isset($linkname))
+                                               $postvars['name'] = $linkname;
+                               }
+
+                               if(($b['private']) && ($toplevel)) {
+                                       $postvars['privacy'] = '{"value": "CUSTOM", "friends": "SOME_FRIENDS"';
+                                       if(count($allow_arr))
+                                               $postvars['privacy'] .= ',"allow": "' . implode(',',$allow_arr) . '"';
+                                       if(count($deny_arr))
+                                               $postvars['privacy'] .= ',"deny": "' . implode(',',$deny_arr) . '"';
+                                       $postvars['privacy'] .= '}';
+
+                               }
+
+                               if($reply) {
+                                       $url = 'https://graph.facebook.com/' . $reply . '/' . (($likes) ? 'likes' : 'comments');
+                               } else if (($link != "")  or ($image != "") or ($b['title'] == '') or (strlen($msg) < 500)) { 
+                                       $url = 'https://graph.facebook.com/me/feed';
+                                       if($b['plink'])
+                                               $postvars['actions'] = '{"name": "' . t('View on Friendica') . '", "link": "' .  $b['plink'] . '"}';
+                               } else {
+                                       // if its only a message and a subject and the message is larger than 500 characters then post it as note
+                                       $postvars = array(
+                                               'access_token' => $fb_token, 
+                                               'message' => bbcode($b['body']),
+                                               'subject' => $b['title'],
+                                       );
+                                       $url = 'https://graph.facebook.com/me/notes';
+                               }
+
+                               logger('facebook: post to ' . $url);
+                               logger('facebook: postvars: ' . print_r($postvars,true));
+
+                               // "test_mode" prevents anything from actually being posted.
+                               // Otherwise, let's do it.
+
+                               if(! get_config('facebook','test_mode')) {
+                                       $x = post_url($url, $postvars);
+                                       logger('Facebook post returns: ' . $x, LOGGER_DEBUG);
+
+                                       $retj = json_decode($x);
+                                       if($retj->id) {
+                                               q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d LIMIT 1",
+                                                       dbesc('fb::' . $retj->id),
+                                                       intval($b['id'])
+                                               );
+                                       }
+                                       else {
+                                               if(! $likes) {
+                                                       $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $postvars));
+                                                       require_once('include/queue_fn.php');
+                                                       add_to_queue($a->contact,NETWORK_FACEBOOK,$s);
+                                                       notice( t('Facebook post failed. Queued for retry.') . EOL);
+                                               }
+                                               
+                                               if (isset($retj->error) && $retj->error->type == "OAuthException" && $retj->error->code == 190) {
+                                                       logger('Facebook session has expired due to changed password.', LOGGER_DEBUG);
+                                                       
+                                                       $last_notification = get_pconfig($b['uid'], 'facebook', 'session_expired_mailsent');
+                                                       if (!$last_notification || $last_notification < (time() - FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL)) {
+                                                               require_once('include/enotify.php');
+                                                       
+                                                               $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($b['uid']) );
+                                                               notification(array(
+                                                                       'uid' => $b['uid'],
+                                                                       'type' => NOTIFY_SYSTEM,
+                                                                       'system_type' => 'facebook_connection_invalid',
+                                                                       'language'     => $r[0]['language'],
+                                                                       'to_name'      => $r[0]['username'],
+                                                                       'to_email'     => $r[0]['email'],
+                                                                       'source_name'  => t('Administrator'),
+                                                                       'source_link'  => $a->config["system"]["url"],
+                                                                       'source_photo' => $a->config["system"]["url"] . '/images/person-80.jpg',
+                                                               ));
+                                                               
+                                                               set_pconfig($b['uid'], 'facebook', 'session_expired_mailsent', time());
+                                                       } else logger('Facebook: No notification, as the last one was sent on ' . $last_notification, LOGGER_DEBUG);
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
 }
 
+/**
+ * @param $app
+ * @param $data
+ */
 function facebook_enotify(&$app, &$data) {
-    if (x($data, 'params') && $data['params']['type'] == NOTIFY_SYSTEM && x($data['params'], 'system_type') && $data['params']['system_type'] == 'facebook_connection_invalid') {
-        $data['itemlink'] = '/facebook';
-        $data['epreamble'] = $data['preamble'] = t('Your Facebook connection became invalid. Please Re-authenticate.');
-        $data['subject'] = t('Facebook connection became invalid');
-        $data['body'] = sprintf( t("Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."), $data['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]", "[url=" . $app->config["system"]["url"] . "/facebook]", "[/url]");
-    }
+       if (x($data, 'params') && $data['params']['type'] == NOTIFY_SYSTEM && x($data['params'], 'system_type') && $data['params']['system_type'] == 'facebook_connection_invalid') {
+               $data['itemlink'] = '/facebook';
+               $data['epreamble'] = $data['preamble'] = t('Your Facebook connection became invalid. Please Re-authenticate.');
+               $data['subject'] = t('Facebook connection became invalid');
+               $data['body'] = sprintf( t("Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."), $data['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]", "[url=" . $app->config["system"]["url"] . "/facebook]", "[/url]");
+       }
 }
 
+/**
+ * @param $a
+ * @param $b
+ * @return mixed
+ */
 function facebook_post_local(&$a,&$b) {
 
-    // Figure out if Facebook posting is enabled for this post and file it in 'postopts'
-    // where we will discover it during background delivery.
+       // Figure out if Facebook posting is enabled for this post and file it in 'postopts'
+       // where we will discover it during background delivery.
 
-    // This can only be triggered by a local user posting to their own wall.
+       // This can only be triggered by a local user posting to their own wall.
 
-    if((local_user()) && (local_user() == $b['uid'])) {
+       if((local_user()) && (local_user() == $b['uid'])) {
 
-        $fb_post   = intval(get_pconfig(local_user(),'facebook','post'));
-        $fb_enable = (($fb_post && x($_REQUEST,'facebook_enable')) ? intval($_REQUEST['facebook_enable']) : 0);
+               $fb_post   = intval(get_pconfig(local_user(),'facebook','post'));
+               $fb_enable = (($fb_post && x($_REQUEST,'facebook_enable')) ? intval($_REQUEST['facebook_enable']) : 0);
 
-        // if API is used, default to the chosen settings
-        if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'facebook','post_by_default')))
-            $fb_enable = 1;
+               // if API is used, default to the chosen settings
+               if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'facebook','post_by_default')))
+                       $fb_enable = 1;
 
-        if(! $fb_enable)
-            return;
+               if(! $fb_enable)
+                       return;
 
-        if(strlen($b['postopts']))
-            $b['postopts'] .= ',';
-        $b['postopts'] .= 'facebook';
-    }
+               if(strlen($b['postopts']))
+                       $b['postopts'] .= ',';
+               $b['postopts'] .= 'facebook';
+       }
 }
 
 
+/**
+ * @param $a
+ * @param $b
+ * @return mixed
+ */
 function fb_queue_hook(&$a,&$b) {
 
-    $qi = q("SELECT * FROM `queue` WHERE `network` = '%s'",
-        dbesc(NETWORK_FACEBOOK)
-    );
-    if(! count($qi))
-        return;
+       $qi = q("SELECT * FROM `queue` WHERE `network` = '%s'",
+               dbesc(NETWORK_FACEBOOK)
+       );
+       if(! count($qi))
+               return;
 
-    require_once('include/queue_fn.php');
+       require_once('include/queue_fn.php');
 
-    foreach($qi as $x) {
-        if($x['network'] !== NETWORK_FACEBOOK)
-            continue;
+       foreach($qi as $x) {
+               if($x['network'] !== NETWORK_FACEBOOK)
+                       continue;
 
-        logger('facebook_queue: run');
+               logger('facebook_queue: run');
 
-        $r = q("SELECT `user`.* FROM `user` LEFT JOIN `contact` on `contact`.`uid` = `user`.`uid`
+               $r = q("SELECT `user`.* FROM `user` LEFT JOIN `contact` on `contact`.`uid` = `user`.`uid` 
                        WHERE `contact`.`self` = 1 AND `contact`.`id` = %d LIMIT 1",
-            intval($x['cid'])
-        );
-        if(! count($r))
-            continue;
-
-        $user = $r[0];
-
-        $appid  = get_config('facebook', 'appid'  );
-        $secret = get_config('facebook', 'appsecret' );
-
-        if($appid && $secret) {
-            $fb_post   = intval(get_pconfig($user['uid'],'facebook','post'));
-            $fb_token  = get_pconfig($user['uid'],'facebook','access_token');
-
-            if($fb_post && $fb_token) {
-                logger('facebook_queue: able to post');
-                require_once('library/facebook.php');
-
-                $z = unserialize($x['content']);
-                $item = $z['item'];
-                $j = post_url($z['url'],$z['post']);
-
-                $retj = json_decode($j);
-                if($retj->id) {
-                    q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d LIMIT 1",
-                        dbesc('fb::' . $retj->id),
-                        intval($item)
-                    );
-                    logger('facebook_queue: success: ' . $j);
-                    remove_queue_item($x['id']);
-                }
-                else {
-                    logger('facebook_queue: failed: ' . $j);
-                    update_queue_time($x['id']);
-                }
-            }
-        }
-    }
+                       intval($x['cid'])
+               );
+               if(! count($r))
+                       continue;
+
+               $user = $r[0];
+
+               $appid  = get_config('facebook', 'appid'  );
+               $secret = get_config('facebook', 'appsecret' );
+
+               if($appid && $secret) {
+                       $fb_post   = intval(get_pconfig($user['uid'],'facebook','post'));
+                       $fb_token  = get_pconfig($user['uid'],'facebook','access_token');
+
+                       if($fb_post && $fb_token) {
+                               logger('facebook_queue: able to post');
+                               require_once('library/facebook.php');
+
+                               $z = unserialize($x['content']);
+                               $item = $z['item'];
+                               $j = post_url($z['url'],$z['post']);
+
+                               $retj = json_decode($j);
+                               if($retj->id) {
+                                       q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d LIMIT 1",
+                                               dbesc('fb::' . $retj->id),
+                                               intval($item)
+                                       );
+                                       logger('facebook_queue: success: ' . $j); 
+                                       remove_queue_item($x['id']);
+                               }
+                               else {
+                                       logger('facebook_queue: failed: ' . $j);
+                                       update_queue_time($x['id']);
+                               }
+                       }
+               }
+       }
 }
 
+/**
+ * @param $access_token
+ * @param $since
+ * @return stdClass
+ */
 function fb_get_timeline($access_token, &$since) {
+
     $entries = new stdClass();
-    $entries->data = array();
-    $newest = 0;
+       $entries->data = array();
+       $newest = 0;
 
-    $url = 'https://graph.facebook.com/me/home?access_token='.$access_token;
+       $url = 'https://graph.facebook.com/me/home?access_token='.$access_token;
 
-    if ($since != 0)
-        $url .= "&since=".$since;
+       if ($since != 0)
+               $url .= "&since=".$since;
 
-    do {
-        $s = fetch_url($url);
-        $j = json_decode($s);
-        $oldestdate = time();
-        if (isset($j->data))
-            foreach ($j->data as $entry) {
-                $created = strtotime($entry->created_time);
+       do {
+               $s = fetch_url($url);
+               $j = json_decode($s);
+               $oldestdate = time();
+               if (isset($j->data))
+                       foreach ($j->data as $entry) {
+                               $created = strtotime($entry->created_time);
 
-                if ($newest < $created)
-                    $newest = $created;
+                               if ($newest < $created)
+                                       $newest = $created;
 
-                if ($created >= $since)
-                    $entries->data[] = $entry;
+                               if ($created >= $since)
+                                       $entries->data[] = $entry;
 
-                if ($created <= $oldestdate)
-                    $oldestdate = $created;
-            }
-        else
-            break;
+                               if ($created <= $oldestdate)
+                                       $oldestdate = $created;
+                       }
+               else
+                       break;
 
-        $url = $j->paging->next;
+               $url = $j->paging->next;
 
-    } while (($oldestdate > $since) and ($since != 0) and ($url != ''));
+       } while (($oldestdate > $since) and ($since != 0) and ($url != ''));
 
-    if ($newest > $since)
-        $since = $newest;
+       if ($newest > $since)
+               $since = $newest;
 
-    return($entries);
+       return($entries);
 }
 
+/**
+ * @param $uid
+ * @return mixed
+ */
 function fb_consume_all($uid) {
 
-    require_once('include/items.php');
-
-    $access_token = get_pconfig($uid,'facebook','access_token');
-    if(! $access_token)
-        return;
-
-    if(! get_pconfig($uid,'facebook','no_wall')) {
-        $private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
-        $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
-        if($s) {
-            $j = json_decode($s);
-            if (isset($j->data)) {
-                logger('fb_consume_stream: wall: ' . print_r($j,true), LOGGER_DATA);
-                fb_consume_stream($uid,$j,($private_wall) ? false : true);
-            } else {
-                logger('fb_consume_stream: wall: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
-            }
-        }
-    }
-    // Get the last date
-    $lastdate = get_pconfig($uid,'facebook','lastdate');
-    // fetch all items since the last date
-    $j = fb_get_timeline($access_token, &$lastdate);
-    if (isset($j->data)) {
-        logger('fb_consume_stream: feed: ' . print_r($j,true), LOGGER_DATA);
-        fb_consume_stream($uid,$j,false);
-
-        // Write back the last date
-        set_pconfig($uid,'facebook','lastdate', $lastdate);
-    } else
-        logger('fb_consume_stream: feed: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
+       require_once('include/items.php');
+
+       $access_token = get_pconfig($uid,'facebook','access_token');
+       if(! $access_token)
+               return;
+       
+       if(! get_pconfig($uid,'facebook','no_wall')) {
+               $private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
+               $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
+               if($s) {
+                       $j = json_decode($s);
+                       if (isset($j->data)) {
+                               logger('fb_consume_stream: wall: ' . print_r($j,true), LOGGER_DATA);
+                               fb_consume_stream($uid,$j,($private_wall) ? false : true);
+                       } else {
+                               logger('fb_consume_stream: wall: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
+                       }
+               }
+       }
+       // Get the last date
+       $lastdate = get_pconfig($uid,'facebook','lastdate');
+       // fetch all items since the last date
+       $j = fb_get_timeline($access_token, $lastdate);
+       if (isset($j->data)) {
+               logger('fb_consume_stream: feed: ' . print_r($j,true), LOGGER_DATA);
+               fb_consume_stream($uid,$j,false);
+
+               // Write back the last date
+               set_pconfig($uid,'facebook','lastdate', $lastdate);
+       } else
+               logger('fb_consume_stream: feed: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
 }
 
+/**
+ * @param $uid
+ * @param $link
+ * @return string
+ */
 function fb_get_photo($uid,$link) {
-    $access_token = get_pconfig($uid,'facebook','access_token');
-    if(! $access_token || (! stristr($link,'facebook.com/photo.php')))
-        return "";
-    //return "\n" . '[url=' . $link . ']' . t('link') . '[/url]';
-    $ret = preg_match('/fbid=([0-9]*)/',$link,$match);
-    if($ret)
-        $photo_id = $match[1];
-    $x = fetch_url('https://graph.facebook.com/' . $photo_id . '?access_token=' . $access_token);
-    $j = json_decode($x);
-    if($j->picture)
-        return "\n\n" . '[url=' . $link . '][img]' . $j->picture . '[/img][/url]';
-    //else
-    // return "\n" . '[url=' . $link . ']' . t('link') . '[/url]';
+       $access_token = get_pconfig($uid,'facebook','access_token');
+       if(! $access_token || (! stristr($link,'facebook.com/photo.php')))
+               return "";
+               //return "\n" . '[url=' . $link . ']' . t('link') . '[/url]';
+       $ret = preg_match('/fbid=([0-9]*)/',$link,$match);
+       if($ret)
+               $photo_id = $match[1];
+       else
+           return "";
+       $x = fetch_url('https://graph.facebook.com/' . $photo_id . '?access_token=' . $access_token);
+       $j = json_decode($x);
+       if($j->picture)
+               return "\n\n" . '[url=' . $link . '][img]' . $j->picture . '[/img][/url]';
+       //else
+       //      return "\n" . '[url=' . $link . ']' . t('link') . '[/url]';
 }
 
+/**
+ * @param $uid
+ * @param $j
+ * @param bool $wall
+ * @return mixed
+ */
 function fb_consume_stream($uid,$j,$wall = false) {
 
-    $a = get_app();
-
-
-    $user = q("SELECT * FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
-        intval($uid)
-    );
-    if(! count($user))
-        return;
-
-    $my_local_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
-
-    $no_linking = get_pconfig($uid,'facebook','no_linking');
-    if($no_linking)
-        return;
-
-    $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
-        intval($uid)
-    );
-
-    $blocked_apps = get_pconfig($uid,'facebook','blocked_apps');
-    $blocked_apps_arr = explode(',',$blocked_apps);
-
-    $self_id = get_pconfig($uid,'facebook','self_id');
-    if(! count($j->data) || (! strlen($self_id)))
-        return;
-
-    foreach($j->data as $entry) {
-        logger('fb_consume: entry: ' . print_r($entry,true), LOGGER_DATA);
-        $datarray = array();
-
-        $r = q("SELECT * FROM `item` WHERE ( `uri` = '%s' OR `extid` = '%s') AND `uid` = %d LIMIT 1",
-            dbesc('fb::' . $entry->id),
-            dbesc('fb::' . $entry->id),
-            intval($uid)
-        );
-        if(count($r)) {
-            $post_exists = true;
-            $orig_post = $r[0];
-            $top_item = $r[0]['id'];
-        }
-        else {
-            $post_exists = false;
-            $orig_post = null;
-        }
-
-        if(! $orig_post) {
-            $datarray['gravity'] = 0;
-            $datarray['uid'] = $uid;
-            $datarray['wall'] = (($wall) ? 1 : 0);
-            $datarray['uri'] = $datarray['parent-uri'] = 'fb::' . $entry->id;
-            $from = $entry->from;
-            if($from->id == $self_id)
-                $datarray['contact-id'] = $self[0]['id'];
-            else {
-                // Looking if user is known - if not he is added
-                $access_token = get_pconfig($uid, 'facebook', 'access_token');
-                fb_get_friends_sync_new($uid, $access_token, $from);
-
-                $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
-                    dbesc($from->id),
-                    intval($uid)
-                );
-                if(count($r))
-                    $datarray['contact-id'] = $r[0]['id'];
-            }
-
-            // don't store post if we don't have a contact
-            if(! x($datarray,'contact-id')) {
-                logger('facebook: no contact '.$from->name.' '.$from->id.'. post ignored');
-                continue;
-            }
-
-            $datarray['verb'] = ACTIVITY_POST;
-            if($wall) {
-                $datarray['owner-name'] = $self[0]['name'];
-                $datarray['owner-link'] = $self[0]['url'];
-                $datarray['owner-avatar'] = $self[0]['thumb'];
-            }
-            if(isset($entry->application) && isset($entry->application->name) && strlen($entry->application->name))
-                $datarray['app'] = strip_tags($entry->application->name);
-            else
-                $datarray['app'] = 'facebook';
-
-            $found_blocked = false;
-
-            if(count($blocked_apps_arr)) {
-                foreach($blocked_apps_arr as $bad_appl) {
-                    if(strlen(trim($bad_appl)) && (stristr($datarray['app'],trim($bad_appl)))) {
-                        $found_blocked = true;
-                    }
-                }
-            }
-
-            if($found_blocked) {
-                logger('facebook: blocking application: ' . $datarray['app']);
-                continue;
-            }
-
-            $datarray['author-name'] = $from->name;
-            $datarray['author-link'] = 'http://facebook.com/profile.php?id=' . $from->id;
-            $datarray['author-avatar'] = 'https://graph.facebook.com/' . $from->id . '/picture';
-            $datarray['plink'] = $datarray['author-link'] . '&v=wall&story_fbid=' . substr($entry->id,strpos($entry->id,'_') + 1);
-
-            logger('facebook: post '.$entry->id.' from '.$from->name);
-
-            $datarray['body'] = (x($entry, 'message') ? escape_tags($entry->message) : '');
-
-            if(x($entry, 'name') and x($entry, 'link'))
-                $datarray['body'] .= "\n\n[bookmark=".$entry->link."]".$entry->name."[/bookmark]";
-            elseif (x($entry, 'name'))
-                $datarray['body'] .= "\n\n[b]" . $entry->name."[/b]";
-
-            if(x($entry, 'caption')) {
-                if(!x($entry, 'name') and x($entry, 'link'))
-                    $datarray['body'] .= "\n\n[bookmark=".$entry->link."]".$entry->caption."[/bookmark]";
-                else
-                    $datarray['body'] .= "[i]" . $entry->caption."[/i]\n";
-            }
-
-            if(!x($entry, 'caption') and !x($entry, 'name')) {
-                if (x($entry, 'link'))
-                    $datarray['body'] .= "\n[url]".$entry->link."[/url]\n";
-                else
-                    $datarray['body'] .= "\n";
-            }
-
-            $quote = '';
-            if(x($entry, 'description'))
-                $quote = $entry->description;
-
-            if (x($entry, 'properties'))
-                foreach ($entry->properties as $property)
-                    $quote .= "\n".$property->name.": [url=".$property->href."]".$property->text."[/url]";
-
-            if ($quote)
-                $datarray['body'] .= "\n[quote]".$quote."[/quote]";
-
-            // Only import the picture when the message is no video
-            // oembed display a picture of the video as well
-            if ($entry->type != "video") {
-                if(x($entry, 'picture') && x($entry, 'link')) {
-                    $datarray['body'] .= "\n" . '[url=' . $entry->link . '][img]'.$entry->picture.'[/img][/url]';
-                }
-                else {
-                    if(x($entry, 'picture'))
-                        $datarray['body'] .= "\n" . '[img]' . $entry->picture . '[/img]';
-                    // if just a link, it may be a wall photo - check
-                    if(x($entry, 'link'))
-                        $datarray['body'] .= fb_get_photo($uid,$entry->link);
-                }
-            }
-
-            // Just as a test - to see if these are the missing entries
-            //if(trim($datarray['body']) == '')
-            // $datarray['body'] = $entry->story;
-
-            if(trim($datarray['body']) == '') {
-                logger('facebook: empty body '.$entry->id.' '.print_r($entry, true));
-                continue;
-            }
-
-            $datarray['body'] .= "\n";
-
-            if ($entry->icon)
-                $datarray['body'] .= "[img]".$entry->icon."[/img] &nbsp; ";
-
-            if ($entry->actions)
-                foreach ($entry->actions as $action)
-                    if (($action->name != "Comment") and ($action->name != "Like"))
-                        $datarray['body'] .= "[url=".$action->link."]".$action->name."[/url] &nbsp; ";
-
-            $datarray['body'] = trim($datarray['body']);
-
-            //if(($datarray['body'] != '') and ($uid == 1))
-            // $datarray['body'] .= "[noparse]".print_r($entry, true)."[/noparse]";
-
-            if ($entry->place->name)
-                $datarray['coord'] = $entry->place->name;
-            else if ($entry->place->location->street or $entry->place->location->city or $entry->place->location->Denmark) {
-                if ($entry->place->location->street)
-                    $datarray['coord'] = $entry->place->location->street;
-                if ($entry->place->location->city)
-                    $datarray['coord'] .= " ".$entry->place->location->city;
-                if ($entry->place->location->country)
-                    $datarray['coord'] .= " ".$entry->place->location->country;
-            } else if ($entry->place->location->latitude and $entry->place->location->longitude)
-                $datarray['coord'] = substr($entry->place->location->latitude, 0, 8)
-                    .' '.substr($entry->place->location->longitude, 0, 8);
-
-            $datarray['created'] = datetime_convert('UTC','UTC',$entry->created_time);
-            $datarray['edited'] = datetime_convert('UTC','UTC',$entry->updated_time);
-
-            // If the entry has a privacy policy, we cannot assume who can or cannot see it,
-            // as the identities are from a foreign system. Mark it as private to the owner.
-
-            if($entry->privacy && $entry->privacy->value !== 'EVERYONE') {
-                $datarray['private'] = 1;
-                $datarray['allow_cid'] = '<' . $self[0]['id'] . '>';
-            }
-
-            $top_item = item_store($datarray);
-            $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                intval($top_item),
-                intval($uid)
-            );
-            if(count($r)) {
-                $orig_post = $r[0];
-                logger('fb: new top level item posted');
-            }
-        }
-
-        if(isset($entry->likes) && isset($entry->likes->data))
-            $likers = $entry->likes->data;
-        else
-            $likers = null;
-
-        if(isset($entry->comments) && isset($entry->comments->data))
-            $comments = $entry->comments->data;
-        else
-            $comments = null;
-
-        if(is_array($likers)) {
-            foreach($likers as $likes) {
-
-                if(! $orig_post)
-                    continue;
-
-                // If we posted the like locally, it will be found with our url, not the FB url.
-
-                $second_url = (($likes->id == $self_id) ? $self[0]['url'] : 'http://facebook.com/profile.php?id=' . $likes->id);
-
-                $r = q("SELECT * FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `verb` = '%s'
+       $a = get_app();
+
+
+       $user = q("SELECT * FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
+               intval($uid)
+       );
+       if(! count($user))
+               return;
+
+       $my_local_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
+
+       $no_linking = get_pconfig($uid,'facebook','no_linking');
+       if($no_linking)
+               return;
+
+       $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
+               intval($uid)
+       );
+
+       $blocked_apps = get_pconfig($uid,'facebook','blocked_apps');
+       $blocked_apps_arr = explode(',',$blocked_apps);
+
+       $self_id = get_pconfig($uid,'facebook','self_id');
+       if(! count($j->data) || (! strlen($self_id)))
+               return;
+
+       foreach($j->data as $entry) {
+               logger('fb_consume: entry: ' . print_r($entry,true), LOGGER_DATA);
+               $datarray = array();
+
+               $r = q("SELECT * FROM `item` WHERE ( `uri` = '%s' OR `extid` = '%s') AND `uid` = %d LIMIT 1",
+                               dbesc('fb::' . $entry->id),
+                               dbesc('fb::' . $entry->id),
+                               intval($uid)
+               );
+               if(count($r)) {
+                       $post_exists = true;
+                       $orig_post = $r[0];
+                       $top_item = $r[0]['id'];
+               }
+               else {
+                       $post_exists = false;
+                       $orig_post = null;
+               }
+
+               if(! $orig_post) {
+                       $datarray['gravity'] = 0;
+                       $datarray['uid'] = $uid;
+                       $datarray['wall'] = (($wall) ? 1 : 0);
+                       $datarray['uri'] = $datarray['parent-uri'] = 'fb::' . $entry->id;
+                       $from = $entry->from;
+                       if($from->id == $self_id)
+                               $datarray['contact-id'] = $self[0]['id'];
+                       else {
+                               // Looking if user is known - if not he is added
+                               $access_token = get_pconfig($uid, 'facebook', 'access_token');
+                               fb_get_friends_sync_new($uid, $access_token, $from);
+
+                               $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
+                                       dbesc($from->id),
+                                       intval($uid)
+                               );
+                               if(count($r))
+                                       $datarray['contact-id'] = $r[0]['id'];
+                       }
+
+                       // don't store post if we don't have a contact
+                       if(! x($datarray,'contact-id')) {
+                               logger('facebook: no contact '.$from->name.' '.$from->id.'. post ignored');
+                               continue;
+                       }
+
+                       $datarray['verb'] = ACTIVITY_POST;
+                       if($wall) {
+                               $datarray['owner-name'] = $self[0]['name'];
+                               $datarray['owner-link'] = $self[0]['url'];
+                               $datarray['owner-avatar'] = $self[0]['thumb'];
+                       }
+                       if(isset($entry->application) && isset($entry->application->name) && strlen($entry->application->name))
+                               $datarray['app'] = strip_tags($entry->application->name);
+                       else
+                               $datarray['app'] = 'facebook';
+
+                       $found_blocked = false;
+
+                       if(count($blocked_apps_arr)) {
+                               foreach($blocked_apps_arr as $bad_appl) {
+                                       if(strlen(trim($bad_appl)) && (stristr($datarray['app'],trim($bad_appl)))) {
+                                               $found_blocked = true;
+                                       }
+                               }
+                       }
+                               
+                       if($found_blocked) {
+                               logger('facebook: blocking application: ' . $datarray['app']);
+                               continue;
+                       }
+
+                       $datarray['author-name'] = $from->name;
+                       $datarray['author-link'] = 'http://facebook.com/profile.php?id=' . $from->id;
+                       $datarray['author-avatar'] = 'https://graph.facebook.com/' . $from->id . '/picture';
+                       $datarray['plink'] = $datarray['author-link'] . '&v=wall&story_fbid=' . substr($entry->id,strpos($entry->id,'_') + 1);
+
+                       logger('facebook: post '.$entry->id.' from '.$from->name);
+
+                       $datarray['body'] = escape_tags($entry->message);
+
+                       if($entry->name and $entry->link)
+                               $datarray['body'] .= "\n\n[bookmark=".$entry->link."]".$entry->name."[/bookmark]";
+                       elseif ($entry->name)
+                               $datarray['body'] .= "\n\n[b]" . $entry->name."[/b]";
+
+                       if($entry->caption) {
+                               if(!$entry->name and $entry->link)
+                                       $datarray['body'] .= "\n\n[bookmark=".$entry->link."]".$entry->caption."[/bookmark]";
+                               else
+                                       $datarray['body'] .= "[i]" . $entry->caption."[/i]\n";
+                       }
+
+                       if(!$entry->caption and !$entry->name) {
+                               if ($entry->link)
+                                       $datarray['body'] .= "\n[url]".$entry->link."[/url]\n";
+                               else
+                                       $datarray['body'] .= "\n";
+                       }
+
+                       $quote = "";
+                       if($entry->description)
+                               $quote = $entry->description;
+
+                       if ($entry->properties)
+                               foreach ($entry->properties as $property)
+                                       $quote .= "\n".$property->name.": [url=".$property->href."]".$property->text."[/url]";
+
+                       if ($quote)
+                               $datarray['body'] .= "\n[quote]".$quote."[/quote]";
+
+                       // Only import the picture when the message is no video
+                       // oembed display a picture of the video as well 
+                       if ($entry->type != "video") {
+                               if($entry->picture && $entry->link) {
+                                       $datarray['body'] .= "\n" . '[url=' . $entry->link . '][img]'.$entry->picture.'[/img][/url]';   
+                               }
+                               else {
+                                       if($entry->picture)
+                                               $datarray['body'] .= "\n" . '[img]' . $entry->picture . '[/img]';
+                                       // if just a link, it may be a wall photo - check
+                                       if($entry->link)
+                                               $datarray['body'] .= fb_get_photo($uid,$entry->link);
+                               }
+                       }
+
+                       if (($datarray['app'] == "Events") and $entry->actions)
+                               foreach ($entry->actions as $action)
+                                       if ($action->name == "View")
+                                               $datarray['body'] .= " [url=".$action->link."]".$entry->story."[/url]";
+
+                       // Just as a test - to see if these are the missing entries
+                       //if(trim($datarray['body']) == '')
+                       //      $datarray['body'] = $entry->story;
+
+                       // Adding the "story" text to see if there are useful data in it (testing)
+                       //if (($datarray['app'] != "Events") and $entry->story)
+                       //      $datarray['body'] .= "\n".$entry->story;
+
+                       if(trim($datarray['body']) == '') {
+                               logger('facebook: empty body '.$entry->id.' '.print_r($entry, true));
+                               continue;
+                       }
+
+                       $datarray['body'] .= "\n";
+
+                       if ($entry->icon)
+                               $datarray['body'] .= "[img]".$entry->icon."[/img] &nbsp; ";
+
+                       if ($entry->actions)
+                               foreach ($entry->actions as $action)
+                                       if (($action->name != "Comment") and ($action->name != "Like"))
+                                               $datarray['body'] .= "[url=".$action->link."]".$action->name."[/url] &nbsp; ";
+
+                       $datarray['body'] = trim($datarray['body']);
+
+                       //if(($datarray['body'] != '') and ($uid == 1))
+                       //      $datarray['body'] .= "[noparse]".print_r($entry, true)."[/noparse]";
+
+                       if ($entry->place->name or $entry->place->location->street or 
+                               $entry->place->location->city or $entry->place->location->Denmark) {
+                               $datarray['coord'] = '';
+                               if ($entry->place->name)
+                                       $datarray['coord'] .= $entry->place->name;
+                               if ($entry->place->location->street)
+                                       $datarray['coord'] .= $entry->place->location->street;
+                               if ($entry->place->location->city)
+                                       $datarray['coord'] .= " ".$entry->place->location->city;
+                               if ($entry->place->location->country)
+                                       $datarray['coord'] .= " ".$entry->place->location->country;
+                       } else if ($entry->place->location->latitude and $entry->place->location->longitude)
+                               $datarray['coord'] = substr($entry->place->location->latitude, 0, 8)
+                                                       .' '.substr($entry->place->location->longitude, 0, 8);
+
+                       $datarray['created'] = datetime_convert('UTC','UTC',$entry->created_time);
+                       $datarray['edited'] = datetime_convert('UTC','UTC',$entry->updated_time);
+
+                       // If the entry has a privacy policy, we cannot assume who can or cannot see it,
+                       // as the identities are from a foreign system. Mark it as private to the owner.
+
+                       if($entry->privacy && $entry->privacy->value !== 'EVERYONE') {
+                               $datarray['private'] = 1;
+                               $datarray['allow_cid'] = '<' . $self[0]['id'] . '>';
+                       }
+
+                       $top_item = item_store($datarray);
+                       $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+                               intval($top_item),
+                               intval($uid)
+                       );
+                       if(count($r)) {
+                               $orig_post = $r[0];
+                               logger('fb: new top level item posted');
+                       }
+               }
+
+               if(isset($entry->likes) && isset($entry->likes->data))
+                       $likers = $entry->likes->data;
+               else
+                       $likers = null;
+
+               if(isset($entry->comments) && isset($entry->comments->data))
+                       $comments = $entry->comments->data;
+               else
+                       $comments = null;
+
+               if(is_array($likers)) {
+                       foreach($likers as $likes) {
+
+                               if(! $orig_post)
+                                       continue;
+
+                               // If we posted the like locally, it will be found with our url, not the FB url.
+
+                               $second_url = (($likes->id == $self_id) ? $self[0]['url'] : 'http://facebook.com/profile.php?id=' . $likes->id); 
+
+                               $r = q("SELECT * FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `verb` = '%s' 
                                        AND ( `author-link` = '%s' OR `author-link` = '%s' ) LIMIT 1",
-                    dbesc($orig_post['uri']),
-                    intval($uid),
-                    dbesc(ACTIVITY_LIKE),
-                    dbesc('http://facebook.com/profile.php?id=' . $likes->id),
-                    dbesc($second_url)
-                );
-
-                if(count($r))
-                    continue;
-
-                $likedata = array();
-                $likedata['parent'] = $top_item;
-                $likedata['verb'] = ACTIVITY_LIKE;
-                $likedata['gravity'] = 3;
-                $likedata['uid'] = $uid;
-                $likedata['wall'] = (($wall) ? 1 : 0);
-                $likedata['uri'] = item_new_uri($a->get_baseurl(), $uid);
-                $likedata['parent-uri'] = $orig_post['uri'];
-                if($likes->id == $self_id)
-                    $likedata['contact-id'] = $self[0]['id'];
-                else {
-                    $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
-                        dbesc($likes->id),
-                        intval($uid)
-                    );
-                    if(count($r))
-                        $likedata['contact-id'] = $r[0]['id'];
-                }
-                if(! x($likedata,'contact-id'))
-                    $likedata['contact-id'] = $orig_post['contact-id'];
-
-                $likedata['app'] = 'facebook';
-                $likedata['verb'] = ACTIVITY_LIKE;
-                $likedata['author-name'] = $likes->name;
-                $likedata['author-link'] = 'http://facebook.com/profile.php?id=' . $likes->id;
-                $likedata['author-avatar'] = 'https://graph.facebook.com/' . $likes->id . '/picture';
-
-                $author  = '[url=' . $likedata['author-link'] . ']' . $likedata['author-name'] . '[/url]';
-                $objauthor =  '[url=' . $orig_post['author-link'] . ']' . $orig_post['author-name'] . '[/url]';
-                $post_type = t('status');
-                $plink = '[url=' . $orig_post['plink'] . ']' . $post_type . '[/url]';
-                $likedata['object-type'] = ACTIVITY_OBJ_NOTE;
-
-                $likedata['body'] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
-                $likedata['object'] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' .
-                    '<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . xmlify($orig_post['plink']) . '" />') . '</link><title>' . $orig_post['title'] . '</title><content>' . $orig_post['body'] . '</content></object>';
-
-                $item = item_store($likedata);
-            }
-        }
-        if(is_array($comments)) {
-            foreach($comments as $cmnt) {
-
-                if(! $orig_post)
-                    continue;
-
-                $r = q("SELECT * FROM `item` WHERE `uid` = %d AND ( `uri` = '%s' OR `extid` = '%s' ) LIMIT 1",
-                    intval($uid),
-                    dbesc('fb::' . $cmnt->id),
-                    dbesc('fb::' . $cmnt->id)
-                );
-                if(count($r))
-                    continue;
-
-                $cmntdata = array();
-                $cmntdata['parent'] = $top_item;
-                $cmntdata['verb'] = ACTIVITY_POST;
-                $cmntdata['gravity'] = 6;
-                $cmntdata['uid'] = $uid;
-                $cmntdata['wall'] = (($wall) ? 1 : 0);
-                $cmntdata['uri'] = 'fb::' . $cmnt->id;
-                $cmntdata['parent-uri'] = $orig_post['uri'];
-                if($cmnt->from->id == $self_id) {
-                    $cmntdata['contact-id'] = $self[0]['id'];
-                }
-                else {
-                    $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d LIMIT 1",
-                        dbesc($cmnt->from->id),
-                        intval($uid)
-                    );
-                    if(count($r)) {
-                        $cmntdata['contact-id'] = $r[0]['id'];
-                        if($r[0]['blocked'] || $r[0]['readonly'])
-                            continue;
-                    }
-                }
-                if(! x($cmntdata,'contact-id'))
-                    $cmntdata['contact-id'] = $orig_post['contact-id'];
-
-                $cmntdata['app'] = 'facebook';
-                $cmntdata['created'] = datetime_convert('UTC','UTC',$cmnt->created_time);
-                $cmntdata['edited']  = datetime_convert('UTC','UTC',$cmnt->created_time);
-                $cmntdata['verb'] = ACTIVITY_POST;
-                $cmntdata['author-name'] = $cmnt->from->name;
-                $cmntdata['author-link'] = 'http://facebook.com/profile.php?id=' . $cmnt->from->id;
-                $cmntdata['author-avatar'] = 'https://graph.facebook.com/' . $cmnt->from->id . '/picture';
-                $cmntdata['body'] = $cmnt->message;
-                $item = item_store($cmntdata);
-
-                $myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 ",
-                    dbesc($orig_post['uri']),
-                    intval($uid)
-                );
-
-                if(count($myconv)) {
-                    $importer_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
-
-                    foreach($myconv as $conv) {
-
-                        // now if we find a match, it means we're in this conversation
-
-                        if(! link_compare($conv['author-link'],$importer_url))
-                            continue;
-
-                        require_once('include/enotify.php');
-
-                        $conv_parent = $conv['parent'];
-
-                        notification(array(
-                            'type'         => NOTIFY_COMMENT,
-                            'notify_flags' => $user[0]['notify-flags'],
-                            'language'     => $user[0]['language'],
-                            'to_name'      => $user[0]['username'],
-                            'to_email'     => $user[0]['email'],
-                            'uid'          => $user[0]['uid'],
-                            'item'         => $cmntdata,
-                            'link'                => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $item,
-                            'source_name'  => $cmntdata['author-name'],
-                            'source_link'  => $cmntdata['author-link'],
-                            'source_photo' => $cmntdata['author-avatar'],
-                            'verb'         => ACTIVITY_POST,
-                            'otype'        => 'item',
-                            'parent'       => $conv_parent,
-                        ));
-
-                        // only send one notification
-                        break;
-                    }
-                }
-            }
-        }
-    }
+                                       dbesc($orig_post['uri']),
+                                       intval($uid),
+                                       dbesc(ACTIVITY_LIKE),
+                                       dbesc('http://facebook.com/profile.php?id=' . $likes->id),
+                                       dbesc($second_url)
+                               );
+
+                               if(count($r))
+                                       continue;
+                                       
+                               $likedata = array();
+                               $likedata['parent'] = $top_item;
+                               $likedata['verb'] = ACTIVITY_LIKE;
+                               $likedata['gravity'] = 3;
+                               $likedata['uid'] = $uid;
+                               $likedata['wall'] = (($wall) ? 1 : 0);
+                               $likedata['uri'] = item_new_uri($a->get_baseurl(), $uid);
+                               $likedata['parent-uri'] = $orig_post['uri'];
+                               if($likes->id == $self_id)
+                                       $likedata['contact-id'] = $self[0]['id'];
+                               else {
+                                       $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
+                                               dbesc($likes->id),
+                                               intval($uid)
+                                       );
+                                       if(count($r))
+                                               $likedata['contact-id'] = $r[0]['id'];
+                               }
+                               if(! x($likedata,'contact-id'))
+                                       $likedata['contact-id'] = $orig_post['contact-id'];
+
+                               $likedata['app'] = 'facebook';
+                               $likedata['verb'] = ACTIVITY_LIKE;                                              
+                               $likedata['author-name'] = $likes->name;
+                               $likedata['author-link'] = 'http://facebook.com/profile.php?id=' . $likes->id;
+                               $likedata['author-avatar'] = 'https://graph.facebook.com/' . $likes->id . '/picture';
+                               
+                               $author  = '[url=' . $likedata['author-link'] . ']' . $likedata['author-name'] . '[/url]';
+                               $objauthor =  '[url=' . $orig_post['author-link'] . ']' . $orig_post['author-name'] . '[/url]';
+                               $post_type = t('status');
+                       $plink = '[url=' . $orig_post['plink'] . ']' . $post_type . '[/url]';
+                               $likedata['object-type'] = ACTIVITY_OBJ_NOTE;
+
+                               $likedata['body'] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
+                               $likedata['object'] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' . 
+                                       '<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . xmlify($orig_post['plink']) . '" />') . '</link><title>' . $orig_post['title'] . '</title><content>' . $orig_post['body'] . '</content></object>';  
+
+                               $item = item_store($likedata);                  
+                       }
+               }
+               if(is_array($comments)) {
+                       foreach($comments as $cmnt) {
+
+                               if(! $orig_post)
+                                       continue;
+
+                               $r = q("SELECT * FROM `item` WHERE `uid` = %d AND ( `uri` = '%s' OR `extid` = '%s' ) LIMIT 1",
+                                       intval($uid),
+                                       dbesc('fb::' . $cmnt->id),
+                                       dbesc('fb::' . $cmnt->id)
+                               );
+                               if(count($r))
+                                       continue;
+
+                               $cmntdata = array();
+                               $cmntdata['parent'] = $top_item;
+                               $cmntdata['verb'] = ACTIVITY_POST;
+                               $cmntdata['gravity'] = 6;
+                               $cmntdata['uid'] = $uid;
+                               $cmntdata['wall'] = (($wall) ? 1 : 0);
+                               $cmntdata['uri'] = 'fb::' . $cmnt->id;
+                               $cmntdata['parent-uri'] = $orig_post['uri'];
+                               if($cmnt->from->id == $self_id) {
+                                       $cmntdata['contact-id'] = $self[0]['id'];
+                               }
+                               else {
+                                       $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d LIMIT 1",
+                                               dbesc($cmnt->from->id),
+                                               intval($uid)
+                                       );
+                                       if(count($r)) {
+                                               $cmntdata['contact-id'] = $r[0]['id'];
+                                               if($r[0]['blocked'] || $r[0]['readonly'])
+                                                       continue;
+                                       }
+                               }
+                               if(! x($cmntdata,'contact-id'))
+                                       $cmntdata['contact-id'] = $orig_post['contact-id'];
+
+                               $cmntdata['app'] = 'facebook';
+                               $cmntdata['created'] = datetime_convert('UTC','UTC',$cmnt->created_time);
+                               $cmntdata['edited']  = datetime_convert('UTC','UTC',$cmnt->created_time);
+                               $cmntdata['verb'] = ACTIVITY_POST;                                              
+                               $cmntdata['author-name'] = $cmnt->from->name;
+                               $cmntdata['author-link'] = 'http://facebook.com/profile.php?id=' . $cmnt->from->id;
+                               $cmntdata['author-avatar'] = 'https://graph.facebook.com/' . $cmnt->from->id . '/picture';
+                               $cmntdata['body'] = $cmnt->message;
+                               $item = item_store($cmntdata);                  
+                               
+                               $myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 ",
+                                       dbesc($orig_post['uri']),
+                                       intval($uid)
+                               );
+
+                               if(count($myconv)) {
+                                       $importer_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
+
+                                       foreach($myconv as $conv) {
+
+                                               // now if we find a match, it means we're in this conversation
+       
+                                               if(! link_compare($conv['author-link'],$importer_url))
+                                                       continue;
+
+                                               require_once('include/enotify.php');
+                                                               
+                                               $conv_parent = $conv['parent'];
+
+                                               notification(array(
+                                                       'type'         => NOTIFY_COMMENT,
+                                                       'notify_flags' => $user[0]['notify-flags'],
+                                                       'language'     => $user[0]['language'],
+                                                       'to_name'      => $user[0]['username'],
+                                                       'to_email'     => $user[0]['email'],
+                                                       'uid'          => $user[0]['uid'],
+                                                       'item'         => $cmntdata,
+                                                       'link'             => $a->get_baseurl() . '/display/' . $user[0]['nickname'] . '/' . $item,
+                                                       'source_name'  => $cmntdata['author-name'],
+                                                       'source_link'  => $cmntdata['author-link'],
+                                                       'source_photo' => $cmntdata['author-avatar'],
+                                                       'verb'         => ACTIVITY_POST,
+                                                       'otype'        => 'item',
+                                                       'parent'       => $conv_parent,
+                                               ));
+
+                                               // only send one notification
+                                               break;
+                                       }
+                               }
+                       }
+               }
+       }
 }
 
 
+/**
+ * @return bool|mixed|string
+ */
 function fb_get_app_access_token() {
-
-    $acc_token = get_config('facebook','app_access_token');
-
-    if ($acc_token !== false) return $acc_token;
-
-    $appid = get_config('facebook','appid');
-    $appsecret = get_config('facebook', 'appsecret');
-
-    if ($appid === false || $appsecret === false) {
-        logger('fb_get_app_access_token: appid and/or appsecret not set', LOGGER_DEBUG);
-        return false;
-    }
-    logger('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . '&grant_type=client_credentials', LOGGER_DATA);
-    $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . '&grant_type=client_credentials');
-
-    if(strpos($x,'access_token=') !== false) {
-        logger('fb_get_app_access_token: returned access token: ' . $x, LOGGER_DATA);
-
-        $token = str_replace('access_token=', '', $x);
-        if(strpos($token,'&') !== false)
-            $token = substr($token,0,strpos($token,'&'));
-
-        if ($token == "") {
-            logger('fb_get_app_access_token: empty token: ' . $x, LOGGER_DEBUG);
-            return false;
-        }
-        set_config('facebook','app_access_token',$token);
-        return $token;
-    } else {
-        logger('fb_get_app_access_token: response did not contain an access_token: ' . $x, LOGGER_DATA);
-        return false;
-    }
+       
+       $acc_token = get_config('facebook','app_access_token');
+       
+       if ($acc_token !== false) return $acc_token;
+       
+       $appid = get_config('facebook','appid');
+       $appsecret = get_config('facebook', 'appsecret');
+       
+       if ($appid === false || $appsecret === false) {
+               logger('fb_get_app_access_token: appid and/or appsecret not set', LOGGER_DEBUG);
+               return false;
+       }
+       logger('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . '&grant_type=client_credentials', LOGGER_DATA);
+       $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . '&grant_type=client_credentials');
+       
+       if(strpos($x,'access_token=') !== false) {
+               logger('fb_get_app_access_token: returned access token: ' . $x, LOGGER_DATA);
+       
+               $token = str_replace('access_token=', '', $x);
+               if(strpos($token,'&') !== false)
+                       $token = substr($token,0,strpos($token,'&'));
+               
+               if ($token == "") {
+                       logger('fb_get_app_access_token: empty token: ' . $x, LOGGER_DEBUG);
+                       return false;
+               }
+               set_config('facebook','app_access_token',$token);
+               return $token;
+       } else {
+               logger('fb_get_app_access_token: response did not contain an access_token: ' . $x, LOGGER_DATA);
+               return false;
+       }
 }
 
+/**
+ *
+ */
 function facebook_subscription_del_users() {
-    $a = get_app();
-    $access_token = fb_get_app_access_token();
-
-    $url = "https://graph.facebook.com/" . get_config('facebook', 'appid'  ) . "/subscriptions?access_token=" . $access_token;
-    facebook_delete_url($url);
-
-    if (!facebook_check_realtime_active()) del_config('facebook', 'realtime_active');
+       $a = get_app();
+       $access_token = fb_get_app_access_token();
+       
+       $url = "https://graph.facebook.com/" . get_config('facebook', 'appid'  ) . "/subscriptions?access_token=" . $access_token;
+       facebook_delete_url($url);
+       
+       if (!facebook_check_realtime_active()) del_config('facebook', 'realtime_active');
 }
 
+/**
+ * @param bool $second_try
+ */
 function facebook_subscription_add_users($second_try = false) {
-    $a = get_app();
-    $access_token = fb_get_app_access_token();
-
-    $url = "https://graph.facebook.com/" . get_config('facebook', 'appid'  ) . "/subscriptions?access_token=" . $access_token;
-
-    list($usec, $sec) = explode(" ", microtime());
-    $verify_token = sha1($usec . $sec . rand(0, 999999999));
-    set_config('facebook', 'cb_verify_token', $verify_token);
-
-    $cb = $a->get_baseurl() . '/facebook/?realtime_cb=1';
-
-    $j = post_url($url,array(
-        "object" => "user",
-        "fields" => "feed,friends",
-        "callback_url" => $cb,
-        "verify_token" => $verify_token,
-    ));
-    del_config('facebook', 'cb_verify_token');
-
-    if ($j) {
-        $x = json_decode($j);
-        logger("Facebook reponse: " . $j, LOGGER_DATA);
-        if (isset($x->error)) {
-            logger('facebook_subscription_add_users: got an error: ' . $j);
-            if ($x->error->type == "OAuthException" && $x->error->code == 190) {
-                del_config('facebook', 'app_access_token');
-                if ($second_try === false) facebook_subscription_add_users(true);
-            }
-        } else {
-            logger('facebook_subscription_add_users: sucessful');
-            if (facebook_check_realtime_active()) set_config('facebook', 'realtime_active', 1);
-        }
-    };
+       $a = get_app();
+       $access_token = fb_get_app_access_token();
+       
+       $url = "https://graph.facebook.com/" . get_config('facebook', 'appid'  ) . "/subscriptions?access_token=" . $access_token;
+       
+       list($usec, $sec) = explode(" ", microtime());
+       $verify_token = sha1($usec . $sec . rand(0, 999999999));
+       set_config('facebook', 'cb_verify_token', $verify_token);
+       
+       $cb = $a->get_baseurl() . '/facebook/?realtime_cb=1';
+       
+       $j = post_url($url,array(
+               "object" => "user",
+               "fields" => "feed,friends",
+               "callback_url" => $cb,
+               "verify_token" => $verify_token,
+       ));
+       del_config('facebook', 'cb_verify_token');
+       
+       if ($j) {
+               $x = json_decode($j);
+               logger("Facebook reponse: " . $j, LOGGER_DATA);
+               if (isset($x->error)) {
+                       logger('facebook_subscription_add_users: got an error: ' . $j);
+                       if ($x->error->type == "OAuthException" && $x->error->code == 190) {
+                               del_config('facebook', 'app_access_token');
+                               if ($second_try === false) facebook_subscription_add_users(true);
+                       }
+               } else {
+                       logger('facebook_subscription_add_users: sucessful');
+                       if (facebook_check_realtime_active()) set_config('facebook', 'realtime_active', 1);
+               }
+       };
 }
 
+/**
+ * @return null
+ */
 function facebook_subscriptions_get() {
-
-    $access_token = fb_get_app_access_token();
-    if (!$access_token) return null;
-
-    $url = "https://graph.facebook.com/" . get_config('facebook', 'appid'  ) . "/subscriptions?access_token=" . $access_token;
-    $j = fetch_url($url);
-    $ret = null;
-    if ($j) {
-        $x = json_decode($j);
-        if (isset($x->data)) $ret = $x->data;
-    }
-    return $ret;
+       
+       $access_token = fb_get_app_access_token();
+       if (!$access_token) return null;
+       
+       $url = "https://graph.facebook.com/" . get_config('facebook', 'appid'  ) . "/subscriptions?access_token=" . $access_token;
+       $j = fetch_url($url);
+       $ret = null;
+       if ($j) {
+               $x = json_decode($j);
+               if (isset($x->data)) $ret = $x->data;
+       }
+       return $ret;
 }
 
 
+/**
+ * @return bool
+ */
 function facebook_check_realtime_active() {
-    $ret = facebook_subscriptions_get();
-    if (is_null($ret)) return false;
-    if (is_array($ret)) foreach ($ret as $re) if (is_object($re) && $re->object == "user") return true;
-    return false;
+       $ret = facebook_subscriptions_get();
+       if (is_null($ret)) return false;
+       if (is_array($ret)) foreach ($ret as $re) if (is_object($re) && $re->object == "user") return true;
+       return false;
 }
 
 
@@ -1749,85 +1891,92 @@ function facebook_check_realtime_active() {
 // DELETE-request to $url
 
 if(! function_exists('facebook_delete_url')) {
+    /**
+     * @param $url
+     * @param null $headers
+     * @param int $redirects
+     * @param int $timeout
+     * @return bool|string
+     */
     function facebook_delete_url($url,$headers = null, &$redirects = 0, $timeout = 0) {
-        $a = get_app();
-        $ch = curl_init($url);
-        if(($redirects > 8) || (! $ch))
-            return false;
-
-        curl_setopt($ch, CURLOPT_HEADER, true);
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
-        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
-        curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
-
-        if(intval($timeout)) {
-            curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
-        }
-        else {
-            $curl_time = intval(get_config('system','curl_timeout'));
-            curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
-        }
-
-        if(defined('LIGHTTPD')) {
-            if(!is_array($headers)) {
-                $headers = array('Expect:');
-            } else {
-                if(!in_array('Expect:', $headers)) {
-                    array_push($headers, 'Expect:');
-                }
-            }
-        }
-        if($headers)
-            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
-        $check_cert = get_config('system','verifyssl');
-        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
-        $prx = get_config('system','proxy');
-        if(strlen($prx)) {
-            curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
-            curl_setopt($ch, CURLOPT_PROXY, $prx);
-            $prxusr = get_config('system','proxyuser');
-            if(strlen($prxusr))
-                curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
-        }
-
-        $a->set_curl_code(0);
-
-        // don't let curl abort the entire application
-        // if it throws any errors.
-
-        $s = @curl_exec($ch);
-
-        $base = $s;
-        $curl_info = curl_getinfo($ch);
-        $http_code = $curl_info['http_code'];
-
-        $header = '';
-
-        // Pull out multiple headers, e.g. proxy and continuation headers
-        // allow for HTTP/2.x without fixing code
-
-        while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
-            $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
-            $header .= $chunk;
-            $base = substr($base,strlen($chunk));
+       $a = get_app();
+       $ch = curl_init($url);
+       if(($redirects > 8) || (! $ch)) 
+               return false;
+
+       curl_setopt($ch, CURLOPT_HEADER, true);
+       curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
+       curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
+       curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
+
+       if(intval($timeout)) {
+               curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+       }
+       else {
+               $curl_time = intval(get_config('system','curl_timeout'));
+               curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
+       }
+
+       if(defined('LIGHTTPD')) {
+               if(!is_array($headers)) {
+                       $headers = array('Expect:');
+               } else {
+                       if(!in_array('Expect:', $headers)) {
+                               array_push($headers, 'Expect:');
+                       }
+               }
+       }
+       if($headers)
+               curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+
+       $check_cert = get_config('system','verifyssl');
+       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
+       $prx = get_config('system','proxy');
+       if(strlen($prx)) {
+               curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
+               curl_setopt($ch, CURLOPT_PROXY, $prx);
+               $prxusr = get_config('system','proxyuser');
+               if(strlen($prxusr))
+                       curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
+       }
+
+       $a->set_curl_code(0);
+
+       // don't let curl abort the entire application
+       // if it throws any errors.
+
+       $s = @curl_exec($ch);
+
+       $base = $s;
+       $curl_info = curl_getinfo($ch);
+       $http_code = $curl_info['http_code'];
+
+       $header = '';
+
+       // Pull out multiple headers, e.g. proxy and continuation headers
+       // allow for HTTP/2.x without fixing code
+
+       while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
+               $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
+               $header .= $chunk;
+               $base = substr($base,strlen($chunk));
+       }
+
+       if($http_code == 301 || $http_code == 302 || $http_code == 303) {
+        $matches = array();
+        preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
+        $url = trim(array_pop($matches));
+        $url_parsed = @parse_url($url);
+        if (isset($url_parsed)) {
+            $redirects++;
+            return facebook_delete_url($url,$headers,$redirects,$timeout);
         }
+    }
+       $a->set_curl_code($http_code);
+       $body = substr($s,strlen($header));
 
-        if($http_code == 301 || $http_code == 302 || $http_code == 303) {
-            $matches = array();
-            preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
-            $url = trim(array_pop($matches));
-            $url_parsed = @parse_url($url);
-            if (isset($url_parsed)) {
-                $redirects++;
-                return delete_url($url,$headers,$redirects,$timeout);
-            }
-        }
-        $a->set_curl_code($http_code);
-        $body = substr($s,strlen($header));
-
-        $a->set_curl_headers($header);
+       $a->set_curl_headers($header);
 
-        curl_close($ch);
-        return($body);
-    }}
+       curl_close($ch);
+       return($body);
+}}
diff --git a/gravatar.tgz b/gravatar.tgz
new file mode 100644 (file)
index 0000000..38e942f
Binary files /dev/null and b/gravatar.tgz differ
diff --git a/gravatar/README.md b/gravatar/README.md
new file mode 100644 (file)
index 0000000..ff209b0
--- /dev/null
@@ -0,0 +1,42 @@
+# Gravatar Plugin
+by [Klaus Weidenbach](http://friendica.dszdw.net/profile/klaus)
+
+This addon allows you to look up an avatar image for new users and contacts at [Gravatar](http://www.gravatar.com). This will be used if there have not been found any other avatar images yet for example through OpenID.
+
+Gravatar is a popular, but centralized and proprietary service where people can store an avatar image for their email-addresses. It is widely used on many pages, for example to display an avatar for comment functions, profile pages, etc.
+
+* * *
+
+# Configuration
+## Default Avatar Image
+If no avatar was found for an email Gravatar can create some pseudo-random generated avatars based on an email hash. You can choose between these presets:
+
+* __Gravatar__: default static Gravatar logo
+* __MM__: (mystery-man) a static image
+* __Identicon__: a generated geometric pattern based on email hash
+* __Monsterid__: a generated 'monster' with different colors, faces, etc. based on email hash
+* __Wavatar__: faces with different features and backgrounds based on email hash
+* __Retro__: 8-bit arcade-styled pixelated faces based on email hash
+
+See examples at [Gravatar][1].
+## Avatar Rating
+Gravatar lets users self-rate their images to be used at appropriate audiences. Choose which are appropriate for your friendica site:
+
+* __g__: suitable for display on all wesites with any audience type
+* __pg__: may contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violence
+* __r__: may contain such things as harsh profanity, intense violence, nudity, or hard drug use
+* __x__: may contain hardcore sexual imagery or extremely disurbing violence
+
+See more information at [Gravatar][1].
+
+## Alternative Configuration
+Open the .htconfig.php file and add "gravatar" to the list of activated addons:
+
+        $a->config['system']['addon'] = "..., gravatar";
+
+You can add two configuration variables for the addon:
+
+        $a->config['gravatar']['default_avatar'] = "identicon";
+        $a->config['gravatar']['rating'] = "g";
+
+[1]: http://www.gravatar.com/site/implement/images/ "See documentation at Gravatar for more information"
diff --git a/gravatar/admin.tpl b/gravatar/admin.tpl
new file mode 100644 (file)
index 0000000..83144e4
--- /dev/null
@@ -0,0 +1,3 @@
+{{ inc field_select.tpl with $field=$default_avatar}}{{ endinc }}
+{{ inc field_select.tpl with $field=$rating }}{{ endinc }}
+<div class="submit"><input type="submit" value="$submit" /></div>
diff --git a/gravatar/gravatar.php b/gravatar/gravatar.php
new file mode 100644 (file)
index 0000000..b9435a3
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Name: Gravatar Support
+ * Description: If there is no avatar image for a new user or contact this plugin will look for one at Gravatar.
+ * Version: 1.0
+ * Author: Klaus Weidenbach <http://friendica.dszdw.net/profile/klaus>
+ */
+
+/**
+ * Installs the plugin hook
+ */
+function gravatar_install() {
+       register_hook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
+
+       logger("installed gravatar");
+}
+
+/**
+ * Removes the plugin hook
+ */
+function gravatar_uninstall() {
+       unregister_hook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
+
+       logger("uninstalled gravatar");
+}
+
+/**
+ * Looks up the avatar at gravatar.com and returns the URL.
+ *
+ * @param $a array
+ * @param &$b array
+ */
+function gravatar_lookup($a, &$b) {
+       $default_avatar = get_config('gravatar', 'default_img');
+       $rating = get_config('gravatar', 'rating');
+
+       // setting default value if nothing configured
+       if(! $default_avatar)
+               $default_avatar = 'identicon'; // default image will be a random pattern
+       if(! $rating)
+               $rating = 'g'; // suitable for display on all websites with any audience type
+
+       $hash = md5(trim(strtolower($b['email'])));
+
+       $url = 'http://www.gravatar.com/avatar/' .$hash .'.jpg';
+       $url .= '?s=' .$b['size'] .'&r=' .$rating;
+       if ($default_avatar != "gravatar")
+               $url .= '&d=' .$default_avatar;
+
+       $b['url'] = $url;       
+       $b['success'] = true;
+}
+
+/**
+ * Display admin settings for this addon
+ */
+function gravatar_plugin_admin (&$a, &$o) {
+       $t = file_get_contents( dirname(__file__)."/admin.tpl");
+
+       $default_avatar = get_config('gravatar', 'default_img');
+       $rating = get_config('gravatar', 'rating');
+
+       // set default values for first configuration
+       if(! $default_avatar)
+               $default_avatar = 'identicon'; // pseudo-random geometric pattern based on email hash
+       if(! $rating)
+               $rating = 'g'; // suitable for display on all websites with any audience type
+
+       // Available options for the select boxes
+       $default_avatars = array(
+               'mm' => t('generic profile image'),
+               'identicon' => t('random geometric pattern'),
+               'monsterid' => t('monster face'),
+               'wavatar' => t('computer generated face'),
+               'retro' => t('retro arcade style face'),
+       );
+       $ratings = array(
+               'g' => 'g',
+               'pg' => 'pg',
+               'r' => 'r',
+               'x' => 'x'
+       );
+
+       $o = '<input type="hidden" name="form_security_token" value="' .get_form_security_token("gravatarsave") .'">';
+       $o .= replace_macros( $t, array(
+               '$submit' => t('Submit'),
+               '$default_avatar' => array('avatar', t('Default avatar image'), $default_avatar, t('Select default avatar image if none was found at Gravatar. See README'), $default_avatars),
+               '$rating' => array('rating', t('Rating of images'), $rating, t('Select the appropriate avatar rating for your site. See README'), $ratings),
+       ));
+}
+
+/**
+ * Save admin settings
+ */
+function gravatar_plugin_admin_post (&$a) {
+       check_form_security_token('gravatarsave');
+
+       $default_avatar = ((x($_POST, 'avatar')) ? notags(trim($_POST['avatar'])) : 'identicon');
+       $rating = ((x($_POST, 'rating')) ? notags(trim($_POST['rating'])) : 'g');
+       set_config('gravatar', 'default_img', $default_avatar);
+       set_config('gravatar', 'rating', $rating);
+       info( t('Gravatar settings updated.') .EOL);
+}
+?>
diff --git a/irc.tgz b/irc.tgz
index cb86460599f429d1304f82ec46525225d70f591f..a07e38ee95da2f3cdafbd0180ba32b798bb023da 100644 (file)
Binary files a/irc.tgz and b/irc.tgz differ
diff --git a/irc/irc.css b/irc/irc.css
new file mode 100644 (file)
index 0000000..76aa215
--- /dev/null
@@ -0,0 +1,15 @@
+/* irc css */
+#irc-chans, {
+       float: left;
+       width: 200px;
+       margin-top: 10px;
+}
+
+#irc-checkbox {
+       float: left;
+       margin-top: 10px;
+}
+
+#irc-submit {
+       margin-top: 15px;
+}
index 065e48080d81a4726ead6048b19dcab7327e71ae..1ce4ee14deb65fbde30a51009b8da6df49165ef2 100644 (file)
  * you will then have "irc chatroom" listed at yoursite/apps
  * and the app will run at yoursite/irc
  * documentation at http://tonybaldwin.me/hax/doku.php?id=friendica:irc
+ * admin can set popular chans, auto connect chans in settings->plugin settings
  */
 
 function irc_install() {
-register_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
+       register_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
+       register_hook('plugin_settings', 'addon/irc/irc.php', 'irc_addon_settings');
+       register_hook('plugin_settings_post', 'addon/irc/irc.php', 'irc_addon_settings_post');
 }
 
 function irc_uninstall() {
-unregister_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
+       unregister_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
+       unregister_hook('plugin_settings', 'addon/irc/irc.php', 'irc_addon_settings');
 
 }
 
+
+function irc_addon_settings(&$a,&$s) {
+
+
+       if(! is_site_admin())
+               return;
+
+    /* Add our stylesheet to the page so we can make our settings look nice */
+
+       $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/irc/irc.css' . '" media="all" />' . "\r\n";
+
+    /* setting popular channels, auto connect channels */
+       $sitechats = get_config('irc','sitechats'); /* popular channels */
+       $autochans = get_config('irc','autochans');  /* auto connect chans */
+
+       $s .= '<div class="settings-block">';
+       $s .= '<h3>' . t('IRC Settings') . '</h3>';
+       $s .= '<div id="irc-chans">';
+       $s .= '<label id="irc-auto-label" for="autochans">' . t('Channel(s) to auto connect (comma separated)') . '</label>';
+       $s .= '<input id="autochans" type="text" name="autochans" value="' . $autochans .'" />';
+       $s .= '</div><div class="clear"></div>';
+
+       $s .= '<div id="irc-chans">';
+       $s .= '<label id="irc-pop-label" for="sitechats">' . t('Popular Channels (comma separated)') . '</label>';
+       $s .= '<input id="sitechats" type="text" name="sitechats" value="' . $sitechats.'" />';
+       $s .= '</div><div class="clear"></div>';
+
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="irc-submit" name="irc-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
+
+       return;
+
+}
+
+function irc_addon_settings_post(&$a,&$b) {
+       if(! is_site_admin())
+               return;
+
+       if($_POST['irc-submit']) {
+               set_config('irc','autochans',trim($_POST['autochans']));
+               set_config('irc','sitechats',trim($_POST['sitechats']));
+               /* stupid pop-up thing */
+               info( t('IRC settings saved.') . EOL);
+       }
+}
+
 function irc_app_menu($a,&$b) {
 $b['app_menu'][] = '<div class="app-title"><a href="irc">' . t('IRC Chatroom') . '</a></div>';
 }
@@ -36,11 +85,12 @@ function irc_content(&$a) {
        $baseurl = $a->get_baseurl() . '/addon/irc';
        $o = '';
 
-       $sitechats = get_config('irc','channels');
+       /* set the list of popular channels */
+       $sitechats = get_config('irc','sitechats');
        if($sitechats)
                $chats = explode(',',$sitechats);
        else
-               $chats = array('friendica','chat','chatback','hottub','ircbar','dateroom','teentalk');
+               $chats = array('friendica','chat','chatback','hottub','ircbar','dateroom','debian');
 
 
        $a->page['aside'] .= '<div class="widget"><h3>' . t('Popular Channels') . '</h3><ul>';
@@ -49,16 +99,14 @@ function irc_content(&$a) {
        }
        $a->page['aside'] .= '</ul></div>';
 
+        /* setting the channel(s) to auto connect */
+       $autochans = get_config('irc','autochans');
+       if($autochans)
+               $channels = $autochans;
+       else
+               $channels = ((x($_GET,'channels')) ? $_GET['channels'] : 'friendica');
 
-
-
-
-$channels = ((x($_GET,'channels')) ? $_GET['channels'] : 'friendica');
-
-/* add the chatroom frame and some html
- * by altering the "channels=friendica" part of the URL, you can add/remove channels.  
- * At free-haven.org, I have "?channels=friendica,free-haven", for instance, to open #friendica and #free-haven
- */
+/* add the chatroom frame and some html */
   $o .= <<< EOT
 <h2>IRC chat</h2>
 <p><a href="http://tldp.org/HOWTO/IRC/beginners.html" target="_blank">A beginner's guide to using IRC. [en]</a></p>
diff --git a/mathjax.tgz b/mathjax.tgz
new file mode 100644 (file)
index 0000000..bb591e1
Binary files /dev/null and b/mathjax.tgz differ
diff --git a/mathjax/README b/mathjax/README
new file mode 100644 (file)
index 0000000..023e1c8
--- /dev/null
@@ -0,0 +1,31 @@
+Addon for Friendika to include MathJax (LaTeX math syntax)
+
+This addon lets your users use LaTeX to type mathematical formulas
+within their posts. MathJax takes care about the best method for the
+browser to display the formula and provides compatibility to 99%
+of the modern browsers.
+
+You can either use the MathJax CDN online, thus loading the required javascript
+libraries from the MathJax cloud, or use a local installation of MathJax.
+Please see the plugin settings in the admin panel for configuration possibles.
+If you don't set up a local MathJax instance, leave the configuration untouched
+it will fall back to the MathJax cloud as default value.
+
+If you don't use the admin panel add mathjax to the list of active addons
+
+$a->config['system']['addon'] = [..., mathjax, ...]
+
+To select the source of the included javascript libraries add a line
+
+$a->config['mathjax']['baseurl'] = 'the URL to your MathJax installation';
+
+to your .htconfig.php file. If this line is not there, the addon assumes that
+you want to use the MathJax cloud (CDN).
+
+Please note that your usage of the CDN is governed by the "MathJax CDN Terms of
+Service" see http://www.mathjax.org/download/mathjax-cdn-terms-of-service/
+
+Author:  Tobias Diekershoff
+         http://diekershoff.homeunix.net/friendika/profile/tobias
+         email: tobias.diekershoff@gmx.net
+
diff --git a/mathjax/admin.tpl b/mathjax/admin.tpl
new file mode 100644 (file)
index 0000000..1c723cd
--- /dev/null
@@ -0,0 +1,2 @@
+{{ inc field_input.tpl with $field=$baseurl }}{{endinc }}
+<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/mathjax/mathjax.php b/mathjax/mathjax.php
new file mode 100644 (file)
index 0000000..7105772
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * Name: MathJax
+ * Description: Addon for Friendika to include MathJax (LaTeX math syntax)
+ * Version: 1.0
+ * Author: Tobias Diekershoff <http://diekershoff.homeunix.net/friendika/profile/tobias>
+ * License: 3-clause BSD license
+ */
+
+function mathjax_install() {
+    register_hook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
+    register_hook('plugin_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings'); 
+    register_hook('plugin_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
+    logger('installed js_math plugin');
+}
+function mathjax_uninstall() {
+    unregister_hook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
+    unregister_hook('plugin_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings'); 
+    unregister_hook('plugin_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
+}
+function mathjax_settings_post ($a, $post) {
+    if (! local_user())
+        return;
+    // don't check statusnet settings if statusnet submit button is not clicked
+    if (!x($_POST,'mathjax-submit'))
+        return;
+    set_pconfig(local_user(),'mathjax','use',intval($_POST['mathjax_use']));
+}
+function mathjax_settings (&$a, &$s) {
+    if (! local_user())
+        return;
+    $use = get_pconfig(local_user(),'mathjax','use');
+    $usetext = (($use) ? ' checked="checked" ' : '');
+    $s .= '<div class="settings-block">';
+    $s .= '<h3>MathJax '.t('Settings').'</h3>';
+    $s .= '<p>'.t('The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail.').'</p>';
+    $s .= '<label id="mathjax_label" for="mathjax_use">'.t('Use the MathJax renderer').'</label>';
+    $s .= '<input id="mathjax_use" type="checkbox" name="mathjax_use" value="1"'. $usetext .' />';
+    $s .= '<div class="clear"></div>';
+
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="mathjax-submit" name="mathjax-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
+    $s .= '</div>';
+}
+/*  we need to add one JavaScript include command to the html output
+ *  note that you have to check the jsmath/easy/load.js too.
+ */
+function mathjax_page_header($a, &$b) {
+    //  if the visitor of the page is not a local_user, use MathJax
+    //  otherwise check the users settings.
+    $url = get_config ('mathjax','baseurl');
+       if(! $url)
+               $url = 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
+    if (! local_user()) {
+        $b .= '<script type="text/javascript" src="'.$url.'"></script>';
+    } else {
+        $use = get_pconfig(local_user(),'mathjax','use');
+        if ($use) { 
+            $b .= '<script type="text/javascript" src="'.$url.'"></script>';
+        }
+    }
+}
+function mathjax_plugin_admin_post (&$a) {
+    $baseurl = ((x($_POST, 'baseurl')) ? trim($_POST['baseurl']) : 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
+    set_config('mathjax','baseurl',$baseurl);
+    info( t('Settings updated.'). EOL);
+}
+function mathjax_plugin_admin (&$a, &$o) {
+       $t = file_get_contents( dirname(__file__)."/admin.tpl");
+        if (get_config('mathjax','baseurl','') == '') {
+            set_config('mathjax','baseurl','http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
+        }
+        $o = replace_macros( $t, array(
+               '$baseurl' => array('baseurl', t('MathJax Base URL'), get_config('mathjax','baseurl' ), t('The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax.')),
+            ));
+}
index 230c1f50d7798a3ead7a3d67bfc9936a7508b482..a1fc2ecd22ca28e2fbd9e0bcaaee44c4ab9e3e37 100755 (executable)
Binary files a/piwik.tgz and b/piwik.tgz differ
index e5e95bbe4ed0520bc277dcd410c05427c76b53db..066413debf3a08288ff69b600afb2da940aab3d6 100755 (executable)
@@ -1,9 +1,9 @@
 #piwik-optout-link {
-       padding: 100px 50px;
+       padding: 50px 0 0 0;
        text-align: justify;
        font-size: 0.85em;
-        margin-top:10px;
-        clear: both;
+    margin-top:10px;
+    clear: both;
 }
 #piwik-code-block {
        display: none;
diff --git a/planets.tgz b/planets.tgz
new file mode 100644 (file)
index 0000000..2ce9788
Binary files /dev/null and b/planets.tgz differ
diff --git a/planets/planets.css b/planets/planets.css
new file mode 100755 (executable)
index 0000000..668b65b
--- /dev/null
@@ -0,0 +1,14 @@
+
+
+
+#planets-enable-label {
+       float: left;
+       width: 200px;
+       margin-bottom: 25px;
+}
+
+#planets-checkbox {
+       float: left;
+}
+
+
diff --git a/planets/planets.php b/planets/planets.php
new file mode 100755 (executable)
index 0000000..0df91d7
--- /dev/null
@@ -0,0 +1,160 @@
+<?php
+/**
+ * Name: Random Planet, Empirial Version
+ * Description: Sample Friendica plugin/addon. Set a random planet from the Emprire when posting.
+ * Version: 1.0
+ * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ * Author: Tony Baldwin <https://free-haven.org/profile/tony>
+ */
+
+
+function planets_install() {
+
+       /**
+        * 
+        * Our demo plugin will attach in three places.
+        * The first is just prior to storing a local post.
+        *
+        */
+
+       register_hook('post_local', 'addon/planets/planets.php', 'planets_post_hook');
+
+       /**
+        *
+        * Then we'll attach into the plugin settings page, and also the 
+        * settings post hook so that we can create and update
+        * user preferences.
+        *
+        */
+
+       register_hook('plugin_settings', 'addon/planets/planets.php', 'planets_settings');
+       register_hook('plugin_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
+
+       logger("installed planets");
+}
+
+
+function planets_uninstall() {
+
+       /**
+        *
+        * uninstall unregisters any hooks created with register_hook
+        * during install. It may also delete configuration settings
+        * and any other cleanup.
+        *
+        */
+
+       unregister_hook('post_local',    'addon/planets/planets.php', 'planets_post_hook');
+       unregister_hook('plugin_settings', 'addon/planets/planets.php', 'planets_settings');
+       unregister_hook('plugin_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
+
+
+       logger("removed planets");
+}
+
+
+
+function planets_post_hook($a, &$item) {
+
+       /**
+        *
+        * An item was posted on the local system.
+        * We are going to look for specific items:
+        *      - A status post by a profile owner
+        *      - The profile owner must have allowed our plugin
+        *
+        */
+
+       logger('planets invoked');
+
+       if(! local_user())   /* non-zero if this is a logged in user of this system */
+               return;
+
+       if(local_user() != $item['uid'])    /* Does this person own the post? */
+               return;
+
+       if($item['parent'])   /* If the item has a parent, this is a comment or something else, not a status post. */
+               return;
+
+       /* Retrieve our personal config setting */
+
+       $active = get_pconfig(local_user(), 'planets', 'enable');
+
+       if(! $active)
+               return;
+
+       /**
+        *
+        * OK, we're allowed to do our stuff.
+        * Here's what we are going to do:
+        * load the list of timezone names, and use that to generate a list of world planets.
+        * Then we'll pick one of those at random and put it in the "location" field for the post.
+        *
+        */
+
+       $planets = array('Alderaan','Tatooine','Dagoba','Polis Massa','Coruscant','Hoth','Endor','Kamino','Rattatak','Mustafar','Iego','Geonosis','Felucia','Dantooine','Ansion','Artaru','Bespin','Boz Pity','Cato Neimoidia','Christophsis','Kashyyk','Kessel','Malastare','Mygeeto','Nar Shaddaa','Ord Mantell','Saleucami','Subterrel','Death Star','Teth','Tund','Utapau','Yavin');
+
+       $planet = array_rand($planets,1);
+       $item['location'] = $planets[$planet];
+
+       return;
+}
+
+
+
+
+/**
+ *
+ * Callback from the settings post function.
+ * $post contains the $_POST array.
+ * We will make sure we've got a valid user account
+ * and if so set our configuration setting for this person.
+ *
+ */
+
+function planets_settings_post($a,$post) {
+       if(! local_user())
+               return;
+       if($_POST['planets-submit'])
+               set_pconfig(local_user(),'planets','enable',intval($_POST['planets']));
+}
+
+
+/**
+ *
+ * Called from the Plugin Setting form. 
+ * Add our own settings info to the page.
+ *
+ */
+
+
+
+function planets_settings(&$a,&$s) {
+
+       if(! local_user())
+               return;
+
+       /* Add our stylesheet to the page so we can make our settings look nice */
+
+       $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/planets/planets.css' . '" media="all" />' . "\r\n";
+
+       /* Get the current state of our config variable */
+
+       $enabled = get_pconfig(local_user(),'planets','enable');
+
+       $checked = (($enabled) ? ' checked="checked" ' : '');
+
+       /* Add some HTML to the existing form */
+
+       $s .= '<div class="settings-block">';
+       $s .= '<h3>' . t('Planets Settings') . '</h3>';
+       $s .= '<div id="planets-enable-wrapper">';
+       $s .= '<label id="planets-enable-label" for="planets-checkbox">' . t('Enable Planets Plugin') . '</label>';
+       $s .= '<input id="planets-checkbox" type="checkbox" name="planets" value="1" ' . $checked . '/>';
+       $s .= '</div><div class="clear"></div>';
+
+       /* provide a submit button */
+
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="planets-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
+
+}
index 931781d060a9feb147a03a43f7a5659fd8e874e2..7ab5f0db9d1769808dd0747f587395e7a32f6b15 100755 (executable)
Binary files a/randplace.tgz and b/randplace.tgz differ
index df713766c8902f6970d93d34dd251cec4ee82fe1..b70c02d94ea731eddbab415b22536229a8c1b7ab 100755 (executable)
@@ -8,10 +8,8 @@
  * 
  * 
  *
- * Addons are registered with the system in the
- * .htconfig.php file.
- *
- * $a->config['system']['addon'] = 'plugin1,plugin2,etc.';
+ * Addons are registered with the system through the admin
+ * panel.
  *
  * When registration is detected, the system calls the plugin
  * name_install() function, located in 'addon/name/name.php',
diff --git a/testdrive.tgz b/testdrive.tgz
new file mode 100644 (file)
index 0000000..7d314ea
Binary files /dev/null and b/testdrive.tgz differ
diff --git a/testdrive/README.md b/testdrive/README.md
new file mode 100644 (file)
index 0000000..3d735de
--- /dev/null
@@ -0,0 +1,23 @@
+TestDrive
+=========
+
+
+Testdrive is a Friendica plugin which implements automatic account expiration so that a site may be used as a public
+test bed. 
+
+When an account is created on the site, it is given a hard expiration date of 
+
+
+$a->config['testdrive']['expiredays'] = 30;
+
+Set this in your .htconfig.php file to allow a 30 day test drive period. By default no expiration period is defined 
+in case the plugin is activated accidentally. 
+
+
+There is no opportunity to extend an expired account using this plugin. Expiration is final. Other plugins may be created
+which charge for service and extend the expiration as long as a balance is maintained. This plugin is purely for creating
+a limited use test site. 
+
+An email warning will be sent out approximately five days before the expiration occurs. Once it occurs logins and many 
+system functions are disabled. Five days later the account is removed completely. 
+   
\ No newline at end of file
diff --git a/testdrive/testdrive.php b/testdrive/testdrive.php
new file mode 100644 (file)
index 0000000..b7c021a
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * Name: testdrive
+ * Description: Sample Friendica plugin/addon for creating a test drive Friendica site with automatic account expiration.
+ * Version: 1.0
+ * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ */
+
+
+
+
+function testdrive_install() {
+
+       register_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
+       register_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
+}
+
+
+function testdrive_uninstall() {
+
+       unregister_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
+       unregister_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
+
+}
+
+function testdrive_register_account($a,$b) {
+
+       $uid = $b;
+
+       $days = get_config('testdrive','expiredays');
+       if(! $days)
+               return;
+
+       $r = q("UPDATE user set account_expires_on = '%s' where uid = %d limit 1",
+               dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
+               intval($uid)
+       );
+
+};
+       
+
+function testdrive_cron($a,$b) {
+       require_once('include/enotify.php');
+
+       $r = q("select * from user where account_expires_on < UTC_TIMESTAMP() + INTERVAL 5 DAY and
+               expire_notification_sent = '0000-00-00 00:00:00' ");
+
+       if(count($r)) {
+               foreach($r as $rr) {
+                       notification(array(
+                               'uid' => $rr['uid'],
+                               'type' => NOTIFY_SYSTEM,
+                               'system_type' => 'testdrive_expire',
+                               'language'     => $rr['language'],
+                               'to_name'      => $rr['username'],
+                               'to_email'     => $rr['email'],
+                               'source_name'  => t('Administrator'),
+                               'source_link'  => $a->get_baseurl(),
+                               'source_photo' => $a->get_baseurl() . '/images/person-80.jpg',
+                       ));
+
+                       q("update user set expire_notification_sent = '%s' where uid = %d limit 1",
+                               dbesc(datetime_convert()),
+                               intval($rr['uid'])
+                       );
+               }
+       }
+
+       $r = q("select * from user where account_expired = 1 and account_expires_on < UTC_TIMESTAMP() - INTERVAL 5 DAY ");
+       if(count($r)) {
+               require_once('include/Contact.php');
+               foreach($r as $rr)
+                       user_remove($rr['uid']);
+
+       }
+
+}              
+
+function testdrive_enotify(&$a, &$b) {
+    if (x($b, 'params') && $b['params']['type'] == NOTIFY_SYSTEM 
+               && x($b['params'], 'system_type') && $b['params']['system_type'] === 'testdrive_expire') {
+        $b['itemlink'] = $a->get_baseurl();
+        $b['epreamble'] = $b['preamble'] = sprintf( t('Your account on %s will expire in a few days.'), get_config('system','sitename'));
+        $b['subject'] = t('Your Friendica test account is about to expire.');
+        $b['body'] = sprintf( t("Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."), $b['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]");
+    }
+}