]> git.wh0rd.org - tt-rss.git/blobdiff - functions.php
update translations
[tt-rss.git] / functions.php
index be793c49a034df0212ae9b66c7896310cc3f5fb4..648ab3438657dc4a4ef36c60846a3c6810469ec4 100644 (file)
@@ -38,7 +38,7 @@
 
        if (ENABLE_TRANSLATIONS == true) { // If translations are enabled.
                require_once "accept-to-gettext.php";
-               require_once "gettext/gettext.inc";
+               require_once "lib/gettext/gettext.inc";
 
                function startup_gettext() {
        
        require_once 'errors.php';
        require_once 'version.php';
 
-       require_once 'phpmailer/class.phpmailer.php';
+       require_once 'lib/phpmailer/class.phpmailer.php';
 
        define('MAGPIE_USER_AGENT_EXT', ' (Tiny Tiny RSS/' . VERSION . ')');
        define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
        define('MAGPIE_CACHE_AGE', 60*15); // 15 minutes
 
-       require_once "simplepie/simplepie.inc";
-       require_once "magpierss/rss_fetch.inc";
-       require_once 'magpierss/rss_utils.inc';
+       require_once "lib/simplepie/simplepie.inc";
+       require_once "lib/magpierss/rss_fetch.inc";
+       require_once 'lib/magpierss/rss_utils.inc';
 
        /**
         * Print a timestamped debug message.
        function purge_feed($link, $feed_id, $purge_interval, $debug = false) {
 
                if (!$purge_interval) $purge_interval = feed_purge_interval($link, $feed_id);
-
+               
                $rows = -1;
 
                $result = db_query($link, 
                        $owner_uid = db_fetch_result($result, 0, "owner_uid");
                }
 
+               if ($purge_interval == -1 || !$purge_interval) {
+                       if ($owner_uid) {
+                               ccache_update($link, $feed_id, $owner_uid);
+                       }
+                       return;
+               }
+
                if (!$owner_uid) return;
 
                if (FORCE_ARTICLE_PURGE == 0) {
                }
        }
 
-       function update_all_feeds($link, $fetch, $user_id = false, $force_daemon = false) {
-
-               if (WEB_DEMO_MODE) return;
-
-               if (!$user_id) {
-                       $user_id = $_SESSION["uid"];
-                       purge_old_posts($link);
-               }
-
-//             db_query($link, "BEGIN");
-
-               if (MAX_UPDATE_TIME > 0) {
-                       if (DB_TYPE == "mysql") {
-                               $q_order = "RAND()";
-                       } else {
-                               $q_order = "RANDOM()";
-                       }
-               } else {
-                       $q_order = "last_updated DESC";
-               }
-
-               $result = db_query($link, "SELECT feed_url,id,
-                       ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated,
-                       update_interval FROM ttrss_feeds WHERE owner_uid = '$user_id'
-                       ORDER BY $q_order");
-
-               $upd_start = time();
-
-               while ($line = db_fetch_assoc($result)) {
-                       $upd_intl = $line["update_interval"];
-
-                       if (!$upd_intl || $upd_intl == 0) {
-                               $upd_intl = get_pref($link, 'DEFAULT_UPDATE_INTERVAL', $user_id, false);
-                       }
-
-                       if ($upd_intl < 0) { 
-                               // Updates for this feed are disabled
-                               continue; 
-                       }
-
-                       if ($fetch || (!$line["last_updated"] || 
-                               time() - strtotime($line["last_updated"]) > ($upd_intl * 60))) {
-
-//                             print "<!-- feed: ".$line["feed_url"]." -->";
-
-                               update_rss_feed($link, $line["feed_url"], $line["id"], $force_daemon);
-
-                               $upd_elapsed = time() - $upd_start;
-
-                               if (MAX_UPDATE_TIME > 0 && $upd_elapsed > MAX_UPDATE_TIME) {
-                                       return;
-                               }
-                       }
-               }
-
-//             db_query($link, "COMMIT");
-
-       }
-
        function fetch_file_contents($url) {
                if (USE_CURL_FOR_ICONS) {
                        $tmpfile = tempnam(TMP_DIRECTORY, "ttrss-tmp");
                } else {
 
                        $result = db_query($link, "SELECT id,update_interval,auth_login,
-                               auth_pass,cache_images,update_method,hidden
+                               auth_pass,cache_images,update_method,hidden,last_updated
                                FROM ttrss_feeds WHERE id = '$feed'");
 
                }
 
                $hidden = sql_bool_to_bool(db_fetch_result($result, 0, "hidden"));
                $update_method = db_fetch_result($result, 0, "update_method");
+               $last_updated = db_fetch_result($result, 0, "last_updated");
 
                db_query($link, "UPDATE ttrss_feeds SET last_update_started = NOW()
                        WHERE id = '$feed'");
                                }
                        } 
 
+                       if (!$last_updated) {
+                               if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) {
+                                       _debug("update_rss_feed: new feed, catching it up...");
+                               }
+                               catchup_feed($link, $feed, false);
+                       }
+
                        if (!$hidden) {
                                if (defined('DAEMON_EXTENDED_DEBUG') || $_GET['xdebug']) {
                                        _debug("update_rss_feed: updating counters cache...");
        }
 
        function printFeedEntry($feed_id, $class, $feed_title, $unread, $icon_file, $link,
-               $rtl_content = false, $last_updated = false, $last_error = false) {
+               $rtl_content = false, $last_updated = false, $last_error = false,
+               $fg_content = false, $bg_content = false) {
 
                if (file_exists($icon_file) && filesize($icon_file) > 0) {
                                $feed_icon = "<img id=\"FIMG-$feed_id\" src=\"$icon_file\">";
                $feed = "<a title=\"$link_title\" id=\"FEEDL-$feed_id\" 
                        href=\"javascript:viewfeed('$feed_id', '', false, '', false, 0);\">$feed_title</a>";
 
+/*             if ($feed_id < -10) {
+                       $bg_color = "#00ccff";
+                       $fg_color = "white";
+               }
+
+               if ($fg_color || $bg_color) {
+                       $color_str = "<div class='labelColorIndicator'
+                               style='color : $fg_color; background-color : $bg_color'>l</div>";
+               } 
+
+               print $color_str; */
+
                print "<li id=\"FEEDR-$feed_id\" class=\"$class\">";
                if (get_pref($link, 'ENABLE_FEED_ICONS')) {
                        print "$feed_icon";
                        print "<div class=\"feedExtInfo\">
                                <span id=\"FLUPD-$feed_id\">$last_updated ($total total) $error_notify_msg</span></div>";
                }
-                        
+
                print "</li>";
 
        }
 
                        if (!$_SESSION["uid"] || !validate_session($link)) {
                                render_login_form($link, $mobile);
+                               //header("Location: login.php");
                                exit;
                        } else {
                                /* bump login timestamp */
                }
        }
        
