function generate_content(&$title)
 {
     global $serendipity;
     $hideDisplay = "#caching#" == $title;
     $number = $this->get_config('number');
     $service = $this->get_config('service', 'twitter.com');
     $username = $this->get_config('username');
     $dateformat = $this->get_config('dateformat');
     $title = $this->get_config('title', $this->title);
     $showformat = $this->get_config('showformat');
     $cachetime = (int) $this->get_config('cachetime', 300);
     if (!is_numeric($number)) {
         $number = 10;
     }
     if ($service == 'identi.ca') {
         $followme_url = 'http://identi.ca/' . $username;
         $service_url = 'http://identi.ca/api';
         $status_url = 'http://identi.ca/notice/';
         //$JSONcallback = 'identicaCallback2';
         $JSONcallback = 'twitterCallback2';
         // We call the twitter widget. It is working with identi.ca too, but the callback name is twitter!
         $timelineurl = 'http://identi.ca/api/statuses/user_timeline/' . $username . '.json?callback=' . $JSONcallback . '&count=' . $number;
         $api = new Twitter(true);
     } else {
         $followme_url = 'https://twitter.com/' . $username;
         $service_url = 'https://twitter.com';
         $status_url = 'https://twitter.com/' . $username . '/statuses/';
         $JSONcallback = 'twitterCallback2';
         $timelineurl = 'https://api.twitter.com/1/statuses/user_timeline.json?screen_name=' . $username . '&count=' . $number . '&callback=' . $JSONcallback;
         $api = new Twitter(false);
     }
     if (!$dateformat || strlen($dateformat) < 1) {
         $dateformat = '%A, %B %e %Y';
     }
     if ($showformat == 'PHP') {
         $cache_user = md5($service) . md5($username);
         $cachefile = $serendipity['serendipityPath'] . PATH_SMARTY_COMPILE . "/twitterresult.{$cache_user}.json";
         // If the Event Plugin is not installed, we have to fill the cachefile on our own..
         // To immidiately display a result, the file_exists check is added.
         if (!class_exists('serendipity_event_twitter') || !file_exists($cachefile)) {
             // If we have twitter using API 1.1 the sidebarplugin *needs* the eventplugin to update
             if ($this->get_config('service', 'twitter.com') == 'identi.ca' || $this->get_config('twitter_api', '1.0') == '1.0') {
                 $this->updateTwitterTimelineCache($cachefile);
             }
         }
         // Get xml from cache:
         if (file_exists($cachefile)) {
             $xml = json_decode(unserialize(file_get_contents($cachefile)));
         }
         $str_output = array();
         // now process it:
         $str_output[] = '<ul id="twitter_update_list">';
         $odd_css = 'odd';
         if (!is_array($xml)) {
             if (!empty($xml->error)) {
                 $msg = $xml->error;
             } else {
                 $msg = PLUGIN_TWITTER_PROBLEM_TWITTER_ACCESS;
             }
             $str_output[] = "<li>{$msg}</li>";
         } else {
             if ($number > 0) {
                 $counter = 0;
                 $toall_only = serendipity_db_bool($this->get_config('toall_only', false));
                 $filter_all_user = serendipity_db_bool($this->get_config('filter_all_user', false));
                 foreach ($xml as $key => $status) {
                     // Change encoding of update to Visitors language
                     if (LANG_CHARSET != 'UTF-8' && function_exists("mb_convert_encoding")) {
                         $status->text = mb_convert_encoding($status->text, LANG_CHARSET, 'auto');
                     }
                     $status->text = htmlentities($status->text, ENT_QUOTES, 'UTF-8');
                     $showit = true;
                     if ($filter_all_user && preg_match('/@/', $status->text)) {
                         $showit = false;
                     } else {
                         if ($toall_only && preg_match('/^@/', $status->text)) {
                             $showit = false;
                         }
                     }
                     if ($showit) {
                         $str_output[] = '<li class="twitter_update_' . $odd_css . '"><span> ' . ($status->text = $api->replace_links_in_status($status->text, $this->get_config('linktext', 'link'), 'twitter_update_link', 'twitter_user') . '</span><a class="twitter_update_time" href="' . $status_url . $status->id_str . '">' . $this->makeDate($status->created_at, $dateformat) . '</a></li>');
                         $odd_css = $odd_css == 'odd' ? 'even' : 'odd';
                         $counter++;
                     }
                     if ($counter >= $number) {
                         break;
                     }
                 }
             }
         }
         $str_output[] = '</ul>';
         // Display only, if we have something meaningful:
         if (!$hideDisplay && count($str_output) > 2) {
             $output = implode('', $str_output);
             $this->output($output);
         }
     } else {
         if (!$hideDisplay) {
             echo '<ul id="twitter_update_list"><li style="display: none"></li></ul>' . "\n";
             echo '<script type="text/javascript" src="https://twitter.com/javascripts/blogger.js"></script>' . "\n";
             echo '<script type="text/javascript" src="' . $timelineurl . '"></script>';
         }
     }
     if (!$hideDisplay) {
         if (serendipity_db_bool($this->get_config('followme_link', false))) {
             echo '<p id="twitter_follow_me"><a href="' . $followme_url . '" class="twitter_follow_me">' . PLUGIN_TWITTER_FOLLOWME_LINK_TEXT . '</a></p>' . "\n";
         }
         if ($service == 'twitter.com' && serendipity_db_bool($this->get_config('followme_widget', false))) {
             $extra_style = '';
             if (serendipity_db_bool($this->get_config('followme_widget_dark', false))) {
                 $extra_style .= ' data-button="grey" data-text-color="#FFFFFF" data-link-color="#00AEFF"';
             }
             if (!serendipity_db_bool($this->get_config('followme_widget_counter', true))) {
                 $extra_style .= '  data-show-count="false"';
             }
             echo '<a href="https://twitter.com/' . $username . '" class="twitter-follow-button"' . $extra_style . '>Follow @' . $username . '</a><script src="//platform.twitter.com/widgets.js" type="text/javascript"></script>';
         }
     }
     if ($showformat == 'PHP') {
         // If the twitter event plugin is installed, too, save cache file in background.
         // When twitter is blocking, the blog isn't when using this background caching.
         // Background caching is done by a external plugin call, that is executed by the event plugin
         if (class_exists('serendipity_event_twitter')) {
             // add png that reloads the cache:
             $pluginurl = $serendipity['baseURL'] . $serendipity['indexFile'] . '?/' . $this->getPermaPluginPath();
             $png_url = $pluginurl . '/cacheplugintwitter' . $this->cache_img_link_pars();
             echo '<img src="' . $png_url . '" width="1" height="1" alt="" class="twitter_plugin_cache_png" style="float:right;"/>';
         }
     }
     if (serendipity_db_bool($this->get_config('backup')) && $service == 'twitter.com') {
         $last_backup = $this->get_config('last_backup', 0);
         if (date('Ymd') == date('Ymd', $last_backup)) {
             return true;
         }
         $this->checkTable();
         $this->makeBackup($username, $last_backup);
     }
 }
 function display_twitter_client($tweeter_in_sidbar = false)
 {
     $identities = $this->load_identities();
     $status_timeline = $this->load_timeline();
     $tweeter_has_timeline = $this->get_config('tweeter_history', false) === true;
     if ($_POST['tweeter_timeline']) {
         $pstatus_timeline = $_POST['tweeter_timeline'];
     } else {
         $pstatus_timeline = $this->get_config('tweeter_timeline');
     }
     // Always remember last set identity
     $val_identitiy = $_POST['tweeter_account'];
     $acc_number = '';
     if (empty($val_identitiy) || $val_identitiy == 0) {
         $account_name = $this->get_config('twittername', '');
         $account_pwd = $this->get_config('twitterpwd', '');
         $account_type = $this->get_config('id_service', 'twitter');
     } else {
         $acc_number = (int) $val_identitiy + 1;
         $account_name = $this->get_config('twittername' . $acc_number, '');
         $account_pwd = $this->get_config('twitterpwd' . $acc_number, '');
         $account_type = $this->get_config('id_service' . $acc_number, 'twitter');
     }
     // Display client
     if ($this->get_config('tweeter_show', 'disable') != 'disable') {
         if (isset($_POST['tweeter_submit'])) {
             if (isset($_POST['tweet'], $_POST['shorturl'])) {
                 if ($_POST['shorturl'] !== 'http://' && !empty($_POST['shorturl'])) {
                     $val_short = $this->default_shorturl($_POST['shorturl']);
                     if ($val_short == $_POST['shorturl']) {
                         $val_short = 'ERROR';
                     }
                     $val_tweet = $_POST['tweet'] . $val_short;
                     $val_short = '';
                 } elseif (!empty($_POST['tweet'])) {
                     $update = $_POST['tweet'];
                     // Change encoding of update to UTF-8
                     if (LANG_CHARSET != 'UTF-8' && function_exists("mb_convert_encoding")) {
                         $update = mb_convert_encoding($update, 'UTF-8', LANG_CHARSET);
                     }
                     if ($account_type == "identica") {
                         $api = new Twitter($account_type == 'identica');
                         $twit = $api->update($account_name, $account_pwd, $update);
                     } else {
                         $connection = $this->twitteroa_connect($acc_number);
                         $api = new TwitterOAuthApi($connection);
                         $status = $api->update($update);
                         $twit = true;
                     }
                     if ($twit === true) {
                         $notice = PLUGIN_EVENT_TWITTER_TWEETER_STORED;
                     } else {
                         $val_tweet = $_POST['tweet'];
                         $notice = PLUGIN_EVENT_TWITTER_TWEETER_STOREFAIL . $twit;
                     }
                 }
             }
         } elseif (isset($_POST['tweeter_change_identity'])) {
             $val_tweet = $_POST['tweet'];
             $val_short = $_POST['shorturl'];
         }
         // Create strings of twitter URL length:
         $this->twitter_check_config();
         $http_length_str = str_repeat("=", (int) $this->get_config('twitter_config_http_len'));
         $https_length_str = str_repeat("=", (int) $this->get_config('twitter_config_https_len'));
         // Hide shorten url input, if no url shorter is used!
         if ('raw' == $this->get_config('anounce_url_service', '7ax.de')) {
             echo "<style type=\"text/css\">div#serendipity_admin_tweeter_shorturl {display: none;}</style>";
             @define('PLUGIN_EVENT_TWITTER_TWEETER_SHORTEN_OR_UPDATE', PLUGIN_EVENT_TWITTER_TWEETER_UPDATE);
         } else {
             @define('PLUGIN_EVENT_TWITTER_TWEETER_SHORTEN_OR_UPDATE', PLUGIN_EVENT_TWITTER_TWEETER_SHORTEN . ' / ' . PLUGIN_EVENT_TWITTER_TWEETER_UPDATE);
         }
         // Display the form
         include dirname(__FILE__) . '/tweeter/tweeter_client.inc.php';
     } else {
         return true;
         // if disabled, don't display anything else!
     }
     // Display history
     if ($tweeter_has_timeline) {
         if ($account_type == "identica") {
             $count = $this->get_config('tweeter_history_count', 10);
             $api = new Twitter($account_type == 'identica');
             $statuses = $api->timeline($account_name, $account_pwd, $count);
         } else {
             require_once dirname(__FILE__) . '/twitteroauth/twitteroauth.php';
             if ($_POST['tweeter_timeline']) {
                 $get_connection = "statuses/" . $_POST['tweeter_timeline'];
             } else {
                 $get_connection = "statuses/" . $this->get_config('tweeter_timeline');
             }
             $connection = $this->twitteroa_connect($acc_number);
             $statuses = $connection->get($get_connection);
             $http_code = $connection->http_code;
             $api = new Twitter($account_type == 'identica');
         }
         $buffer = '';
         if (!is_array($statuses)) {
             if (empty($statuses)) {
                 $buffer = '<li><strong>Result from Twitter was empty.</strong><br/>Perhaps down for maintenance?</li>';
             } elseif (is_object($statuses)) {
                 if (!empty($statuses->error)) {
                     $buffer = '<li><strong>' . $statuses->error . '</strong></li>';
                 } else {
                     $buffer = '<li><strong>Reported an unknown error</strong></li>';
                 }
             } else {
                 print_r($statuses);
                 $buffer = '<li><strong>Twitter reported http error ' . $statuses . '</strong></li>';
             }
         } else {
             if ($account_type == "twitter") {
                 if ($_POST['tweeter_timeline']) {
                     $buffer_header = PLUGIN_EVENT_TWITTER_TIMELINE . ": " . $_POST['tweeter_timeline'];
                 } else {
                     $buffer_header = PLUGIN_EVENT_TWITTER_TIMELINE . ": " . $this->get_config('tweeter_timeline');
                 }
             }
             foreach ($statuses as $status) {
                 // Setup links inside of the text
                 $status->text = $api->replace_links_in_status($status->text);
                 // Change encoding to blog encoding
                 if (LANG_CHARSET != 'UTF-8' && function_exists("mb_convert_encoding")) {
                     $status->text = mb_convert_encoding($status->text, LANG_CHARSET, 'UTF-8');
                 }
                 if (strtoupper($account_name) != strtoupper($status->user->screen_name)) {
                     $reply_link = '<a href="javascript:tweeter_reply(\'' . $status->user->screen_name . '\');" title="' . PLUGIN_EVENT_TWITTER_TWEETER_REPLY . '">@</a>';
                     $direct_link = '<a href="javascript:tweeter_dm(\'' . $status->user->screen_name . '\');" title="' . PLUGIN_EVENT_TWITTER_TWEETER_DM . '">DM</a>';
                     $retweet_link = '<a href="javascript:tweeter_retweet(\'' . $status->user->screen_name . '\', \'' . str_replace('"', '#quot2;', str_replace("'", '#quot1;', strip_tags($status->text))) . '\');" title="' . PLUGIN_EVENT_TWITTER_TWEETER_RETWEET . '">RT</a>';
                 } else {
                     $reply_link = '';
                     $direct_link = '';
                     $retweet_link = '';
                 }
                 // Twitter delivers the complete status ID in an extra field!
                 $status_id = $account_type == 'identica' ? $status->id : $status->id_str;
                 // Add each status formatted to a html buffer
                 $buffer .= '<li class="tweeter_line">
                                 <div class="tweeter_profile_img">
                                     <img src="' . $status->user->profile_image_url . '" width="48" height="48" alt="" title="' . $status->user->screen_name . '"/>
                                 </div>
                                 <div  class="tweeter_profile_text">
                                     <a href="' . $api->get_base_url() . $status->user->screen_name . '">' . $status->user->screen_name . '</a> ' . $status->text . '
                                 </div>
                                 <div  class="tweeter_profile_links">
                                     <a href="' . $api->get_status_url($status->user->screen_name, $status_id) . '">' . Twitter::create_status_ago_string($status->created_at) . '</a> from ' . $status->source . ' ' . $reply_link . ' ' . $direct_link . ' ' . $retweet_link . '
                                 </div>
                             </li>';
             }
         }
         // Display the history
         include dirname(__FILE__) . '/tweeter/tweeter_history.inc.php';
         $return = true;
     }
 }