+       function bool_to_sql_bool($s) {
+               if ($s) {
+                       return "true";
+               } else {
+                       return "false";
+               }
+       }
 
        function toggleEvenOdd($a) {
                if ($a == "even") 
                        
                                if ($cat_view) {
 
-                                       if ($feed > 0) {
-                                               $cat_qpart = "cat_id = '$feed'";
-                                       } else {
-                                               $cat_qpart = "cat_id IS NULL";
-                                       }
+                                       if ($feed >= 0) {
+
+                                               if ($feed > 0) {
+                                                       $cat_qpart = "cat_id = '$feed'";
+                                               } else {
+                                                       $cat_qpart = "cat_id IS NULL";
+                                               }
                                        
-                                       $tmp_result = db_query($link, "SELECT id 
-                                               FROM ttrss_feeds WHERE $cat_qpart AND owner_uid = " . 
-                                               $_SESSION["uid"]);
+                                               $tmp_result = db_query($link, "SELECT id 
+                                                       FROM ttrss_feeds WHERE $cat_qpart AND owner_uid = " . 
+                                                       $_SESSION["uid"]);
 
-                                       while ($tmp_line = db_fetch_assoc($tmp_result)) {
+                                               while ($tmp_line = db_fetch_assoc($tmp_result)) {
+
+                                                       $tmp_feed = $tmp_line["id"];
+
+                                                       db_query($link, "UPDATE ttrss_user_entries 
+                                                               SET unread = false,last_read = NOW() 
+                                                               WHERE feed_id = '$tmp_feed' AND owner_uid = " . $_SESSION["uid"]);
+                                               }
+                                       } else if ($feed == -2) {
 
-                                               $tmp_feed = $tmp_line["id"];
 
                                                db_query($link, "UPDATE ttrss_user_entries 
-                                                       SET unread = false,last_read = NOW() 
-                                                       WHERE feed_id = '$tmp_feed' AND owner_uid = " . $_SESSION["uid"]);
+                                                       SET unread = false,last_read = NOW() WHERE (SELECT COUNT(*) 
+                                                               FROM ttrss_user_labels2 WHERE article_id = ref_id) > 0 
+                                                       AND unread = true AND owner_uid = " . $_SESSION["uid"]);
                                        }
 
                                } else if ($feed > 0) {
                                        $label_id = -$feed - 11;
 
                                        db_query($link, "UPDATE ttrss_user_entries, ttrss_user_labels2 
-                                               SET unread = false WHERE label_id = '$label_id' AND unread = true
+                                               SET unread = false, last_read = NOW() 
+                                                       WHERE label_id = '$label_id' AND unread = true
                                                        AND owner_uid = '".$_SESSION["uid"]."' AND ref_id = article_id");
 
                                }
        }
 
        function get_script_dt_add() {
-               if (strpos(VERSION, ".99") === false) {
+/*             if (strpos(VERSION, ".99") === false) {
                        return VERSION;
                } else {
                        return time();
-               }
+               } */
+               return time();
        }
 
        function get_pgsql_version($link) {
                print "<param key=\"hide_read_feeds\" value=\"" . 
                        (int) get_pref($link, "HIDE_READ_FEEDS") . "\"/>";
 
+               print "<param key=\"enable_feed_cats\" value=\"" . 
+                       (int) get_pref($link, "ENABLE_FEED_CATS") . "\"/>";
+
                print "<param key=\"feeds_sort_by_unread\" value=\"" . 
                        (int) get_pref($link, "FEEDS_SORT_BY_UNREAD") . "\"/>";
 
 
                print "<param key=\"sync_counters\" value=\"1\"/>";
 
+               print "<param key=\"offline_enabled\" value=\"".
+                       (int) get_pref($link, "ENABLE_OFFLINE_READING") . "\"/>";
+
+               $result = db_query($link, "SELECT COUNT(*) AS cf FROM
+                       ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"]);
+
+               $num_feeds = db_fetch_result($result, 0, "cf");
+
+               print "<param key=\"num_feeds\" value=\"".
+                       (int)$num_feeds. "\"/>";
+
                print "</init-params>";
        }
 
        function print_runtime_info($link) {
                print "<runtime-info>";
 
+               $result = db_query($link, "SELECT COUNT(*) AS cf FROM
+                       ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"]);
+
+               $num_feeds = db_fetch_result($result, 0, "cf");
+
+               print "<param key=\"num_feeds\" value=\"".
+                       (int)$num_feeds. "\"/>";
+
                if (ENABLE_UPDATE_DAEMON) {
                        print "<param key=\"daemon_is_running\" value=\"".
                                sprintf("%d", file_is_locked("update_daemon.lock")) . "\"/>";
 
                if (CHECK_FOR_NEW_VERSION && $_SESSION["access_level"] >= 10) {
                        
-                       if ($_SESSION["last_version_check"] + 86400 < time()) {
+                       if ($_SESSION["last_version_check"] + 86400 + rand(-1000, 1000) < time()) {
                                $new_version_details = check_for_update($link);
 
                                print "<param key=\"new_version_available\" value=\"".
                                $feed_title = "?";
                        }
 
-                       if ($feed < -10) error_reporting (0);
-
                        $content_query_part = "content as content_preview,";
 
                        if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) {
 
                                        $mail = new PHPMailer();
 
-                                       $mail->PluginDir = "phpmailer/";
-                                       $mail->SetLanguage("en", "phpmailer/language/");
+                                       $mail->PluginDir = "lib/phpmailer/";
+                                       $mail->SetLanguage("en", "lib/phpmailer/language/");
 
                                        $mail->CharSet = "UTF-8";
 
 
        function prepare_headlines_digest($link, $user_id, $days = 1, $limit = 100) {
 
-               require_once "MiniTemplator.class.php";
+               require_once "lib/MiniTemplator.class.php";
 
                $tpl = new MiniTemplator;
                $tpl_t = new MiniTemplator;
                return array($tmp, $headlines_count, $affected_ids, $tmp_t);
        }
 
-       function check_for_update($link, $brief_fmt = true) {
+       function check_for_update($link) {
                $releases_feed = "http://tt-rss.org/releases.rss";
 
                if (!CHECK_FOR_NEW_VERSION || $_SESSION["access_level"] < 10) {
                        }
 
                        if (version_compare(VERSION, $latest_version) == -1) {
-                               if ($brief_fmt) {
-                                       return format_notice("<a href=\"javascript:showBlockElement('milestoneDetails')\">      
-                                               New version of Tiny-Tiny RSS ($latest_version) is available (click for details)</a>
-                                               <div id=\"milestoneDetails\">$content</div>");
-                               } else {
-                                       return "New version of Tiny-Tiny RSS ($latest_version) is available:
-                                               <div class='milestoneDetails'>$content</div>
-                                               Visit <a target=\"_blank\" href=\"http://tt-rss.org/\">official site</a> for
-                                               download and update information.";      
-                               }
-
-                       }                       
+                               return sprintf("New version of Tiny-Tiny RSS (%s) is available:", 
+                                       $latest_version)."<div class='milestoneDetails'>$content</div>";
+                       } else {
+                               return false;
+                       }       
                }
        }
 
        }
 
        function print_headline_subtoolbar($link, $feed_site_url, $feed_title, 
-                       $bottom = false, $rtl_content = false, $feed_id = 0,
-                       $is_cat = false, $search = false, $match_on = false,
-                       $search_mode = false, $offset = 0, $limit = 0, 
-                       $dashboard_menu = 0, $disable_feed = 0, $feed_small_icon = 0) {
+                       $feed_id, $is_cat, $search, $match_on,
+                       $search_mode) {
 
-                       $user_page_offset = $offset + 1;
-
-                       if (!$bottom) {
-                               $class = "headlinesSubToolbar";
-                               $tid = "headlineActionsTop";
-                       } else {
-                               $class = "headlinesSubToolbar";
-                               $tid = "headlineActionsBottom";
-                       }
-
-                       print "<nobr><table class=\"$class\" id=\"$tid\"
-                               width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr>";
-
-                       if ($rtl_content) {
-                               $rtl_cpart = "RTL";
-                       } else {
-                               $rtl_cpart = "";
-                       }
+                       print "<div class=\"headlinesSubToolbar\">";
 
                        $page_prev_link = "javascript:viewFeedGoPage(-1)";
                        $page_next_link = "javascript:viewFeedGoPage(1)";
 
                        }
 
-                                       print "<td class=\"headlineActions$rtl_cpart\">";
-
-
-/*                                     print"<ul class=\"headlineDropdownMenu\">
-                                               <li class=\"top2\">
-                                               ".__('Select:')."
-                                                       <a href=\"$sel_all_link\">".__('All')."</a>,
-                                                       <a href=\"$sel_unread_link\">".__('Unread')."</a>,
-                                                       <a href=\"$sel_inv_link\">".__('Invert')."</a>,
-                                                       <a href=\"$sel_none_link\">".__('None')."</a></li>
-                                               <li class=\"vsep\">&nbsp;</li>
-                                               <li class=\"top\">".__('Actions...')."<ul>
-                                                       <li><span class=\"insensitive\">".__('Selection toggle:')."</span></li>
-                                                       <li onclick=\"$tog_unread_link\">&nbsp;&nbsp;".__('Unread')."</li>
-                                                       <li onclick=\"$tog_marked_link\">&nbsp;&nbsp;".__('Starred')."</li>
-                                                       <li onclick=\"$tog_published_link\">&nbsp;&nbsp;".__('Published')."</li>
-                                                       <!-- <li><span class=\"insensitive\">--------</span></li> -->
-                                                       <li><span class=\"insensitive\">".__('Mark as read:')."</span></li>
-                                                       <li onclick=\"$catchup_sel_link\">&nbsp;&nbsp;".__('Selection')."</li>";
-
-                               print "<li onclick=\"$catchup_feed_link\">&nbsp;&nbsp;".__('Entire feed')."</li>";
-
-                               //print "<li><span class=\"insensitive\">--------</span></li>";
-                               print "<li><span class=\"insensitive\">".__('Assign label:')."</span></li>";
-
-                               $result = db_query($link, "SELECT id, caption FROM ttrss_labels2 WHERE
-                                       owner_uid = '".$_SESSION["uid"]."' ORDER BY caption");
-
-                               while ($line = db_fetch_assoc($result)) {
-
-                                       $label_id = $line["id"];
-                                       $label_caption = $line["caption"];
-
-                                       if ($feed_id < -10 && $feed_id == -11-$label_id) {
-                                               print "<li onclick=\"javascript:selectionRemoveLabel($label_id)\">
-                                                       &nbsp;&nbsp;$label_caption ".__('(remove)')."</li>";
-                                       } else {                                        
-                                               print "<li onclick=\"javascript:selectionAssignLabel($label_id)\">
-                                                       &nbsp;&nbsp;$label_caption</li>";
-                                       }
-                       }
-
-                               print   "</ul></li></ul>"; */
-
-                               print __('Select:')."
-                                                       <a href=\"$sel_all_link\">".__('All')."</a>,
-                                                       <a href=\"$sel_unread_link\">".__('Unread')."</a>,
-                                                       <a href=\"$sel_inv_link\">".__('Invert')."</a>,
-                                                       <a href=\"$sel_none_link\">".__('None')."</a></li>";
-
-                               print "&nbsp;&nbsp;";
-
-                                       print "<span 
-                                               onmouseover=\"enable_selection(false)\" 
-                           onmouseout=\"enable_selection(true)\"
-                                               onclick=\"toggleHeadlineActions()\" id=\"headlineActionsDrop\">".
-                                               __("Actions...") . "&nbsp;&nbsp;<img src=\"images/down_arrow.png\">
-                                               </span>";
-
-                               print "<ul id=\"headlineActionsBody\" style=\"display : none\">";
-
-                               print "<li><span class=\"insensitive\">".__('Selection toggle:')."</span></li>
-                                       <li onclick=\"$tog_unread_link\">&nbsp;&nbsp;".__('Unread')."</li>
-                                       <li onclick=\"$tog_marked_link\">&nbsp;&nbsp;".__('Starred')."</li>
-                                       <li onclick=\"$tog_published_link\">&nbsp;&nbsp;".__('Published')."</li>
-                                       <!-- <li><span class=\"insensitive\">--------</span></li> -->
-                                       <li><span class=\"insensitive\">".__('Mark as read:')."</span></li>
-                                       <li onclick=\"$catchup_sel_link\">&nbsp;&nbsp;".__('Selection')."</li>";
-
-                               print "<li onclick=\"$catchup_feed_link\">&nbsp;&nbsp;".__('Entire feed').
-                                       "</li>";
-
-                               //print "<li><span class=\"insensitive\">--------</span></li>";
-                               print "<li><span class=\"insensitive\">".__('Assign label:')."</span></li>";
-
-                               $result = db_query($link, "SELECT id, caption FROM ttrss_labels2 WHERE
-                                       owner_uid = '".$_SESSION["uid"]."' ORDER BY caption");
-
-                               while ($line = db_fetch_assoc($result)) {
-
-                                       $label_id = $line["id"];
-                                       $label_caption = $line["caption"];
-
-                                       if ($feed_id < -10 && $feed_id == -11-$label_id) {
-                                               print "<li onclick=\"javascript:selectionRemoveLabel($label_id)\">
-                                                       &nbsp;&nbsp;$label_caption ".__('(remove)')."</li>";
-                                       } else {                                        
-                                               print "<li onclick=\"javascript:selectionAssignLabel($label_id)\">
-                                                       &nbsp;&nbsp;$label_caption</li>";
-                                       }
-                               }
-
-                               print "</ul>";
-
-                               print "</td>"; 
-       
-                       print "<td class=\"headlineTitle$rtl_cpart\">";
-
-                       print "<span id=\"subtoolbar_search\" 
-                               style=\"display : none\"><input 
-                               id=\"subtoolbar_search_box\"
-                               onblur=\"javascript:enableHotkeys();\" 
-                               onfocus=\"javascript:disableHotkeys();\"
-                               onchange=\"subtoolbarSearch()\"
-                               onkeyup=\"subtoolbarSearch()\" type=\"search\"></span>";
-
-                       print "<span id=\"subtoolbar_ftitle\">";
+                       print "<div id=\"subtoolbar_ftitle\">";
 
                        if ($feed_site_url) {
                                if (!$bottom) {
                                $search_q = "&q=$search&m=$match_on&smode=$search_mode";
                        }
 
-                       if ($user_page_offset > 1) {
-                               print " [$user_page_offset] ";
-                       }
+                       print "
+                               <a target=\"_blank\" 
+                                       href=\"backend.php?op=rss&id=$feed_id&is_cat=$is_cat$search_q\">
+                                       <img class=\"noborder\" 
+                                               alt=\"".__('Generated feed')."\" src=\"images/feed-icon-12x12.png\">
+                                               </a>";
 
-                       if (!$bottom && !$disable_feed) {
-                               print "
-                                       <a target=\"_blank\" 
-                                               href=\"backend.php?op=rss&id=$feed_id&is_cat=$is_cat$search_q\">
-                                               <img class=\"noborder\" 
-                                                       alt=\"".__('Generated feed')."\" src=\"images/feed-icon-12x12.png\">
-                                       </a>";
-                       } else if ($feed_small_icon) {
-                               print "<img class=\"noborder\" alt=\"\" src=\"images/$feed_small_icon\">";
-                       }
+                       print "</div>";
 
-                       print "</span>";
+                       print __('Select:')."
+                               <a href=\"$sel_all_link\">".__('All')."</a>,
+                               <a href=\"$sel_unread_link\">".__('Unread')."</a>,
+                               <a href=\"$sel_inv_link\">".__('Invert')."</a>,
+                               <a href=\"$sel_none_link\">".__('None')."</a></li>";
+
+                       print "&nbsp;&nbsp;";
+
+                       print "<span 
+                               onmouseover=\"enable_selection(false)\" 
+            onmouseout=\"enable_selection(true)\"
+                               onclick=\"toggleHeadlineActions()\" id=\"headlineActionsDrop\">".
+                               __("Actions...") . "&nbsp;&nbsp;<img src=\"images/down_arrow.png\">
+                               </span>";
+
+                       print "<ul id=\"headlineActionsBody\" style=\"display : none\">";
 
-                       print "</td>";
-                       print "</tr></table></nobr>";
+                       print "<li class=\"insensitive\">".__('Selection toggle:')."</li>
+                               <li onclick=\"$tog_unread_link\">&nbsp;&nbsp;".__('Unread')."</li>
+                               <li onclick=\"$tog_marked_link\">&nbsp;&nbsp;".__('Starred')."</li>
+                               <li onclick=\"$tog_published_link\">&nbsp;&nbsp;".__('Published')."</li>
+                               <!-- <li><span class=\"insensitive\">--------</span></li> -->
+                               <li class=\"insensitive\">".__('Mark as read:')."</li>
+                               <li onclick=\"$catchup_sel_link\">&nbsp;&nbsp;".__('Selection')."</li>";
 
+                       print "<li onclick=\"$catchup_feed_link\">&nbsp;&nbsp;".__('Entire feed').
+                               "</li>";
+
+                       //print "<li><span class=\"insensitive\">--------</span></li>";
+                       print "<li class=\"insensitive\">".__('Assign label:')."</li>";
+
+                       print_labels_headlines_dropdown($link, $feed_id);
+
+                       print "</ul>";
+
+                       print "</div>";
                }
 
        function printCategoryHeader($link, $cat_id, $hidden = false, $can_browse = true) {
                if (!$tags) {
 
 
-                               $result = db_query($link, "SELECT id,caption FROM                                       
+                               $result = db_query($link, "SELECT * FROM
                                        ttrss_labels2 WHERE owner_uid = '$owner_uid' ORDER by caption");
                
                                if (db_num_rows($result) > 0) {
        
                                        printFeedEntry($label_id, 
                                                $class, $line["caption"], 
-                                               $count, "images/label.png", $link);
+                                               $count, "images/label.png", $link, 
+                                               false, false, false,
+                                               $line['fg_color'], $line['bg_color']);
                
                                }
 
                                print "<div clear='both'>" . $line["title"] . "$entry_author</div>";
                        }
 
-                       $tags = get_article_tags($link, $id);
-       
-                       $tags_str = "";
-                       $tags_nolinks_str = "";
-                       $f_tags_str = "";
-
-                       $num_tags = 0;
-
-                       if ($_SESSION["theme"] == "3pane") {
-                               $tag_limit = 3;
-                       } else {
-                               $tag_limit = 6;
-                       }
-
-                       foreach ($tags as $tag) {
-                               $num_tags++;
-                               $tag_escaped = str_replace("'", "\\'", $tag);
-
-                               $tag_str = "<a href=\"javascript:viewfeed('$tag_escaped')\">$tag</a>, ";
-                               
-                               if ($num_tags == $tag_limit) {
-                                       $tags_str .= "&hellip;";
-                                       $tags_nolinks_str .= "&hellip;";
-
-                               } else if ($num_tags < $tag_limit) {
-                                       $tags_str .= $tag_str;
-                                       $tags_nolinks_str .= "$tag, ";
-                               }
-                               $f_tags_str .= $tag_str;
-                       }
-
-                       $tags_str = preg_replace("/, $/", "", $tags_str);
-                       $tags_nolinks_str = preg_replace("/, $/", "", $tags_nolinks_str);
-                       $f_tags_str = preg_replace("/, $/", "", $f_tags_str);
-
-                       $all_tags_div = "<span class='cdmAllTagsCtr'>&hellip;<div class='cdmAllTags'>All Tags: $f_tags_str</div></span>";
-                       $tags_str = preg_replace("/\.\.\.$/", "$all_tags_div", $tags_str);
+                       $tags_str = format_tags_string(get_article_tags($link, $id), $id);
 
                        if (!$entry_comments) $entry_comments = "&nbsp;"; # placeholder
 
-                       if (!$tags_str) $tags_str = '<span class="tagList">'.__('no tags').'</span>';
-                       if (!$tags_nolinks_str) $tags_nolinks_str = '<span class="tagList">'.__('no tags').'</span>';
-
                        print "<div style='float : right'>
                                        <img src='images/tag.png' class='tagsPic' alt='Tags' title='Tags'>";
 
                        if (!$zoom_mode) {
-                               print "$tags_str 
+                               print "<span id=\"ATSTR-$id\">$tags_str</span>
                                        <a title=\"".__('Edit tags for this article')."\" 
                                        href=\"javascript:editArticleTags($id, $feed_id)\">(+)</a>";
 
                                                style=\"cursor : pointer\" style=\"cursor : pointer\"
                                                onclick=\"zoomToArticle($id)\"
                                                alt='Zoom' title='".__('Show article summary in new window')."'>";
-                       } else {
-                               print "$tags_nolinks_str";
                        }
                        print "</div>";
                        print "<div clear='both'>$entry_comments</div>";
 
                        print "<div class=\"postContent\">";
 
-                       #print "<div id=\"allEntryTags\">".__('Tags:')." $f_tags_str</div>";
-
                        $article_content = sanitize_rss($link, $line["content"]);
 
                        if (get_pref($link, 'OPEN_LINKS_IN_NEW_WINDOW')) {
                                return;
                        }
 
-                       print_headline_subtoolbar($link, $feed_site_url, $feed_title, false, 
-                               $rtl_content, $feed, $cat_view, $search, $match_on, $search_mode, 
-                               $offset, $limit);
+                       print_headline_subtoolbar($link, $feed_site_url, $feed_title,
+                               $feed, $cat_view, $search, $match_on, $search_mode);
 
                        print "<div id=\"headlinesInnerContainer\" onscroll=\"headlines_scroll_handler()\">";
                }
                                $feed_id = $line["feed_id"];
 
                                $labels = get_article_labels($link, $id);
-                               $labels_str = "<span id=\"HLLCTR-$id\">";
-
-                               foreach ($labels as $l) {
-                                       $labels_str .= "<span 
-                                               class='hlLabelRef'>".
-                                               $l[1]."</span>";
-                               }
 
+                               $labels_str = "<span id=\"HLLCTR-$id\">";
+                               $labels_str .= format_article_labels($labels, $id);
                                $labels_str .= "</span>";
-
+       
                                if (count($topmost_article_ids) < 5) {
                                        array_push($topmost_article_ids, $id);
                                }
                                                alt='Zoom' 
                                                title='".__('Show article summary in new window')."'></span>";
 
-                                       $tags = get_article_tags($link, $id);
-
-                                       $tags_str = "";
-                                       $full_tags_str = "";
-                                       $num_tags = 0;
-
-                                       foreach ($tags as $tag) {
-                                               $num_tags++;
-                                               $full_tags_str .= "<a href=\"javascript:viewfeed('$tag')\">$tag</a>, "; 
-                                               if ($num_tags < 5) {
-                                                       $tags_str .= "<a href=\"javascript:viewfeed('$tag')\">$tag</a>, "; 
-                                               } else if ($num_tags == 5) {
-                                                       $tags_str .= "&hellip;";
-                                               }
-                                       }
-
-                                       $tags_str = preg_replace("/, $/", "", $tags_str);
-                                       $full_tags_str = preg_replace("/, $/", "", $full_tags_str);
-
-                                       $all_tags_div = "<span class='cdmAllTagsCtr'>&hellip;<div class='cdmAllTags'>All Tags: $full_tags_str</div></span>";
-
-                                       $tags_str = preg_replace("/\.\.\.$/", "$all_tags_div", $tags_str);
-
-
-                                       if ($tags_str == "") $tags_str = "no tags";
+                                       $tags_str = format_tags_string(get_article_tags($link, $id), $id);
 
 //                                     print "<img src='images/tag.png' class='markedPic'>";
 
                                        print "<span class='s1'>
-                                               <img class='tagsPic' src='images/tag.png' alt='Tags' 
-                                                       title='Tags'> $tags_str <a title=\"Edit tags for this article\" 
-                                                       href=\"javascript:editArticleTags($id, $feed_id, true)\">(+)</a>";
+                                               <img class='tagsPic' src='images/tag.png' alt='Tags' title='Tags'>
+                                               <span id=\"ATSTR-$id\">$tags_str</span>
+                                               <a title=\"".__('Edit tags for this article')."\" 
+                                               href=\"javascript:editArticleTags($id, $feed_id, true)\">(+)</a>";
 
                                        print "</span>";
 
        function ccache_find($link, $feed_id, $owner_uid, $is_cat = false, 
                $no_update = false) {
 
+               if (!is_numeric($feed_id)) return;
+
                if (!$is_cat) {
                        $table = "ttrss_counters_cache";
                } else {
        function ccache_update($link, $feed_id, $owner_uid, $is_cat = false, 
                $update_pcat = true) {
 
+               if (!is_numeric($feed_id)) return;
+
                $prev_unread = ccache_find($link, $feed_id, $owner_uid, $is_cat, true);
 
                /* When updating a label, all we need to do is recalculate feed counters
 
        function get_article_labels($link, $id) {
                $result = db_query($link, 
-                       "SELECT DISTINCT label_id,caption 
+                       "SELECT DISTINCT label_id,caption,fg_color,bg_color 
                                FROM ttrss_labels2, ttrss_user_labels2 
                        WHERE id = label_id 
                                AND article_id = '$id' 
                $rv = array();
 
                while ($line = db_fetch_assoc($result)) {
-                       $rk = array($line["label_id"], $line["caption"]);
+                       $rk = array($line["label_id"], $line["caption"], $line["fg_color"],
+                               $line["bg_color"]);
                        array_push($rv, $rk);
                }
 
 
                db_query($link, "COMMIT");
        }
+
+       function label_create($link, $caption) {
+
+               db_query($link, "BEGIN");
+
+               $result = false;
+
+               $result = db_query($link, "SELECT id FROM ttrss_labels2
+                       WHERE caption = '$caption' AND owner_uid =  ". $_SESSION["uid"]);
+
+               if (db_num_rows($result) == 0) {
+                       $result = db_query($link,
+                               "INSERT INTO ttrss_labels2 (caption,owner_uid) 
+                                       VALUES ('$caption', '".$_SESSION["uid"]."')");
+
+                       $result = db_affected_rows($link, $result) != 0;
+               }
+
+               db_query($link, "COMMIT");
+
+               return $result;
+       }
+
+       function print_labels_headlines_dropdown($link, $feed_id) {
+               print "<li onclick=\"javascript:addLabel()\">
+                       &nbsp;&nbsp;".__("Create label...")."</li>";
+
+               $result = db_query($link, "SELECT id, caption FROM ttrss_labels2 WHERE
+                       owner_uid = '".$_SESSION["uid"]."' ORDER BY caption");
+
+               while ($line = db_fetch_assoc($result)) {
+
+                       $label_id = $line["id"];
+                       $label_caption = $line["caption"];
+
+                       if ($feed_id < -10 && $feed_id == -11-$label_id) {
+                               print "<li id=\"LHDL-$id\" 
+                                       onclick=\"javascript:selectionRemoveLabel($label_id)\">
+                                       &nbsp;&nbsp;$label_caption ".__('(remove)')."</li>";
+                       } else {                                        
+                               print "<li id=\"LHDL-$id\" 
+                                       onclick=\"javascript:selectionAssignLabel($label_id)\">
+                                       &nbsp;&nbsp;$label_caption</li>";
+                       }
+               }
+       }
+
+       function format_tags_string($tags, $id) {
+
+               $tags_str = "";
+               $tags_nolinks_str = "";
+
+               $num_tags = 0;
+
+               if ($_SESSION["theme"] == "3pane") {
+                       $tag_limit = 3;
+               } else {
+                       $tag_limit = 6;
+               }
+
+               $formatted_tags = array();
+
+               foreach ($tags as $tag) {
+                       $num_tags++;
+                       $tag_escaped = str_replace("'", "\\'", $tag);
+
+                       $tag_str = "<a href=\"javascript:viewfeed('$tag_escaped')\">$tag</a>";
+
+                       array_push($formatted_tags, $tag_str);
+                               
+                       if ($num_tags == $tag_limit) {
+                               break;
+                       }
+               }
+
+               $tags_str = implode(", ", $formatted_tags);
+
+               if ($num_tags < count($tags)) {
+                       $tags_str .= ", &hellip;";
+               }
+
+               if ($num_tags == 0) {
+                       $tags_str = __("no tags");
+               }
+
+               return $tags_str;
+
+       }
+
+       function format_article_labels($labels, $id) {
+
+               $labels_str = "";
+
+               foreach ($labels as $l) {
+                       $labels_str .= sprintf("<span class='hlLabelRef' 
+                               style='color : %s; background-color : %s'>%s</span>",
+                                       $l[2], $l[3], $l[1]);
+                       }
+
+               return $labels_str;
+
+       }
 ?>