예제 #1
0
 function showrelated()
 {
     $id = (int) db_escape_string($_REQUEST['param']);
     $owner_uid = $_SESSION["uid"];
     $result = db_query("SELECT title FROM ttrss_entries, ttrss_user_entries\n\t\t\tWHERE ref_id = id AND id = {$id} AND owner_uid = {$owner_uid}");
     $title = db_fetch_result($result, 0, "title");
     print "<h2>{$title}</h2>";
     $title = db_escape_string($title);
     $result = db_query("SELECT ttrss_entries.id AS id,\n\t\t\t\tfeed_id,\n\t\t\t\tttrss_entries.title AS title,\n\t\t\t\tupdated, link,\n\t\t\t\tttrss_feeds.title AS feed_title,\n\t\t\t\tSIMILARITY(ttrss_entries.title, '{$title}') AS sm\n\t\t\tFROM\n\t\t\t\tttrss_entries, ttrss_user_entries LEFT JOIN ttrss_feeds ON (ttrss_feeds.id = feed_id)\n\t\t\tWHERE\n\t\t\t\tttrss_entries.id = ref_id AND\n\t\t\t\tttrss_user_entries.owner_uid = {$owner_uid} AND\n\t\t\t\tttrss_entries.id != {$id} AND\n\t\t\t\tdate_entered >= NOW() - INTERVAL '2 weeks'\n\t\t\tORDER BY\n\t\t\t\tsm DESC, date_entered DESC\n\t\t\tLIMIT 10");
     print "<ul class=\"browseFeedList\" style=\"border-width : 1px\">";
     while ($line = db_fetch_assoc($result)) {
         print "<li>";
         print "<div class='insensitive small' style='margin-left : 20px; float : right'>" . smart_date_time(strtotime($line["updated"])) . "</div>";
         $sm = sprintf("%.2f", $line['sm']);
         print "<img src='images/score_high.png' title='{$sm}'\n\t\t\t\tstyle='vertical-align : middle'>";
         $article_link = htmlspecialchars($line["link"]);
         print " <a target=\"_blank\" href=\"{$article_link}\">" . $line["title"] . "</a>";
         print " (<a href=\"#\" onclick=\"viewfeed(" . $line["feed_id"] . ")\">" . htmlspecialchars($line["feed_title"]) . "</a>)";
         print " <span class='insensitive'>({$sm})</span>";
         print "</li>";
     }
     print "</ul>";
     print "<div style='text-align : center'>";
     print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('trgmRelatedDlg').hide()\">" . __('Close this window') . "</button>";
     print "</div>";
 }
예제 #2
0
function render_article($link, $id, $feed_id, $cat_id)
{
    $query = "SELECT title,link,content,feed_id,comments,int_id,\n\t\t\tmarked,unread,published,\n\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,16) as updated,\n\t\t\tauthor\n\t\t\tFROM ttrss_entries,ttrss_user_entries\n\t\t\tWHERE\tid = '{$id}' AND ref_id = id AND owner_uid = " . $_SESSION["uid"];
    $result = db_query($link, $query);
    if (db_num_rows($result) != 0) {
        $line = db_fetch_assoc($result);
        $tmp_result = db_query($link, "UPDATE ttrss_user_entries \n\t\t\t\tSET unread = false,last_read = NOW() \n\t\t\t\tWHERE ref_id = '{$id}'\n\t\t\t\tAND owner_uid = " . $_SESSION["uid"]);
        if (get_pref($link, 'HEADLINES_SMART_DATE')) {
            $updated_fmt = smart_date_time(strtotime($line["updated"]));
        } else {
            $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
            $updated_fmt = date($short_date, strtotime($line["updated"]));
        }
        $title = $line["title"];
        $article_link = $line["link"];
        $feed_title = getFeedTitle($link, $feed_id, false);
        print "<div class=\"panel\" id=\"article-{$id}\" title=\"{$title}\" \n\t\t\t\tselected=\"true\"\n\t\t\t\tmyBackLabel='{$feed_title}' myBackHref='feed.php?id={$feed_id}&cat={$cat_id}'>";
        print "<h2><a target='_blank' href='{$article_link}'>{$title}</a></h2>";
        print "<fieldset>";
        /*			print "<div class=\"row\">";
        			print "<label id='title'><a target='_blank' href='$article_link'>$title</a></label>";
        			print "</div>"; */
        $is_starred = sql_bool_to_bool($line["marked"]) ? "true" : "false";
        $is_published = sql_bool_to_bool($line["published"]) ? "true" : "false";
        print "<div class=\"row\">";
        print "<label id='updated'>Updated:</label>";
        print "<input enabled='false' name='updated' disabled value='{$updated_fmt}'/>";
        print "</div>";
        print "</fieldset>";
        $content = sanitize_rss($link, $line["content"]);
        $content = preg_replace("/href=/i", "target=\"_blank\" href=", $content);
        if (!mobile_get_pref($link, "SHOW_IMAGES")) {
            $content = preg_replace('/<img[^>]+>/is', '', $content);
        }
        print "<p>{$content}</p>";
        print "<fieldset>";
        print "<div class=\"row\">\n\t                <label>Starred</label>\n\t                <div class=\"toggle\" onclick=\"toggleMarked({$id}, this)\" toggled=\"{$is_starred}\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>\n\t            </div>";
        print "<div class=\"row\">\n\t                <label>Published</label>\n\t                <div class=\"toggle\" onclick=\"togglePublished({$id}, this)\" toggled=\"{$is_published}\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>\n\t            </div>";
        print "</fieldset>";
        print "</div>";
    }
}
예제 #3
0
function make_local_datetime($timestamp, $long, $owner_uid = false, $no_smart_dt = false, $eta_min = false)
{
    if (!$owner_uid) {
        $owner_uid = $_SESSION['uid'];
    }
    if (!$timestamp) {
        $timestamp = '1970-01-01 0:00';
    }
    global $utc_tz;
    global $user_tz;
    if (!$utc_tz) {
        $utc_tz = new DateTimeZone('UTC');
    }
    $timestamp = substr($timestamp, 0, 19);
    # We store date in UTC internally
    $dt = new DateTime($timestamp, $utc_tz);
    $user_tz_string = get_pref('USER_TIMEZONE', $owner_uid);
    if ($user_tz_string != 'Automatic') {
        try {
            if (!$user_tz) {
                $user_tz = new DateTimeZone($user_tz_string);
            }
        } catch (Exception $e) {
            $user_tz = $utc_tz;
        }
        $tz_offset = $user_tz->getOffset($dt);
    } else {
        $tz_offset = (int) -$_SESSION["clientTzOffset"];
    }
    $user_timestamp = $dt->format('U') + $tz_offset;
    if (!$no_smart_dt) {
        return smart_date_time($user_timestamp, $tz_offset, $owner_uid, $eta_min);
    } else {
        if ($long) {
            $format = get_pref('LONG_DATE_FORMAT', $owner_uid);
        } else {
            $format = get_pref('SHORT_DATE_FORMAT', $owner_uid);
        }
        return date($format, $user_timestamp);
    }
}
예제 #4
0
function make_local_datetime($link, $timestamp, $long, $owner_uid = false, $no_smart_dt = false)
{
    if (!$owner_uid) {
        $owner_uid = $_SESSION['uid'];
    }
    if (!$timestamp) {
        $timestamp = '1970-01-01 0:00';
    }
    global $utc_tz;
    global $tz_offset;
    # We store date in UTC internally
    $dt = new DateTime($timestamp, $utc_tz);
    if ($tz_offset == -1) {
        $user_tz_string = get_pref($link, 'USER_TIMEZONE', $owner_uid);
        try {
            $user_tz = new DateTimeZone($user_tz_string);
        } catch (Exception $e) {
            $user_tz = $utc_tz;
        }
        $tz_offset = $user_tz->getOffset($dt);
    }
    $user_timestamp = $dt->format('U') + $tz_offset;
    if (!$no_smart_dt) {
        return smart_date_time($link, $user_timestamp, $tz_offset, $owner_uid);
    } else {
        if ($long) {
            $format = get_pref($link, 'LONG_DATE_FORMAT', $owner_uid);
        } else {
            $format = get_pref($link, 'SHORT_DATE_FORMAT', $owner_uid);
        }
        return date($format, $user_timestamp);
    }
}
예제 #5
0
function outputHeadlinesList($link, $feed, $subop, $view_mode, $limit, $cat_view, $next_unread_feed, $offset, $vgr_last_feed = false, $override_order = false)
{
    $disable_cache = false;
    $timing_info = getmicrotime();
    $topmost_article_ids = array();
    if (!$offset) {
        $offset = 0;
    }
    if ($subop == "undefined") {
        $subop = "";
    }
    $subop_split = split(":", $subop);
    if ($subop == "CatchupSelected") {
        $ids = split(",", db_escape_string($_REQUEST["ids"]));
        $cmode = sprintf("%d", $_REQUEST["cmode"]);
        catchupArticlesById($link, $ids, $cmode);
    }
    if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) {
        update_generic_feed($link, $feed, $cat_view, true);
    }
    if ($subop == "MarkAllRead") {
        catchup_feed($link, $feed, $cat_view);
        if (get_pref($link, 'ON_CATCHUP_SHOW_NEXT_FEED')) {
            if ($next_unread_feed) {
                $feed = $next_unread_feed;
            }
        }
    }
    if ($subop_split[0] == "MarkAllReadGR") {
        catchup_feed($link, $subop_split[1], false);
    }
    if ($feed_id > 0) {
        $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE id = '{$feed}' LIMIT 1");
        if (db_num_rows($result) == 0) {
            print "<div align='center'>" . __('Feed not found.') . "</div>";
            return;
        }
    }
    if (preg_match("/^-?[0-9][0-9]*\$/", $feed) != false) {
        $result = db_query($link, "SELECT rtl_content FROM ttrss_feeds\n\t\t\t\tWHERE id = '{$feed}' AND owner_uid = " . $_SESSION["uid"]);
        if (db_num_rows($result) == 1) {
            $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
        } else {
            $rtl_content = false;
        }
        if ($rtl_content) {
            $rtl_tag = "dir=\"RTL\"";
        } else {
            $rtl_tag = "";
        }
    } else {
        $rtl_tag = "";
        $rtl_content = false;
    }
    $script_dt_add = get_script_dt_add();
    /// START /////////////////////////////////////////////////////////////////////////////////
    $search = db_escape_string($_REQUEST["query"]);
    if ($search) {
        $disable_cache = true;
    }
    $search_mode = db_escape_string($_REQUEST["search_mode"]);
    $match_on = db_escape_string($_REQUEST["match_on"]);
    if (!$match_on) {
        $match_on = "both";
    }
    $real_offset = $offset * $limit;
    if ($_REQUEST["debug"]) {
        $timing_info = print_checkpoint("H0", $timing_info);
    }
    $qfh_ret = queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order, $real_offset);
    if ($_REQUEST["debug"]) {
        $timing_info = print_checkpoint("H1", $timing_info);
    }
    $result = $qfh_ret[0];
    $feed_title = $qfh_ret[1];
    $feed_site_url = $qfh_ret[2];
    $last_error = $qfh_ret[3];
    $vgroup_last_feed = $vgr_last_feed;
    if ($feed == -2) {
        $feed_site_url = article_publish_url($link);
    }
    /// STOP //////////////////////////////////////////////////////////////////////////////////
    if (!$offset) {
        print "<div id=\"headlinesContainer\" {$rtl_tag}>";
        if (!$result) {
            print "<div align='center'>" . __("Could not display feed (query failed). Please check label match syntax or local configuration.") . "</div>";
            return;
        }
        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()\">";
    }
    $headlines_count = db_num_rows($result);
    if (db_num_rows($result) > 0) {
        #			print "\{$offset}";
        if (!get_pref($link, 'COMBINED_DISPLAY_MODE') && !$offset) {
            print "<table class=\"headlinesList\" id=\"headlinesList\" \n\t\t\t\t\tcellspacing=\"0\">";
        }
        $lnum = $limit * $offset;
        error_reporting(DEFAULT_ERROR_LEVEL);
        $num_unread = 0;
        $cur_feed_title = '';
        $fresh_intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE") * 60 * 60;
        while ($line = db_fetch_assoc($result)) {
            $class = $lnum % 2 ? "even" : "odd";
            $id = $line["id"];
            $feed_id = $line["feed_id"];
            $labels = get_article_labels($link, $id);
            $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);
            }
            if ($line["last_read"] == "" && !sql_bool_to_bool($line["unread"])) {
                $update_pic = "<img id='FUPDPIC-{$id}' src=\"" . theme_image($link, 'images/updated.png') . "\" \n\t\t\t\t\t\talt=\"Updated\">";
            } else {
                $update_pic = "<img id='FUPDPIC-{$id}' src=\"images/blank_icon.gif\" \n\t\t\t\t\t\talt=\"Updated\">";
            }
            if (sql_bool_to_bool($line["unread"]) && time() - strtotime($line["updated_noms"]) < $fresh_intl) {
                $update_pic = "<img id='FUPDPIC-{$id}' src=\"" . theme_image($link, 'images/fresh_sign.png') . "\" alt=\"Fresh\">";
            }
            if ($line["unread"] == "t" || $line["unread"] == "1") {
                $class .= "Unread";
                ++$num_unread;
                $is_unread = true;
            } else {
                $is_unread = false;
            }
            if ($line["marked"] == "t" || $line["marked"] == "1") {
                $marked_pic = "<img id=\"FMPIC-{$id}\" \n\t\t\t\t\t\tsrc=\"" . theme_image($link, 'images/mark_set.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Unstar article\" \n\t\t\t\t\t\tonclick='javascript:tMark({$id})'>";
            } else {
                $marked_pic = "<img id=\"FMPIC-{$id}\" \n\t\t\t\t\t\tsrc=\"" . theme_image($link, 'images/mark_unset.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Star article\" \n\t\t\t\t\t\tonclick='javascript:tMark({$id})'>";
            }
            if ($line["published"] == "t" || $line["published"] == "1") {
                $published_pic = "<img id=\"FPPIC-{$id}\" src=\"" . theme_image($link, 'images/pub_set.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\"\n\t\t\t\t\t\talt=\"Unpublish article\" onclick='javascript:tPub({$id})'>";
            } else {
                $published_pic = "<img id=\"FPPIC-{$id}\" src=\"" . theme_image($link, 'images/pub_unset.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\"\n\t\t\t\t\t\talt=\"Publish article\" onclick='javascript:tPub({$id})'>";
            }
            #				$content_link = "<a target=\"_blank\" href=\"".$line["link"]."\">" .
            #					$line["title"] . "</a>";
            #				$content_link = "<a
            #					href=\"" . htmlspecialchars($line["link"]) . "\"
            #					onclick=\"view($id,$feed_id);\">" .
            #					$line["title"] . "</a>";
            #				$content_link = "<a href=\"javascript:viewContentUrl('".$line["link"]."');\">" .
            #					$line["title"] . "</a>";
            if (get_pref($link, 'HEADLINES_SMART_DATE')) {
                $updated_fmt = smart_date_time(strtotime($line["updated_noms"]));
            } else {
                $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
                $updated_fmt = date($short_date, strtotime($line["updated_noms"]));
            }
            if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) {
                $content_preview = truncate_string(strip_tags($line["content_preview"]), 100);
            }
            $score = $line["score"];
            $score_pic = theme_image($link, "images/" . get_score_pic($score));
            /*				$score_title = __("(Click to change)");
            				$score_pic = "<img class='hlScorePic' src=\"images/$score_pic\" 
            					onclick=\"adjustArticleScore($id, $score)\" title=\"$score $score_title\">"; */
            $score_pic = "<img class='hlScorePic' src=\"{$score_pic}\" \n\t\t\t\t\ttitle=\"{$score}\">";
            if ($score > 500) {
                $hlc_suffix = "H";
            } else {
                if ($score < -100) {
                    $hlc_suffix = "L";
                } else {
                    $hlc_suffix = "";
                }
            }
            $entry_author = $line["author"];
            if ($entry_author) {
                $entry_author = " - {$entry_author}";
            }
            $has_feed_icon = feed_has_icon($feed_id);
            if ($has_feed_icon) {
                $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">";
            } else {
                //$feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\" alt=\"\">";
                $feed_icon_img = "";
            }
            if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
                if (get_pref($link, 'VFEED_GROUP_BY_FEED')) {
                    if ($feed_id != $vgroup_last_feed && $line["feed_title"]) {
                        $cur_feed_title = $line["feed_title"];
                        $vgroup_last_feed = $feed_id;
                        $cur_feed_title = htmlspecialchars($cur_feed_title);
                        $vf_catchup_link = "(<a onclick='javascript:catchupFeedInGroup({$feed_id});' href='#'>" . __('mark as read') . "</a>)";
                        print "<tr class='feedTitle'><td colspan='7'>" . "<div style=\"float : right\">{$feed_icon_img}</div>" . "<a href=\"javascript:viewfeed({$feed_id}, '', false)\">" . $line["feed_title"] . "</a> {$vf_catchup_link}</td></tr>";
                    }
                }
                $mouseover_attrs = "onmouseover='postMouseIn({$id})' \n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'";
                print "<tr class='{$class}' id='RROW-{$id}' {$mouseover_attrs}>";
                print "<td class='hlUpdPic'>{$update_pic}</td>";
                print "<td class='hlSelectRow'>\n\t\t\t\t\t\t<input type=\"checkbox\" onclick=\"tSR(this)\"\n\t\t\t\t\t\t\tid=\"RCHK-{$id}\">\n\t\t\t\t\t\t</td>";
                print "<td class='hlMarkedPic'>{$marked_pic}</td>";
                print "<td class='hlMarkedPic'>{$published_pic}</td>";
                #					if ($line["feed_title"]) {
                #						print "<td class='hlContent'>$content_link</td>";
                #						print "<td class='hlFeed'>
                #							<a href=\"javascript:viewfeed($feed_id, '', false)\">".
                #								truncate_string($line["feed_title"],30)."</a>&nbsp;</td>";
                #					} else {
                print "<td onclick='view({$id})' class='hlContent{$hlc_suffix}' valign='middle' id='HLC-{$id}'>";
                print "<a id=\"RTITLE-{$id}\" \n\t\t\t\t\t\thref=\"" . htmlspecialchars($line["link"]) . "\"\n\t\t\t\t\t\tonclick=\"return false\">" . $line["title"];
                if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) {
                    if ($content_preview) {
                        print "<span class=\"contentPreview\"> - {$content_preview}</span>";
                    }
                }
                print "</a>";
                print $labels_str;
                #							<a href=\"javascript:viewfeed($feed_id, '', false)\">".
                #							$line["feed_title"]."</a>
                if (!get_pref($link, 'VFEED_GROUP_BY_FEED')) {
                    if ($line["feed_title"]) {
                        print "<span class=\"hlFeed\">\n\t\t\t\t\t\t\t\t(<a href=\"javascript:viewfeed({$feed_id}, '', false)\">" . $line["feed_title"] . "</a>)\n\t\t\t\t\t\t\t</span>";
                    }
                }
                //					print "<img id='HLL-$id' class='hlLoading'
                //						src='images/indicator_tiny.gif' style='display : none'>";
                print "</td>";
                #					}
                print "<td class=\"hlUpdated\" onclick='view({$id})'><nobr>{$updated_fmt}&nbsp;</nobr></td>";
                print "<td class='hlMarkedPic'>{$score_pic}</td>";
                if ($line["feed_title"] && !get_pref($link, 'VFEED_GROUP_BY_FEED')) {
                    print "<td onclick=\"viewfeed({$feed_id})\" class=\"hlFeedIcon\">{$feed_icon_img}</td>";
                }
                print "</tr>";
            } else {
                if (get_pref($link, 'VFEED_GROUP_BY_FEED') && $line["feed_title"]) {
                    if ($feed_id != $vgroup_last_feed) {
                        $cur_feed_title = $line["feed_title"];
                        $vgroup_last_feed = $feed_id;
                        $cur_feed_title = htmlspecialchars($cur_feed_title);
                        $vf_catchup_link = "(<a onclick='javascript:catchupFeedInGroup({$feed_id});' href='#'>" . __('mark as read') . "</a>)";
                        $has_feed_icon = feed_has_icon($feed_id);
                        if ($has_feed_icon) {
                            $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">";
                        } else {
                            //$feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\" alt=\"\">";
                        }
                        print "<div class='cdmFeedTitle'>" . "<div style=\"float : right\">{$feed_icon_img}</div>" . "<a href=\"javascript:viewfeed({$feed_id}, '', false)\">" . $line["feed_title"] . "</a> {$vf_catchup_link}</div>";
                    }
                }
                if ($is_unread) {
                    $add_class = "Unread";
                } else {
                    $add_class = "";
                }
                $expand_cdm = get_pref($link, 'CDM_EXPANDED');
                $show_excerpt = false;
                if ($expand_cdm && $score >= -100) {
                    $cdm_cstyle = "";
                    $show_excerpt = false;
                } else {
                    $cdm_cstyle = "style=\"display : none\"";
                    $show_excerpt = true;
                }
                $mouseover_attrs = "onmouseover='postMouseIn({$id})' \n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'";
                print "<div class=\"cdmArticle{$add_class}\" \n\t\t\t\t\t\tid=\"RROW-{$id}\"\t\t\t\t\t\t\n\t\t\t\t\t\t{$mouseover_attrs}'>";
                print "<div class=\"cdmHeader\">";
                if (!get_pref($link, "VFEED_GROUP_BY_FEED") || !$line["feed_title"]) {
                    $cdm_feed_icon = "<span style=\"cursor : pointer\" onclick=\"viewfeed({$feed_id})\">{$feed_icon_img}</span>";
                }
                print "<div class=\"articleUpdated\">{$updated_fmt} {$score_pic} {$cdm_feed_icon}\n\t\t\t\t\t\t</div>";
                print "<span id=\"RTITLE-{$id}\" class=\"titleWrap{$hlc_suffix}\"><a class=\"title\" \n\t\t\t\t\t\tonclick=\"javascript:toggleUnread({$id}, 0)\"\n\t\t\t\t\t\ttarget=\"_blank\" href=\"" . $line["link"] . "\">" . $line["title"] . "</a>\n\t\t\t\t\t\t";
                print $entry_author;
                /*					if (!$expand_cdm || $score < -100) {
                						print "&nbsp;<a id=\"CICH-$id\" 
                							href=\"javascript:cdmExpandArticle($id)\">
                							(".__('Show article').")</a>";
                					} */
                print $labels_str;
                if (!get_pref($link, 'VFEED_GROUP_BY_FEED')) {
                    if ($line["feed_title"]) {
                        print "&nbsp;(<a href='javascript:viewfeed({$feed_id})'>" . $line["feed_title"] . "</a>)";
                    }
                }
                print "</span></div>";
                if ($show_excerpt) {
                    print "<div class=\"cdmExcerpt\" id=\"CEXC-{$id}\"\n\t\t\t\t\t\t\tonclick=\"cdmExpandArticle({$id})\"\n\t\t\t\t\t\t\ttitle=\"" . __('Click to expand article') . "\">";
                    $content_preview = trim(truncate_string(strip_tags($line["content_preview"]), 100));
                    if (strlen($content_preview) != 0) {
                        print $content_preview;
                    } else {
                        print __('Click to expand article');
                    }
                    print "</div>";
                }
                print "<div class=\"cdmContent\" \n\t\t\t\t\t\tonclick=\"cdmClicked({$id})\"\n\t\t\t\t\t\tid=\"CICD-{$id}\" {$cdm_cstyle}>";
                if ($line["orig_feed_id"]) {
                    $tmp_result = db_query($link, "SELECT * FROM ttrss_archived_feeds\n\t\t\t\t\t\tWHERE id = " . $line["orig_feed_id"]);
                    if (db_num_rows($tmp_result) != 0) {
                        print "<div clear='both'>";
                        print __("Originally from:");
                        print "&nbsp;";
                        $tmp_line = db_fetch_assoc($tmp_result);
                        print "<a target='_blank' \n\t\t\t\t\t\t\thref=' " . htmlspecialchars($tmp_line['site_url']) . "'>" . $tmp_line['title'] . "</a>";
                        print "&nbsp;";
                        print "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>";
                        print "<img title='" . __('Feed URL') . "'class='tinyFeedIcon' src='images/pub_set.gif'></a>";
                        print "</div>";
                    }
                }
                //					print "<div class=\"cdmInnerContent\" id=\"CICD-$id\" $cdm_cstyle>";
                print "<div id=\"POSTNOTE-{$id}\">";
                if ($line['note']) {
                    print format_article_note($id, $line['note']);
                }
                print "</div>";
                print sanitize_rss($link, $line["content_preview"]);
                $article_content = $line["content_preview"];
                $e_result = db_query($link, "SELECT * FROM ttrss_enclosures WHERE\n\t\t\t\t\t\tpost_id = '{$id}' AND content_url != ''");
                if (db_num_rows($e_result) > 0) {
                    $entries_html = array();
                    $entries = array();
                    while ($e_line = db_fetch_assoc($e_result)) {
                        $url = $e_line["content_url"];
                        $ctype = $e_line["content_type"];
                        if (!$ctype) {
                            $ctype = __("unknown type");
                        }
                        $filename = substr($url, strrpos($url, "/") + 1);
                        $entry = format_inline_player($link, $url, $ctype);
                        $entry .= " <a target=\"_blank\" href=\"" . htmlspecialchars($url) . "\">" . $filename . " (" . $ctype . ")" . "</a>";
                        array_push($entries_html, $entry);
                        $entry = array();
                        $entry["type"] = $ctype;
                        $entry["filename"] = $filename;
                        $entry["url"] = $url;
                        array_push($entries, $entry);
                    }
                    $tmp_result = db_query($link, "SELECT always_display_enclosures FROM\n\t\t\t\t\tttrss_feeds WHERE id = " . $line['feed_id'] . " AND owner_uid = " . $_SESSION["uid"]);
                    $always_display_enclosures = db_fetch_result($tmp_result, 0, "always_display_enclosures");
                    if (!get_pref($link, "STRIP_IMAGES")) {
                        if ($always_display_enclosures || !preg_match("/img/i", $article_content)) {
                            foreach ($entries as $entry) {
                                if (preg_match("/image/", $entry["type"]) || preg_match("/\\.(jpg|png|gif|bmp)/i", $entry["filename"])) {
                                    print "<p><img \n\t\t\t\t\t\t\t\t\talt=\"" . htmlspecialchars($entry["filename"]) . "\"\n\t\t\t\t\t\t\t\t\tsrc=\"" . htmlspecialchars($entry["url"]) . "\"></p>";
                                }
                            }
                        }
                    }
                    print "<div class=\"cdmEnclosures\">";
                    if (db_num_rows($e_result) == 1) {
                        print __("Attachment:") . " ";
                    } else {
                        print __("Attachments:") . " ";
                    }
                    print join(", ", $entries_html);
                    print "</div>";
                }
                print "<br clear='both'>";
                //					print "</div>";
                /*					if (!$expand_cdm) {
                						print "<a id=\"CICH-$id\" 
                							href=\"javascript:cdmExpandArticle($id)\">
                							Show article</a>";
                					} */
                print "</div>";
                print "<div class=\"cdmFooter\"><span class='s0'>";
                /* print "<div class=\"markedPic\">Star it: $marked_pic</div>"; */
                print __("Select:") . " <input type=\"checkbox\" onclick=\"toggleSelectRowById(this, \n\t\t\t\t\t\t\t'RROW-{$id}')\" class=\"feedCheckBox\" id=\"RCHK-{$id}\">";
                print "</span><span class='s1'>{$marked_pic}&nbsp;";
                print "{$published_pic}&nbsp;";
                print "<img src=\"images/art-zoom.png\" class='tagsPic' \n\t\t\t\t\t\tonclick=\"zoomToArticle({$id})\"\n\t\t\t\t\t\tstyle=\"cursor : pointer\"\n\t\t\t\t\t\talt='Zoom' \n\t\t\t\t\t\ttitle='" . __('Show article summary in new window') . "'>&nbsp;";
                $note_escaped = htmlspecialchars($line['note'], ENT_QUOTES);
                print "<img src=\"images/art-pub-note.png\" class='tagsPic' \n\t\t\t\t\t\tstyle=\"cursor : pointer\" style=\"cursor : pointer\"\n\t\t\t\t\t\tonclick=\"publishWithNote({$id}, '{$note_escaped}')\"\n\t\t\t\t\t\talt='PubNote' title='" . __('Publish article with a note') . "'>";
                print "</span>";
                $tags_str = format_tags_string(get_article_tags($link, $id), $id);
                print "<span class='s1'>\n\t\t\t\t\t\t<img class='tagsPic' src='" . theme_image($link, 'images/tag.png') . "' alt='Tags' title='Tags'>\n\t\t\t\t\t\t<span id=\"ATSTR-{$id}\">{$tags_str}</span>\n\t\t\t\t\t\t<a title=\"" . __('Edit tags for this article') . "\" \n\t\t\t\t\t\thref=\"javascript:editArticleTags({$id}, {$feed_id}, true)\">(+)</a>";
                print "</span>";
                print "<span class='s2'><a class=\"cdmToggleLink\"\n\t\t\t\t\t\t\thref=\"javascript:toggleUnread({$id})\">\n\t\t\t\t\t\t\t" . __('toggle unread') . "</a></span>";
                print "</div>";
                print "</div>";
            }
            ++$lnum;
        }
        if (!get_pref($link, 'COMBINED_DISPLAY_MODE') && !$offset) {
            print "</table>";
        }
    } else {
        $message = "";
        switch ($view_mode) {
            case "unread":
                $message = __("No unread articles found to display.");
                break;
            case "updated":
                $message = __("No updated articles found to display.");
                break;
            case "marked":
                $message = __("No starred articles found to display.");
                break;
            default:
                if ($feed < -10) {
                    $message = __("No articles found to display. You can assign articles to labels manually (see the Actions menu above) or use a filter.");
                } else {
                    $message = __("No articles found to display.");
                }
        }
        if (!$offset) {
            print "<div class='whiteBox'>{$message}</div>";
        }
    }
    if (!$offset) {
        print "</div>";
        print "</div>";
    }
    return array($topmost_article_ids, $headlines_count, $feed, $disable_cache, $vgroup_last_feed);
}
예제 #6
0
function module_pref_users($link)
{
    global $access_level_names;
    if (!SINGLE_USER_MODE && $_SESSION["access_level"] < 10) {
        print __("Your access level is insufficient to open this tab.");
        return;
    }
    $subop = $_REQUEST["subop"];
    if ($subop == "user-details") {
        $uid = sprintf("%d", $_REQUEST["id"]);
        print "<div id=\"infoBoxTitle\">" . __('User details') . "</div>";
        print "<div class='infoBoxContents'>";
        $result = db_query($link, "SELECT login,\n\t\t\t\t" . SUBSTRING_FOR_DATE . "(last_login,1,16) AS last_login,\n\t\t\t\taccess_level,\n\t\t\t\t(SELECT COUNT(int_id) FROM ttrss_user_entries \n\t\t\t\t\tWHERE owner_uid = id) AS stored_articles,\n\t\t\t\t" . SUBSTRING_FOR_DATE . "(created,1,16) AS created\n\t\t\t\tFROM ttrss_users \n\t\t\t\tWHERE id = '{$uid}'");
        if (db_num_rows($result) == 0) {
            print "<h1>" . __('User not found') . "</h1>";
            return;
        }
        // print "<h1>User Details</h1>";
        $login = db_fetch_result($result, 0, "login");
        print "<table width='100%'>";
        $last_login = date(get_pref($link, 'LONG_DATE_FORMAT'), strtotime(db_fetch_result($result, 0, "last_login")));
        $created = date(get_pref($link, 'LONG_DATE_FORMAT'), strtotime(db_fetch_result($result, 0, "created")));
        $access_level = db_fetch_result($result, 0, "access_level");
        $stored_articles = db_fetch_result($result, 0, "stored_articles");
        print "<tr><td>" . __('Registered') . "</td><td>{$created}</td></tr>";
        print "<tr><td>" . __('Last logged in') . "</td><td>{$last_login}</td></tr>";
        $result = db_query($link, "SELECT COUNT(id) as num_feeds FROM ttrss_feeds\n\t\t\t\tWHERE owner_uid = '{$uid}'");
        $num_feeds = db_fetch_result($result, 0, "num_feeds");
        print "<tr><td>" . __('Subscribed feeds count') . "</td><td>{$num_feeds}</td></tr>";
        print "</table>";
        print "<h1>" . __('Subscribed feeds') . "</h1>";
        $result = db_query($link, "SELECT id,title,site_url FROM ttrss_feeds\n\t\t\t\tWHERE owner_uid = '{$uid}' ORDER BY title");
        print "<ul class=\"userFeedList\">";
        $row_class = "odd";
        while ($line = db_fetch_assoc($result)) {
            $icon_file = ICONS_URL . "/" . $line["id"] . ".ico";
            if (file_exists($icon_file) && filesize($icon_file) > 0) {
                $feed_icon = "<img class=\"tinyFeedIcon\" src=\"{$icon_file}\">";
            } else {
                $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
            }
            print "<li class=\"{$row_class}\">{$feed_icon}&nbsp;<a href=\"" . $line["site_url"] . "\">" . $line["title"] . "</a></li>";
            $row_class = toggleEvenOdd($row_class);
        }
        if (db_num_rows($result) < $num_feeds) {
            // FIXME - add link to show ALL subscribed feeds here somewhere
            print "<li><img \n\t\t\t\t\tclass=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">&nbsp;...</li>";
        }
        print "</ul>";
        print "<div align='center'>\n\t\t\t\t<button onclick=\"closeInfoBox()\">" . __("Close this window") . "</button></div>";
        print "</div>";
        return;
    }
    if ($subop == "edit") {
        $id = db_escape_string($_REQUEST["id"]);
        print "<div id=\"infoBoxTitle\">" . __('User Editor') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<form id=\"user_edit_form\" onsubmit='return false'>";
        print "<input type=\"hidden\" name=\"id\" value=\"{$id}\">";
        print "<input type=\"hidden\" name=\"op\" value=\"pref-users\">";
        print "<input type=\"hidden\" name=\"subop\" value=\"editSave\">";
        $result = db_query($link, "SELECT * FROM ttrss_users WHERE id = '{$id}'");
        $login = db_fetch_result($result, 0, "login");
        $access_level = db_fetch_result($result, 0, "access_level");
        $email = db_fetch_result($result, 0, "email");
        $sel_disabled = $id == $_SESSION["uid"] ? "disabled" : "";
        print "<div class=\"dlgSec\">" . __("User") . "</div>";
        print "<div class=\"dlgSecCont\">";
        if ($sel_disabled) {
            print "<input type=\"hidden\" name=\"login\" value=\"{$login}\">";
            print "<input size=\"30\" style=\"font-size : 16px\" \n\t\t\t\t\tonkeypress=\"return filterCR(event, userEditSave)\" {$sel_disabled}\n\t\t\t\t\tvalue=\"{$login}\">";
        } else {
            print "<input size=\"30\" style=\"font-size : 16px\" \n\t\t\t\t\tonkeypress=\"return filterCR(event, userEditSave)\" {$sel_disabled}\n\t\t\t\t\tname=\"login\" value=\"{$login}\">";
        }
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Authentication") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print __('Access level: ') . " ";
        if (!$sel_disabled) {
            print_select_hash("access_level", $access_level, $access_level_names, $sel_disabled);
        } else {
            print_select_hash("", $access_level, $access_level_names, $sel_disabled);
            print "<input type=\"hidden\" name=\"access_level\" value=\"{$access_level}\">";
        }
        print "<br/>";
        print __('Change password to') . " <input size=\"20\" onkeypress=\"return filterCR(event, userEditSave)\"\n\t\t\t\tname=\"password\">";
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Options") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print __('E-mail: ') . " <input size=\"30\" name=\"email\" onkeypress=\"return filterCR(event, userEditSave)\"\n\t\t\t\tvalue=\"{$email}\">";
        print "</div>";
        print "</table>";
        print "</form>";
        print "<div class=\"dlgButtons\">\n\t\t\t\t<button onclick=\"return userEditSave()\">" . __('Save') . "</button>\n\t\t\t\t<button onclick=\"return userEditCancel()\">" . __('Cancel') . "</button></div>";
        print "</div>";
        return;
    }
    if ($subop == "editSave") {
        if (!WEB_DEMO_MODE && $_SESSION["access_level"] >= 10) {
            $login = db_escape_string(trim($_REQUEST["login"]));
            $uid = db_escape_string($_REQUEST["id"]);
            $access_level = (int) $_REQUEST["access_level"];
            $email = db_escape_string(trim($_REQUEST["email"]));
            $password = db_escape_string(trim($_REQUEST["password"]));
            if ($password) {
                $pwd_hash = encrypt_password($password, $login);
                $pass_query_part = "pwd_hash = '{$pwd_hash}', ";
                print_notice(T_sprintf('Changed password of user <b>%s</b>.', $login));
            } else {
                $pass_query_part = "";
            }
            db_query($link, "UPDATE ttrss_users SET {$pass_query_part} login = '******', \n\t\t\t\t\taccess_level = '{$access_level}', email = '{$email}' WHERE id = '{$uid}'");
        }
    } else {
        if ($subop == "remove") {
            if ($_SESSION["access_level"] >= 10) {
                $ids = split(",", db_escape_string($_REQUEST["ids"]));
                foreach ($ids as $id) {
                    if ($id != $_SESSION["uid"]) {
                        db_query($link, "DELETE FROM ttrss_tags WHERE owner_uid = '{$id}'");
                        db_query($link, "DELETE FROM ttrss_feeds WHERE owner_uid = '{$id}'");
                        db_query($link, "DELETE FROM ttrss_users WHERE id = '{$id}'");
                    }
                }
            }
        } else {
            if ($subop == "add") {
                if ($_SESSION["access_level"] >= 10) {
                    $login = db_escape_string(trim($_REQUEST["login"]));
                    $tmp_user_pwd = make_password(8);
                    $pwd_hash = encrypt_password($tmp_user_pwd, $login);
                    $result = db_query($link, "SELECT id FROM ttrss_users WHERE \n\t\t\t\t\tlogin = '******'");
                    if (db_num_rows($result) == 0) {
                        db_query($link, "INSERT INTO ttrss_users \n\t\t\t\t\t\t(login,pwd_hash,access_level,last_login,created)\n\t\t\t\t\t\tVALUES ('{$login}', '{$pwd_hash}', 0, null, NOW())");
                        $result = db_query($link, "SELECT id FROM ttrss_users WHERE \n\t\t\t\t\t\tlogin = '******' AND pwd_hash = '{$pwd_hash}'");
                        if (db_num_rows($result) == 1) {
                            $new_uid = db_fetch_result($result, 0, "id");
                            print_notice(T_sprintf("Added user <b>%s</b> with password <b>%s</b>", $login, $tmp_user_pwd));
                            initialize_user($link, $new_uid);
                        } else {
                            print_warning(T_sprintf("Could not create user <b>%s</b>", $login));
                        }
                    } else {
                        print_warning(T_sprintf("User <b>%s</b> already exists.", $login));
                    }
                }
            } else {
                if ($subop == "resetPass") {
                    if (!WEB_DEMO_MODE && $_SESSION["access_level"] >= 10) {
                        $uid = db_escape_string($_REQUEST["id"]);
                        $result = db_query($link, "SELECT login,email \n\t\t\t\t\tFROM ttrss_users WHERE id = '{$uid}'");
                        $login = db_fetch_result($result, 0, "login");
                        $email = db_fetch_result($result, 0, "email");
                        $tmp_user_pwd = make_password(8);
                        $pwd_hash = encrypt_password($tmp_user_pwd, $login);
                        db_query($link, "UPDATE ttrss_users SET pwd_hash = '{$pwd_hash}'\n\t\t\t\t\tWHERE id = '{$uid}'");
                        print_notice(T_sprintf("Changed password of user <b>%s</b>\n\t\t\t\t\t to <b>%s</b>", $login, $tmp_user_pwd));
                        if ($email) {
                            print_notice(T_sprintf("Notifying <b>%s</b>.", $email));
                            require_once "lib/MiniTemplator.class.php";
                            $tpl = new MiniTemplator();
                            $tpl->readTemplateFromFile("templates/resetpass_template.txt");
                            $tpl->setVariable('LOGIN', $login);
                            $tpl->setVariable('NEWPASS', $tmp_user_pwd);
                            $tpl->addBlock('message');
                            $message = "";
                            $tpl->generateOutputToString($message);
                            $mail = new PHPMailer();
                            $mail->PluginDir = "lib/phpmailer/";
                            $mail->SetLanguage("en", "lib/phpmailer/language/");
                            $mail->CharSet = "UTF-8";
                            $mail->From = DIGEST_FROM_ADDRESS;
                            $mail->FromName = DIGEST_FROM_NAME;
                            $mail->AddAddress($email, $login);
                            if (DIGEST_SMTP_HOST) {
                                $mail->Host = DIGEST_SMTP_HOST;
                                $mail->Mailer = "smtp";
                                $mail->SMTPAuth = DIGEST_SMTP_LOGIN != '';
                                $mail->Username = DIGEST_SMTP_LOGIN;
                                $mail->Password = DIGEST_SMTP_PASSWORD;
                            }
                            $mail->IsHTML(false);
                            $mail->Subject = __("[tt-rss] Password change notification");
                            $mail->Body = $message;
                            $rc = $mail->Send();
                            if (!$rc) {
                                print_error($mail->ErrorInfo);
                            }
                            /*					mail("$login <$email>", "Password reset notification",
                            						"Hi, $login.\n".
                            						"\n".
                            						"Your password for this TT-RSS installation was reset by".
                            							" an administrator.\n".
                            						"\n".
                            						"Your new password is $tmp_user_pwd, please remember".
                            							" it for later reference.\n".
                            						"\n".
                            						"Sincerely, TT-RSS Mail Daemon.", "From: " . MAIL_FROM); */
                        }
                        print "</div>";
                    }
                }
            }
        }
    }
    set_pref($link, "_PREFS_ACTIVE_TAB", "userConfig");
    $user_search = db_escape_string($_REQUEST["search"]);
    if (array_key_exists("search", $_REQUEST)) {
        $_SESSION["prefs_user_search"] = $user_search;
    } else {
        $user_search = $_SESSION["prefs_user_search"];
    }
    print "<div style='float : right'>\n\t\t\t<input id=\"user_search\" size=\"20\" type=\"search\"\n\t\t\t\tonfocus=\"javascript:disableHotkeys();\" \n\t\t\t\tonblur=\"javascript:enableHotkeys();\"\n\t\t\t\tonchange=\"javascript:updateUsersList()\" value=\"{$user_search}\">\n\t\t\t<button onclick=\"javascript:updateUsersList()\">" . __('Search') . "</button>\n\t\t\t</div>";
    $sort = db_escape_string($_REQUEST["sort"]);
    if (!$sort || $sort == "undefined") {
        $sort = "login";
    }
    print "<button onclick=\"javascript:addUser()\">" . __('Create user') . "</button>";
    print "\n\t\t\t<button onclick=\"javascript:selectedUserDetails()\">" . __('Details') . "</button>\n\t\t\t<button onclick=\"javascript:editSelectedUser()\">" . __('Edit') . "</button>\n\t\t\t<button onclick=\"javascript:removeSelectedUsers()\">" . __('Remove') . "</button>\n\t\t\t<button onclick=\"javascript:resetSelectedUserPass()\">" . __('Reset password') . "</button>";
    print "</div>";
    if ($user_search) {
        $user_search = split(" ", $user_search);
        $tokens = array();
        foreach ($user_search as $token) {
            $token = trim($token);
            array_push($tokens, "(UPPER(login) LIKE UPPER('%{$token}%'))");
        }
        $user_search_query = "(" . join($tokens, " AND ") . ") AND ";
    } else {
        $user_search_query = "";
    }
    $result = db_query($link, "SELECT \n\t\t\t\tid,login,access_level,email,\n\t\t\t\t" . SUBSTRING_FOR_DATE . "(last_login,1,16) as last_login,\n\t\t\t\t" . SUBSTRING_FOR_DATE . "(created,1,16) as created\n\t\t\tFROM \n\t\t\t\tttrss_users\n\t\t\tWHERE\n\t\t\t\t{$user_search_query}\n\t\t\t\tid > 0\n\t\t\tORDER BY {$sort}");
    if (db_num_rows($result) > 0) {
        //		print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
        print "<p><table width=\"100%\" cellspacing=\"0\" \n\t\t\tclass=\"prefUserList\" id=\"prefUserList\">";
        print "<tr><td class=\"selectPrompt\" colspan=\"8\">\n\t\t\t\t" . __('Select:') . " \n\t\t\t\t\t<a href=\"javascript:selectPrefRows('user', true)\">" . __('All') . "</a>,\n\t\t\t\t\t<a href=\"javascript:selectPrefRows('user', false)\">" . __('None') . "</a>\n\t\t\t\t</td</tr>";
        print "<tr class=\"title\">\n\t\t\t\t\t<td align='center' width=\"5%\">&nbsp;</td>\n\t\t\t\t\t<td width=''><a href=\"javascript:updateUsersList('login')\">" . __('Login') . "</a></td>\n\t\t\t\t\t<td width='20%'><a href=\"javascript:updateUsersList('access_level')\">" . __('Access Level') . "</a></td>\n\t\t\t\t\t<td width='20%'><a href=\"javascript:updateUsersList('created')\">" . __('Registered') . "</a></td>\n\t\t\t\t\t<td width='20%'><a href=\"javascript:updateUsersList('last_login')\">" . __('Last login') . "</a></td></tr>";
        $lnum = 0;
        while ($line = db_fetch_assoc($result)) {
            $class = $lnum % 2 ? "even" : "odd";
            $uid = $line["id"];
            $edit_uid = $_REQUEST["id"];
            if ($subop == "edit" && $uid != $edit_uid) {
                $class .= "Grayed";
                $this_row_id = "";
            } else {
                $this_row_id = "id=\"UMRR-{$uid}\"";
            }
            print "<tr class=\"{$class}\" {$this_row_id}>";
            $line["login"] = htmlspecialchars($line["login"]);
            #			$line["last_login"] = date(get_pref($link, 'SHORT_DATE_FORMAT'),
            #				strtotime($line["last_login"]));
            if (get_pref($link, 'HEADLINES_SMART_DATE')) {
                $line["last_login"] = smart_date_time(strtotime($line["last_login"]));
                $line["created"] = smart_date_time(strtotime($line["created"]));
            } else {
                $line["last_login"] = date(get_pref($link, 'SHORT_DATE_FORMAT'), strtotime($line["last_login"]));
                $line["created"] = date(get_pref($link, 'SHORT_DATE_FORMAT'), strtotime($line["created"]));
            }
            print "<td align='center'><input onclick='toggleSelectPrefRow(this, \"user\");' \n\t\t\t\ttype=\"checkbox\" id=\"UMCHK-{$uid}\"></td>";
            $onclick = "onclick='editUser({$uid})' title='" . __('Click to edit') . "'";
            print "<td {$onclick}>" . $line["login"] . "</td>";
            if (!$line["email"]) {
                $line["email"] = "&nbsp;";
            }
            print "<td {$onclick}>" . $access_level_names[$line["access_level"]] . "</td>";
            print "<td {$onclick}>" . $line["created"] . "</td>";
            print "<td {$onclick}>" . $line["last_login"] . "</td>";
            print "</tr>";
            ++$lnum;
        }
        print "</table>";
    } else {
        print "<p>";
        if (!$user_search) {
            print_warning(__('No users defined.'));
        } else {
            print_warning(__('No matching users found.'));
        }
        print "</p>";
    }
}
예제 #7
0
function render_headlines($link)
{
    $feed = db_escape_string($_GET["id"]);
    $limit = db_escape_string($_GET["limit"]);
    $view_mode = db_escape_string($_GET["viewmode"]);
    $cat_view = db_escape_string($_GET["cat"]);
    $subop = $_GET["subop"];
    $catchup_op = $_GET["catchup_op"];
    if (!$view_mode) {
        if ($_SESSION["mobile:viewmode"]) {
            $view_mode = $_SESSION["mobile:viewmode"];
        } else {
            $view_mode = "adaptive";
        }
    }
    $_SESSION["mobile:viewmode"] = $view_mode;
    if (!$limit) {
        $limit = 30;
    }
    if (!$feed) {
        $feed = 0;
    }
    if (preg_match("/^-?[0-9][0-9]*\$/", $feed) != false) {
        $result = db_query($link, "SELECT rtl_content FROM ttrss_feeds\n\t\t\t\tWHERE id = '{$feed}' AND owner_uid = " . $_SESSION["uid"]);
        if (db_num_rows($result) == 1) {
            $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
        } else {
            $rtl_content = false;
        }
        if ($rtl_content) {
            $rtl_tag = "dir=\"RTL\"";
        } else {
            $rtl_tag = "";
        }
    } else {
        $rtl_content = false;
        $rtl_tag = "";
    }
    print "<div id=\"headlines\" {$rtl_tag}>";
    if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) {
        update_generic_feed($link, $feed, $cat_view, true);
    }
    if ($subop == "MarkAllRead" || $catchup_op == "feed") {
        catchup_feed($link, $feed, $cat_view);
    }
    if ($catchup_op == "selection") {
        if (is_array($_GET["sel_ids"])) {
            $ids_to_mark = array_keys($_GET["sel_ids"]);
            if ($ids_to_mark) {
                foreach ($ids_to_mark as $id) {
                    db_query($link, "UPDATE ttrss_user_entries SET \n\t\t\t\t\t\t\tunread = false,last_read = NOW()\n\t\t\t\t\t\t\tWHERE ref_id = '{$id}' AND owner_uid = " . $_SESSION["uid"]);
                }
            }
        }
    }
    if ($subop == "MarkPageRead" || $catchup_op == "page") {
        $ids_to_mark = $_SESSION["last_page_ids.{$feed}"];
        if ($ids_to_mark) {
            foreach ($ids_to_mark as $id) {
                db_query($link, "UPDATE ttrss_user_entries SET \n\t\t\t\t\t\tunread = false,last_read = NOW()\n\t\t\t\t\t\tWHERE ref_id = '{$id}' AND owner_uid = " . $_SESSION["uid"]);
            }
        }
    }
    /// START /////////////////////////////////////////////////////////////////////////////////
    $search = db_escape_string($_GET["query"]);
    $search_mode = db_escape_string($_GET["search_mode"]);
    $match_on = db_escape_string($_GET["match_on"]);
    if (!$match_on) {
        $match_on = "both";
    }
    $real_offset = $offset * $limit;
    if ($_GET["debug"]) {
        $timing_info = print_checkpoint("H0", $timing_info);
    }
    $qfh_ret = queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, false, $real_offset);
    if ($_GET["debug"]) {
        $timing_info = print_checkpoint("H1", $timing_info);
    }
    $result = $qfh_ret[0];
    $feed_title = $qfh_ret[1];
    $feed_site_url = $qfh_ret[2];
    $last_error = $qfh_ret[3];
    /// STOP //////////////////////////////////////////////////////////////////////////////////
    if (!$result) {
        print "<div align='center'>" . __("Could not display feed (query failed). Please check label match syntax or local configuration.") . "</div>";
        return;
    }
    print "<div id=\"heading\">";
    #		if (!$cat_view && file_exists("../icons/$feed.ico") && filesize("../icons/$feed.ico") > 0) {
    #			print "<img class=\"feedIcon\" src=\"../icons/$feed.ico\">";
    #		}
    print "{$feed_title} <span id=\"headingAddon\">(";
    print "<a href=\"index.php\">" . __("Back") . "</a>, ";
    print "<a href=\"index.php?go=sform&aid={$feed}&ic={$cat_view}\">" . __("Search") . "</a>, ";
    print "<a href=\"index.php?go=vf&id={$feed}&subop=ForceUpdate\">" . __("Update") . "</a>";
    #		print "Mark as read: ";
    #		print "<a href=\"index.php?go=vf&id=$feed&subop=MarkAsRead\">Page</a>, ";
    #		print "<a href=\"index.php?go=vf&id=$feed&subop=MarkAllRead\">Feed</a>";
    print ")</span>";
    print "&nbsp;" . __('View:');
    print "<form style=\"display : inline\" method=\"GET\" action=\"index.php\">";
    /* print "<select name=\"viewmode\">
    			<option selected value=\"adaptive\"> " . __('Adaptive') . "</option>
    			<option value=\"all_articles\">" . __('All Articles') . "</option>
    			<option value=\"marked\">" . __('Starred') . "</option>
    			<option value=\"unread\">" . __('Unread') . "</option>
    			</select>"; */
    $sel_values = array("adaptive" => __("Adaptive"), "all_articles" => __("All Articles"), "unread" => __("Unread"), "marked" => __("Starred"));
    print_select_hash("viewmode", $view_mode, $sel_values);
    print "<input type=\"hidden\" name=\"id\" value=\"{$feed}\">\n\t\t<input type=\"hidden\" name=\"cat\" value=\"{$cat_view}\">\n\t\t<input type=\"hidden\" name=\"go\" value=\"vf\">\n\t\t<input type=\"submit\" value=\"" . __('Refresh') . "\">";
    print "</form>";
    print "</div>";
    if (db_num_rows($result) > 0) {
        print "<form method=\"GET\" action=\"index.php\">";
        print "<input type=\"hidden\" name=\"go\" value=\"vf\">";
        print "<input type=\"hidden\" name=\"id\" value=\"{$feed}\">";
        print "<input type=\"hidden\" name=\"cat\" value=\"{$cat_view}\">";
        print "<ul class=\"headlines\" id=\"headlines\">";
        $page_art_ids = array();
        $lnum = 0;
        error_reporting(DEFAULT_ERROR_LEVEL);
        $num_unread = 0;
        while ($line = db_fetch_assoc($result)) {
            $class = $lnum % 2 ? "even" : "odd";
            $id = $line["id"];
            $feed_id = $line["feed_id"];
            array_push($page_art_ids, $id);
            if ($line["last_read"] == "" && ($line["unread"] != "t" && $line["unread"] != "1")) {
                $update_pic = "<img id='FUPDPIC-{$id}' src=\"images/updated.png\" \n\t\t\t\t\t\talt=\"" . __("Updated") . "\">";
            } else {
                $update_pic = "<img id='FUPDPIC-{$id}' src=\"images/blank_icon.gif\" \n\t\t\t\t\t\talt=\"" . __("Updated") . "\">";
            }
            if ($line["unread"] == "t" || $line["unread"] == "1") {
                $class .= "Unread";
                ++$num_unread;
                $is_unread = true;
            } else {
                $is_unread = false;
            }
            if ($line["marked"] == "t" || $line["marked"] == "1") {
                $marked_pic = "<img alt=\"S\" class='marked' src=\"../../images/mark_set.png\">";
            } else {
                $marked_pic = "<img alt=\"s\" class='marked' src=\"../../images/mark_unset.png\">";
            }
            if ($line["published"] == "t" || $line["published"] == "1") {
                $published_pic = "<img alt=\"P\" class='marked' src=\"../../images/pub_set.gif\">";
            } else {
                $published_pic = "<img alt=\"p\" class='marked' src=\"../../images/pub_unset.gif\">";
            }
            $content_link = "<a href=\"?go=view&id={$id}&cat={$cat_view}&ret_feed={$feed}&feed={$feed_id}\">" . $line["title"] . "</a>";
            if (get_pref($link, 'HEADLINES_SMART_DATE')) {
                $updated_fmt = smart_date_time(strtotime($line["updated"]));
            } else {
                $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
                $updated_fmt = date($short_date, strtotime($line["updated"]));
            }
            print "<li class='{$class}' id=\"HROW-{$id}\">";
            print "<input type=\"checkbox\" name=\"sel_ids[{$id}]\"\n\t\t\t\t  \tid=\"HSCB-{$id}\" onchange=\"toggleSelectRow(this, {$id})\">";
            print "<a href=\"?go=vf&id={$feed}&ts={$id}&cat={$cat_view}\">{$marked_pic}</a>";
            print "<a href=\"?go=vf&id={$feed}&tp={$id}&cat={$cat_view}\">{$published_pic}</a>";
            print $content_link;
            if ($line["feed_title"]) {
                print " (<a href='?go=vf&id={$feed_id}'>" . $line["feed_title"] . "</a>)";
            }
            print "<span class='hlUpdated'> ({$updated_fmt})</span>";
            print "</li>";
            ++$lnum;
        }
        print "</ul>";
        print "<div class='footerAddon'>";
        $_SESSION["last_page_ids.{$feed}"] = $page_art_ids;
        /*			print "<a href=\"index.php?go=vf&id=$feed&subop=MarkPageRead\">Page</a>, ";
        			print "<a href=\"index.php?go=vf&id=$feed&subop=MarkAllRead\">Feed</a></div>"; */
        print "Select: \n\t\t\t\t<a href=\"javascript:selectHeadlines(1)\">" . __("All") . "</a>,\n\t\t\t\t<a href=\"javascript:selectHeadlines(2)\">" . __("Unread") . "</a>,\n\t\t\t\t<a href=\"javascript:selectHeadlines(3)\">" . __("None") . "</a>,\n\t\t\t\t<a href=\"javascript:selectHeadlines(4)\">" . __("Invert") . "</a>";
        print " ";
        print "<select name=\"catchup_op\">\n\t\t\t\t<option value=\"selection\">" . __("Selection") . "</option>\n\t\t\t\t<option value=\"page\">" . __("Page") . "</option>\n\t\t\t\t<option value=\"feed\">" . __("Entire feed") . "</option>\n\t\t\t</select>\n\t\t\t<input type=\"hidden\" name=\"cat\" value=\"{$cat_view}\">\n\t\t\t<input type=\"submit\" value=\"" . __("Mark as read") . "\">";
        print "</form>";
    } else {
        print "<div align='center'>No articles found.</div>";
    }
}
예제 #8
0
function module_pref_feeds($link)
{
    global $update_intervals;
    global $purge_intervals;
    global $update_methods;
    $subop = $_REQUEST["subop"];
    $quiet = $_REQUEST["quiet"];
    $mode = $_REQUEST["mode"];
    if ($subop == "removeicon") {
        $feed_id = db_escape_string($_REQUEST["feed_id"]);
        $result = db_query($link, "SELECT id FROM ttrss_feeds\n\t\t\t\tWHERE id = '{$feed_id}' AND owner_uid = " . $_SESSION["uid"]);
        if (db_num_rows($result) != 0) {
            unlink(ICONS_DIR . "/{$feed_id}.ico");
        }
        return;
    }
    if ($subop == "uploadicon") {
        $icon_file = $_FILES['icon_file']['tmp_name'];
        $feed_id = db_escape_string($_REQUEST["feed_id"]);
        if (is_file($icon_file) && $feed_id) {
            if (filesize($icon_file) < 20000) {
                $result = db_query($link, "SELECT id FROM ttrss_feeds\n\t\t\t\t\t\tWHERE id = '{$feed_id}' AND owner_uid = " . $_SESSION["uid"]);
                if (db_num_rows($result) != 0) {
                    unlink(ICONS_DIR . "/{$feed_id}.ico");
                    move_uploaded_file($icon_file, ICONS_DIR . "/{$feed_id}.ico");
                    $rc = 0;
                } else {
                    $rc = 2;
                }
            } else {
                $rc = 1;
            }
        } else {
            $rc = 2;
        }
        print "<script type=\"text/javascript\">";
        print "parent.uploadIconHandler({$rc});";
        print "</script>";
        return;
    }
    /*		if ($subop == "massSubscribe") {
    			$ids = split(",", db_escape_string($_REQUEST["ids"]));
    
    			$subscribed = array();
    
    			foreach ($ids as $id) {
    
    				if ($mode == 1) {
    					$result = db_query($link, "SELECT feed_url,title FROM ttrss_feeds
    						WHERE id = '$id'");
    				} else if ($mode == 2) {
    					$result = db_query($link, "SELECT * FROM ttrss_archived_feeds
    						WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
    					$orig_id = db_escape_string(db_fetch_result($result, 0, "id"));
    					$site_url = db_escape_string(db_fetch_result($result, 0, "site_url"));
    				}
    	
    				$feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url"));
    				$title = db_escape_string(db_fetch_result($result, 0, "title"));
    	
    				$title_orig = db_fetch_result($result, 0, "title");
    	
    				$result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
    						feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
    	
    				if (db_num_rows($result) == 0) {			
    					if ($mode == 1) {
    						$result = db_query($link,
    							"INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id) 
    							VALUES ('".$_SESSION["uid"]."', '$feed_url', '$title', NULL)");
    					} else if ($mode == 2) {
    						$result = db_query($link,
    							"INSERT INTO ttrss_feeds (id,owner_uid,feed_url,title,cat_id,site_url) 
    							VALUES ('$orig_id','".$_SESSION["uid"]."', '$feed_url', '$title', NULL, '$site_url')");
    					}
    					array_push($subscribed, $title_orig);
    				}
    			}
    
    			if (count($subscribed) > 0) {
    				$msg = "<b>".__('Subscribed to feeds:')."</b>".
    					"<ul class=\"nomarks\">";
    
    				foreach ($subscribed as $title) {
    					$msg .= "<li>$title</li>";
    				}
    				$msg .= "</ul>";
    
    				print format_notice($msg);
    			}
    
    			return;
    		} */
    /*		if ($subop == "browse") {
    
    			print "<div id=\"infoBoxTitle\">".__('Feed Browser')."</div>";
    			
    			print "<div class=\"infoBoxContents\">";
    
    			$browser_search = db_escape_string($_REQUEST["search"]);
    
    			//print "<p>".__("Showing top 25 registered feeds, sorted by popularity:")."</p>";
    
    			print "<form onsubmit='return false;' display='inline' name='feed_browser' id='feed_browser'>";
    
    			print "
    				<div style='float : right'>
    				<img style='display : none' 
    					id='feed_browser_spinner' src='images/indicator_white.gif'>
    				<input name=\"search\" size=\"20\" type=\"search\"
    					onchange=\"javascript:updateFeedBrowser()\" value=\"$browser_search\">
    				<button onclick=\"javascript:updateFeedBrowser()\">".__('Search')."</button>
    			</div>";
    
    			print " <select name=\"mode\" onchange=\"updateFeedBrowser()\">
    				<option value='1'>" . __('Popular feeds') . "</option>
    				<option value='2'>" . __('Feed archive') . "</option>
    				</select> ";
    
    			print __("limit:");
    
    			print " <select name=\"limit\" onchange='updateFeedBrowser()'>";
    
    			foreach (array(25, 50, 100, 200) as $l) {
    				$issel = ($l == $limit) ? "selected" : "";
    				print "<option $issel>$l</option>";
    			}
    			
    			print "</select> ";
    
    			print "<p>";
    
    			$owner_uid = $_SESSION["uid"];
    
    			print "<ul class='browseFeedList' id='browseFeedList'>";
    			print_feed_browser($link, $search, 25);
    			print "</ul>";
    
    			print "<div align='center'>
    				<button onclick=\"feedBrowserSubscribe()\">".__('Subscribe')."</button>
    				<button onclick=\"closeInfoBox()\" >".__('Cancel')."</button></div>";
    
    			print "</div>";
    			return;
    		} */
    if ($subop == "editfeed") {
        $feed_id = db_escape_string($_REQUEST["id"]);
        $result = db_query($link, "SELECT * FROM ttrss_feeds WHERE id = '{$feed_id}' AND\n\t\t\t\t\towner_uid = " . $_SESSION["uid"]);
        $title = htmlspecialchars(db_fetch_result($result, 0, "title"));
        $icon_file = ICONS_DIR . "/{$feed_id}.ico";
        if (file_exists($icon_file) && filesize($icon_file) > 0) {
            $feed_icon = "<img width=\"16\" height=\"16\"\n\t\t\t\t\t\tsrc=\"" . ICONS_URL . "/{$feed_id}.ico\">";
        } else {
            $feed_icon = "";
        }
        print "<div id=\"infoBoxTitle\">" . __('Feed Editor') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<form id=\"edit_feed_form\" onsubmit=\"return false\">";
        print "<input type=\"hidden\" name=\"id\" value=\"{$feed_id}\">";
        print "<input type=\"hidden\" name=\"op\" value=\"pref-feeds\">";
        print "<input type=\"hidden\" name=\"subop\" value=\"editSave\">";
        print "<div class=\"dlgSec\">" . __("Feed") . "</div>";
        print "<div class=\"dlgSecCont\">";
        /* Title */
        print "<input style=\"font-size : 16px\" size=\"40\" onkeypress=\"return filterCR(event, feedEditSave)\"\n\t\t\t\t            name=\"title\" value=\"{$title}\">";
        /* Feed URL */
        $feed_url = db_fetch_result($result, 0, "feed_url");
        $feed_url = htmlspecialchars(db_fetch_result($result, 0, "feed_url"));
        print "<br/>";
        print __('URL:') . " ";
        print "<input size=\"40\" onkeypress=\"return filterCR(event, feedEditSave)\"\n\t\t\t\tname=\"feed_url\" value=\"{$feed_url}\">";
        /* Category */
        if (get_pref($link, 'ENABLE_FEED_CATS')) {
            $cat_id = db_fetch_result($result, 0, "cat_id");
            print "<br/>";
            print __('Place in category:') . " ";
            $parent_feed = db_fetch_result($result, 0, "parent_feed");
            if (sprintf("%d", $parent_feed) > 0) {
                $disabled = "disabled";
            } else {
                $disabled = "";
            }
            print_feed_cat_select($link, "cat_id", $cat_id, $disabled);
        }
        /* Link to */
        print "<br/>";
        print __('Link to feed:') . " ";
        $tmp_result = db_query($link, "SELECT COUNT(id) AS count\n\t\t\t\tFROM ttrss_feeds WHERE parent_feed = '{$feed_id}'");
        $linked_count = db_fetch_result($tmp_result, 0, "count");
        $parent_feed = db_fetch_result($result, 0, "parent_feed");
        if ($linked_count > 0) {
            $disabled = "disabled";
        } else {
            $disabled = "";
        }
        print "<select {$disabled} name=\"parent_feed\">";
        print "<option value=\"0\">" . __('Not linked') . "</option>";
        if (get_pref($link, 'ENABLE_FEED_CATS')) {
            if ($cat_id) {
                $cat_qpart = "AND cat_id = '{$cat_id}'";
            } else {
                $cat_qpart = "AND cat_id IS NULL";
            }
        }
        $tmp_result = db_query($link, "SELECT id,title FROM ttrss_feeds\n\t\t\t\tWHERE id != '{$feed_id}' AND owner_uid = " . $_SESSION["uid"] . " AND\n\t\t\t  \t\t(SELECT COUNT(id) FROM ttrss_feeds AS T2 WHERE T2.id = ttrss_feeds.parent_feed) = 0\n\t\t\t\t\t{$cat_qpart} ORDER BY title");
        if (db_num_rows($tmp_result) > 0) {
            print "<option disabled>--------</option>";
        }
        while ($tmp_line = db_fetch_assoc($tmp_result)) {
            if ($tmp_line["id"] == $parent_feed) {
                $is_selected = "selected";
            } else {
                $is_selected = "";
            }
            $linked_title = truncate_string(htmlspecialchars($tmp_line["title"]), 40);
            printf("<option {$is_selected} value='%d'>%s</option>", $tmp_line["id"], $linked_title);
        }
        print "</select>";
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Update") . "</div>";
        print "<div class=\"dlgSecCont\">";
        /* Update Interval */
        $update_interval = db_fetch_result($result, 0, "update_interval");
        print_select_hash("update_interval", $update_interval, $update_intervals);
        /* Update method */
        if (ALLOW_SELECT_UPDATE_METHOD) {
            $update_method = db_fetch_result($result, 0, "update_method");
            print " " . __('using') . " ";
            print_select_hash("update_method", $update_method, $update_methods);
        }
        $purge_interval = db_fetch_result($result, 0, "purge_interval");
        if (FORCE_ARTICLE_PURGE == 0) {
            /* Purge intl */
            print "<br/>";
            print __('Article purging:') . " ";
            print_select_hash("purge_interval", $purge_interval, $purge_intervals);
        } else {
            print "<input type='hidden' name='purge_interval' value='{$purge_interval}'>";
        }
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Authentication") . "</div>";
        print "<div class=\"dlgSecCont\">";
        $auth_login = htmlspecialchars(db_fetch_result($result, 0, "auth_login"));
        print "<table>";
        print "<tr><td>" . __('Login:'******'Hide from Popular feeds') . "</label>";
        $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
        if ($rtl_content) {
            $checked = "checked";
        } else {
            $checked = "";
        }
        print "<br/><input type=\"checkbox\" id=\"rtl_content\" name=\"rtl_content\"\n\t\t\t\t{$checked}>&nbsp;<label for=\"rtl_content\">" . __('Right-to-left content') . "</label>";
        $include_in_digest = sql_bool_to_bool(db_fetch_result($result, 0, "include_in_digest"));
        if ($include_in_digest) {
            $checked = "checked";
        } else {
            $checked = "";
        }
        print "<br/><input type=\"checkbox\" id=\"include_in_digest\" \n\t\t\t\tname=\"include_in_digest\"\n\t\t\t\t{$checked}>&nbsp;<label for=\"include_in_digest\">" . __('Include in e-mail digest') . "</label>";
        $always_display_enclosures = sql_bool_to_bool(db_fetch_result($result, 0, "always_display_enclosures"));
        if ($always_display_enclosures) {
            $checked = "checked";
        } else {
            $checked = "";
        }
        print "<br/><input type=\"checkbox\" id=\"always_display_enclosures\" \n\t\t\t\tname=\"always_display_enclosures\"\n\t\t\t\t{$checked}>&nbsp;<label for=\"always_display_enclosures\">" . __('Always display image attachments') . "</label>";
        $cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images"));
        if ($cache_images) {
            $checked = "checked";
        } else {
            $checked = "";
        }
        if (ENABLE_SIMPLEPIE && SIMPLEPIE_CACHE_IMAGES) {
            $disabled = "";
            $label_class = "";
        } else {
            $disabled = "disabled";
            $label_class = "class='insensitive'";
        }
        print "<br/><input type=\"checkbox\" id=\"cache_images\" \n\t\t\t\tname=\"cache_images\" {$disabled}\n\t\t\t\t{$checked}>&nbsp;<label {$label_class} for=\"cache_images\">" . __('Cache images locally') . "</label>";
        print "</div>";
        print "</div>";
        print "</form>";
        /* Icon */
        print "<br/>";
        print "<div class=\"dlgSec\">" . __("Icon") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<iframe name=\"icon_upload_iframe\"\n\t\t\t\tstyle=\"width: 400px; height: 100px; display: none;\"></iframe>";
        print "<form style='display : block' target=\"icon_upload_iframe\"\n\t\t\t\tenctype=\"multipart/form-data\" method=\"POST\" \n\t\t\t\taction=\"backend.php\">\n\t\t\t\t<input id=\"icon_file\" size=\"10\" name=\"icon_file\" type=\"file\">\n\t\t\t\t<input type=\"hidden\" name=\"op\" value=\"pref-feeds\">\n\t\t\t\t<input type=\"hidden\" name=\"feed_id\" value=\"{$feed_id}\">\n\t\t\t\t<input type=\"hidden\" name=\"subop\" value=\"uploadicon\">\n\t\t\t\t<button onclick=\"return uploadFeedIcon();\"\n\t\t\t\t\ttype=\"submit\">" . __('Replace') . "</button>\n\t\t\t\t<button onclick=\"return removeFeedIcon({$feed_id});\"\n\t\t\t\t\ttype=\"submit\">" . __('Remove') . "</button>\n\t\t\t\t</form>";
        print "</div>";
        $title = htmlspecialchars($title, ENT_QUOTES);
        print "<div class='dlgButtons'>\n\t\t\t\t<div style=\"float : left\">\n\t\t\t\t<button onclick='return unsubscribeFeed({$feed_id}, \"{$title}\")'>" . __('Unsubscribe') . "</button>\n\t\t\t\t</div>\n\t\t\t\t<button onclick=\"return feedEditSave()\">" . __('Save') . "</button>\n\t\t\t\t<button onclick=\"return feedEditCancel()\">" . __('Cancel') . "</button>\n\t\t\t\t</div>";
        return;
    }
    if ($subop == "editfeeds") {
        $feed_ids = db_escape_string($_REQUEST["ids"]);
        print "<div id=\"infoBoxTitle\">" . __('Multiple Feed Editor') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<form id=\"batch_edit_feed_form\" onsubmit=\"return false\">";
        print "<input type=\"hidden\" name=\"ids\" value=\"{$feed_ids}\">";
        print "<input type=\"hidden\" name=\"op\" value=\"pref-feeds\">";
        print "<input type=\"hidden\" name=\"subop\" value=\"batchEditSave\">";
        print "<div class=\"dlgSec\">" . __("Feed") . "</div>";
        print "<div class=\"dlgSecCont\">";
        /* Title */
        print "<input disabled style=\"font-size : 16px\" size=\"35\" onkeypress=\"return filterCR(event, feedEditSave)\"\n\t\t\t\t            name=\"title\" value=\"{$title}\">";
        batch_edit_cbox("title");
        /* Feed URL */
        print "<br/>";
        print __('URL:') . " ";
        print "<input disabled size=\"40\" onkeypress=\"return filterCR(event, feedEditSave)\"\n\t\t\t\tname=\"feed_url\" value=\"{$feed_url}\">";
        batch_edit_cbox("feed_url");
        /* Category */
        if (get_pref($link, 'ENABLE_FEED_CATS')) {
            print "<br/>";
            print __('Place in category:') . " ";
            print_feed_cat_select($link, "cat_id", $cat_id, "disabled");
            batch_edit_cbox("cat_id");
        }
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Update") . "</div>";
        print "<div class=\"dlgSecCont\">";
        /* Update Interval */
        print_select_hash("update_interval", $update_interval, $update_intervals, "disabled");
        batch_edit_cbox("update_interval");
        /* Update method */
        if (ALLOW_SELECT_UPDATE_METHOD) {
            print " " . __('using') . " ";
            print_select_hash("update_method", $update_method, $update_methods, "disabled");
            batch_edit_cbox("update_method");
        }
        /* Purge intl */
        if (FORCE_ARTICLE_PURGE != 0) {
            print "<br/>";
            print __('Article purging:') . " ";
            print_select_hash("purge_interval", $purge_interval, $purge_intervals, "disabled");
            batch_edit_cbox("purge_interval");
        }
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Authentication") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print __('Login:'******'insensitive' for=\"private\">" . __('Hide from Popular feeds') . "</label>";
        print "&nbsp;";
        batch_edit_cbox("private", "private_l");
        print "<br/><input disabled type=\"checkbox\" id=\"rtl_content\" name=\"rtl_content\"\n\t\t\t\t{$checked}>&nbsp;<label class='insensitive' id=\"rtl_content_l\" for=\"rtl_content\">" . __('Right-to-left content') . "</label>";
        print "&nbsp;";
        batch_edit_cbox("rtl_content", "rtl_content_l");
        print "<br/><input disabled type=\"checkbox\" id=\"include_in_digest\" \n\t\t\t\tname=\"include_in_digest\" \n\t\t\t\t{$checked}>&nbsp;<label id=\"include_in_digest_l\" class='insensitive' for=\"include_in_digest\">" . __('Include in e-mail digest') . "</label>";
        print "&nbsp;";
        batch_edit_cbox("include_in_digest", "include_in_digest_l");
        print "<br/><input disabled type=\"checkbox\" id=\"always_display_enclosures\" \n\t\t\t\tname=\"always_display_enclosures\" \n\t\t\t\t{$checked}>&nbsp;<label id=\"always_display_enclosures_l\" class='insensitive' for=\"always_display_enclosures\">" . __('Always display image attachments') . "</label>";
        print "&nbsp;";
        batch_edit_cbox("always_display_enclosures", "always_display_enclosures_l");
        print "<br/><input disabled type=\"checkbox\" id=\"cache_images\" \n\t\t\t\tname=\"cache_images\" \n\t\t\t\t{$checked}>&nbsp;<label class='insensitive' id=\"cache_images_l\" \n\t\t\t\t\tfor=\"cache_images\">" . __('Cache images locally') . "</label>";
        if (ENABLE_SIMPLEPIE && SIMPLEPIE_CACHE_IMAGES) {
            print "&nbsp;";
            batch_edit_cbox("cache_images", "cache_images_l");
        }
        print "</div>";
        print "</div>";
        print "</form>";
        print "<div class='dlgButtons'>\n\t\t\t\t<input type=\"submit\" class=\"button\" \n\t\t\t\tonclick=\"return feedsEditSave()\" value=\"" . __('Save') . "\">\n\t\t\t\t<input type='submit' class='button'\t\t\t\n\t\t\t\tonclick=\"return feedEditCancel()\" value=\"" . __('Cancel') . "\">\n\t\t\t\t</div>";
        return;
    }
    if ($subop == "editSave" || $subop == "batchEditSave") {
        $feed_title = db_escape_string(trim($_POST["title"]));
        $feed_link = db_escape_string(trim($_POST["feed_url"]));
        $upd_intl = db_escape_string($_POST["update_interval"]);
        $purge_intl = db_escape_string($_POST["purge_interval"]);
        $feed_id = db_escape_string($_POST["id"]);
        /* editSave */
        $feed_ids = db_escape_string($_POST["ids"]);
        /* batchEditSave */
        $cat_id = db_escape_string($_POST["cat_id"]);
        $auth_login = db_escape_string(trim($_POST["auth_login"]));
        $auth_pass = db_escape_string(trim($_POST["auth_pass"]));
        $parent_feed = db_escape_string($_POST["parent_feed"]);
        $private = checkbox_to_sql_bool(db_escape_string($_POST["private"]));
        $rtl_content = checkbox_to_sql_bool(db_escape_string($_POST["rtl_content"]));
        $include_in_digest = checkbox_to_sql_bool(db_escape_string($_POST["include_in_digest"]));
        $cache_images = checkbox_to_sql_bool(db_escape_string($_POST["cache_images"]));
        $update_method = (int) db_escape_string($_POST["update_method"]);
        $always_display_enclosures = checkbox_to_sql_bool(db_escape_string($_POST["always_display_enclosures"]));
        if (get_pref($link, 'ENABLE_FEED_CATS')) {
            if ($cat_id && $cat_id != 0) {
                $category_qpart = "cat_id = '{$cat_id}',";
                $category_qpart_nocomma = "cat_id = '{$cat_id}'";
            } else {
                $category_qpart = 'cat_id = NULL,';
                $category_qpart_nocomma = 'cat_id = NULL';
            }
        } else {
            $category_qpart = "";
            $category_qpart_nocomma = "";
        }
        if ($parent_feed && $parent_feed != 0) {
            $parent_qpart = "parent_feed = '{$parent_feed}'";
        } else {
            $parent_qpart = 'parent_feed = NULL';
        }
        if (ENABLE_SIMPLEPIE && SIMPLEPIE_CACHE_IMAGES) {
            $cache_images_qpart = "cache_images = {$cache_images},";
        } else {
            $cache_images_qpart = "";
        }
        if ($subop == "editSave") {
            $result = db_query($link, "UPDATE ttrss_feeds SET \n\t\t\t\t\t{$category_qpart} {$parent_qpart},\n\t\t\t\t\ttitle = '{$feed_title}', feed_url = '{$feed_link}',\n\t\t\t\t\tupdate_interval = '{$upd_intl}',\n\t\t\t\t\tpurge_interval = '{$purge_intl}',\n\t\t\t\t\tauth_login = '******',\n\t\t\t\t\tauth_pass = '******',\n\t\t\t\t\tprivate = {$private},\n\t\t\t\t\trtl_content = {$rtl_content},\n\t\t\t\t\t{$cache_images_qpart}\n\t\t\t\t\tinclude_in_digest = {$include_in_digest},\n\t\t\t\t\talways_display_enclosures = {$always_display_enclosures},\n\t\t\t\t\tupdate_method = '{$update_method}'\n\t\t\t\t\tWHERE id = '{$feed_id}' AND owner_uid = " . $_SESSION["uid"]);
            if (get_pref($link, 'ENABLE_FEED_CATS')) {
                # update linked feed categories
                $result = db_query($link, "UPDATE ttrss_feeds SET\n\t\t\t\t\t\t{$category_qpart_nocomma} WHERE parent_feed = '{$feed_id}' AND\n\t\t\t\t\t\towner_uid = " . $_SESSION["uid"]);
            }
        } else {
            if ($subop == "batchEditSave") {
                $feed_data = array();
                foreach (array_keys($_POST) as $k) {
                    if ($k != "op" && $k != "subop" && $k != "ids") {
                        $feed_data[$k] = $_POST[$k];
                    }
                }
                db_query($link, "BEGIN");
                foreach (array_keys($feed_data) as $k) {
                    $qpart = "";
                    switch ($k) {
                        case "title":
                            $qpart = "title = '{$feed_title}'";
                            break;
                        case "feed_url":
                            $qpart = "feed_url = '{$feed_link}'";
                            break;
                        case "update_interval":
                            $qpart = "update_interval = '{$upd_intl}'";
                            break;
                        case "purge_interval":
                            $qpart = "purge_interval = '{$purge_intl}'";
                            break;
                        case "auth_login":
                            $qpart = "auth_login = '******'";
                            break;
                        case "auth_pass":
                            $qpart = "auth_pass = '******'";
                            break;
                        case "private":
                            $qpart = "private = '{$private}'";
                            break;
                        case "include_in_digest":
                            $qpart = "include_in_digest = '{$include_in_digest}'";
                            break;
                        case "always_display_enclosures":
                            $qpart = "always_display_enclosures = '{$always_display_enclosures}'";
                            break;
                        case "cache_images":
                            $qpart = "cache_images = '{$cache_images}'";
                            break;
                        case "rtl_content":
                            $qpart = "rtl_content = '{$rtl_content}'";
                            break;
                        case "update_method":
                            $qpart = "update_method = '{$update_method}'";
                            break;
                        case "cat_id":
                            $qpart = $category_qpart_nocomma;
                            break;
                    }
                    if ($qpart) {
                        db_query($link, "UPDATE ttrss_feeds SET {$qpart} WHERE id IN ({$feed_ids})\n\t\t\t\t\t\t\tAND owner_uid = " . $_SESSION["uid"]);
                        print "<br/>";
                    }
                }
                db_query($link, "COMMIT");
            }
        }
    }
    if ($subop == "remove") {
        $ids = split(",", db_escape_string($_REQUEST["ids"]));
        foreach ($ids as $id) {
            remove_feed($link, $id, $_SESSION["uid"]);
        }
        return;
    }
    if ($subop == "clear") {
        $id = db_escape_string($_REQUEST["id"]);
        clear_feed_articles($link, $id);
    }
    if ($subop == "rescore") {
        $ids = split(",", db_escape_string($_REQUEST["ids"]));
        foreach ($ids as $id) {
            $filters = load_filters($link, $id, $_SESSION["uid"], 6);
            $result = db_query($link, "SELECT title, content, link, ref_id FROM\n\t\t\t\t\t\tttrss_user_entries, ttrss_entries \n\t\t\t\t\t\tWHERE ref_id = id AND feed_id = '{$id}' AND \n\t\t\t\t\t\t\towner_uid = " . $_SESSION['uid'] . "\n\t\t\t\t\t\t");
            $scores = array();
            while ($line = db_fetch_assoc($result)) {
                $article_filters = get_article_filters($filters, $line['title'], $line['content'], $line['link']);
                $new_score = calculate_article_score($article_filters);
                if (!$scores[$new_score]) {
                    $scores[$new_score] = array();
                }
                array_push($scores[$new_score], $line['ref_id']);
            }
            foreach (array_keys($scores) as $s) {
                if ($s > 1000) {
                    db_query($link, "UPDATE ttrss_user_entries SET score = '{$s}', \n\t\t\t\t\t\t\tmarked = true WHERE\n\t\t\t\t\t\t\tref_id IN (" . join(',', $scores[$s]) . ")");
                } else {
                    if ($s < -500) {
                        db_query($link, "UPDATE ttrss_user_entries SET score = '{$s}', \n\t\t\t\t\t\t\tunread = false WHERE\n\t\t\t\t\t\t\tref_id IN (" . join(',', $scores[$s]) . ")");
                    } else {
                        db_query($link, "UPDATE ttrss_user_entries SET score = '{$s}' WHERE\n\t\t\t\t\t\t\tref_id IN (" . join(',', $scores[$s]) . ")");
                    }
                }
            }
        }
        print __("All done.");
    }
    if ($subop == "rescoreAll") {
        $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE owner_uid = " . $_SESSION['uid']);
        while ($feed_line = db_fetch_assoc($result)) {
            $id = $feed_line["id"];
            $filters = load_filters($link, $id, $_SESSION["uid"], 6);
            $tmp_result = db_query($link, "SELECT title, content, link, ref_id FROM\n\t\t\t\t\t\tttrss_user_entries, ttrss_entries \n\t\t\t\t\t\tWHERE ref_id = id AND feed_id = '{$id}' AND \n\t\t\t\t\t\t\towner_uid = " . $_SESSION['uid'] . "\n\t\t\t\t\t\t");
            $scores = array();
            while ($line = db_fetch_assoc($tmp_result)) {
                $article_filters = get_article_filters($filters, $line['title'], $line['content'], $line['link']);
                $new_score = calculate_article_score($article_filters);
                if (!$scores[$new_score]) {
                    $scores[$new_score] = array();
                }
                array_push($scores[$new_score], $line['ref_id']);
            }
            foreach (array_keys($scores) as $s) {
                if ($s > 1000) {
                    db_query($link, "UPDATE ttrss_user_entries SET score = '{$s}', \n\t\t\t\t\t\t\tmarked = true WHERE\n\t\t\t\t\t\t\tref_id IN (" . join(',', $scores[$s]) . ")");
                } else {
                    db_query($link, "UPDATE ttrss_user_entries SET score = '{$s}' WHERE\n\t\t\t\t\t\t\tref_id IN (" . join(',', $scores[$s]) . ")");
                }
            }
        }
        print __("All done.");
    }
    if ($subop == "add") {
        $feed_url = db_escape_string(trim($_REQUEST["feed_url"]));
        $cat_id = db_escape_string($_REQUEST["cat_id"]);
        $p_from = db_escape_string($_REQUEST["from"]);
        /* only read authentication information from POST */
        $auth_login = db_escape_string(trim($_POST["auth_login"]));
        $auth_pass = db_escape_string(trim($_POST["auth_pass"]));
        if ($p_from != 'tt-rss') {
            print "<html>\n\t\t\t\t\t<head>\n\t\t\t\t\t\t<title>Tiny Tiny RSS</title>\n\t\t\t\t\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"utility.css\">\n\t\t\t\t\t</head>\n\t\t\t\t\t<body>\n\t\t\t\t\t<img class=\"floatingLogo\" src=\"images/ttrss_logo.png\"\n\t\t\t\t  \t\talt=\"Tiny Tiny RSS\"/>\t\n\t\t\t\t\t<h1>Subscribe to feed...</h1>";
        }
        $rc = subscribe_to_feed($link, $feed_url, $cat_id, $auth_login, $auth_pass);
        switch ($rc) {
            case 1:
                print_notice(T_sprintf("Subscribed to <b>%s</b>.", $feed_url));
                break;
            case 2:
                print_error(T_sprintf("Could not subscribe to <b>%s</b>.", $feed_url));
                break;
            case 0:
                print_warning(T_sprintf("Already subscribed to <b>%s</b>.", $feed_url));
                break;
        }
        if ($p_from != 'tt-rss') {
            $tt_uri = ($_SERVER['HTTPS'] != "on" ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . preg_replace('/backend\\.php.*$/', 'tt-rss.php', $_SERVER["REQUEST_URI"]);
            $tp_uri = ($_SERVER['HTTPS'] != "on" ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . preg_replace('/backend\\.php.*$/', 'prefs.php', $_SERVER["REQUEST_URI"]);
            $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE\n\t\t\t\t\tfeed_url = '{$feed_url}' AND owner_uid = " . $_SESSION["uid"]);
            $feed_id = db_fetch_result($result, 0, "id");
            print "<p>";
            if ($feed_id) {
                print "<form method=\"GET\" style='display: inline' \n\t\t\t\t\t\taction=\"{$tp_uri}\">\n\t\t\t\t\t\t<input type=\"hidden\" name=\"tab\" value=\"feedConfig\">\n\t\t\t\t\t\t<input type=\"hidden\" name=\"subop\" value=\"editFeed\">\n\t\t\t\t\t\t<input type=\"hidden\" name=\"subopparam\" value=\"{$feed_id}\">\n\t\t\t\t\t\t<input type=\"submit\" value=\"" . __("Edit subscription options") . "\">\n\t\t\t\t\t\t</form>";
            }
            print "<form style='display: inline' method=\"GET\" action=\"{$tt_uri}\">\n\t\t\t\t\t<input type=\"submit\" value=\"" . __("Return to Tiny Tiny RSS") . "\">\n\t\t\t\t\t</form></p>";
            print "</body></html>";
            return;
        }
    }
    if ($subop == "categorize") {
        if (!WEB_DEMO_MODE) {
            $ids = split(",", db_escape_string($_REQUEST["ids"]));
            $cat_id = db_escape_string($_REQUEST["cat_id"]);
            if ($cat_id == 0) {
                $cat_id_qpart = 'NULL';
            } else {
                $cat_id_qpart = "'{$cat_id}'";
            }
            db_query($link, "BEGIN");
            foreach ($ids as $id) {
                db_query($link, "UPDATE ttrss_feeds SET cat_id = {$cat_id_qpart}\n\t\t\t\t\t\tWHERE id = '{$id}' AND parent_feed IS NULL\n\t\t\t\t\t  \tAND owner_uid = " . $_SESSION["uid"]);
                # update linked feed categories
                db_query($link, "UPDATE ttrss_feeds SET\n\t\t\t\t\t\tcat_id = {$cat_id_qpart} WHERE parent_feed = '{$id}' AND \n\t\t\t\t\t\towner_uid = " . $_SESSION["uid"]);
            }
            db_query($link, "COMMIT");
        }
    }
    if ($subop == "editCats") {
        $action = $_REQUEST["action"];
        if ($action == "save") {
            $cat_title = db_escape_string(trim($_REQUEST["value"]));
            $cat_id = db_escape_string($_REQUEST["cid"]);
            db_query($link, "BEGIN");
            $result = db_query($link, "SELECT title FROM ttrss_feed_categories\n\t\t\t\t\tWHERE id = '{$cat_id}' AND owner_uid = " . $_SESSION["uid"]);
            if (db_num_rows($result) == 1) {
                $old_title = db_fetch_result($result, 0, "title");
                if ($cat_title != "") {
                    $result = db_query($link, "UPDATE ttrss_feed_categories SET\n\t\t\t\t\t\t\ttitle = '{$cat_title}' WHERE id = '{$cat_id}' AND \n\t\t\t\t\t\t\towner_uid = " . $_SESSION["uid"]);
                    print $cat_title;
                } else {
                    print $old_title;
                }
            } else {
                print $_REQUEST["value"];
            }
            db_query($link, "COMMIT");
            return;
        }
        print "<div id=\"infoBoxTitle\">" . __('Category editor') . "</div>";
        print "<div class=\"infoBoxContents\">";
        if ($action == "add") {
            if (!WEB_DEMO_MODE) {
                $feed_cat = db_escape_string(trim($_REQUEST["cat"]));
                $result = db_query($link, "SELECT id FROM ttrss_feed_categories\n\t\t\t\t\t\tWHERE title = '{$feed_cat}' AND owner_uid = " . $_SESSION["uid"]);
                if (db_num_rows($result) == 0) {
                    $result = db_query($link, "INSERT INTO ttrss_feed_categories (owner_uid,title) \n\t\t\t\t\t\t\tVALUES ('" . $_SESSION["uid"] . "', '{$feed_cat}')");
                } else {
                    print_warning(T_sprintf("Category <b>\$%s</b> already exists in the database.", $feed_cat));
                }
            }
        }
        if ($action == "remove") {
            $ids = split(",", db_escape_string($_REQUEST["ids"]));
            foreach ($ids as $id) {
                remove_feed_category($link, $id, $_SESSION["uid"]);
            }
        }
        print "<div>\n\t\t\t\t<input id=\"fadd_cat\" \n\t\t\t\t\tonkeypress=\"return filterCR(event, addFeedCat)\"\n\t\t\t\t\tsize=\"40\">\n\t\t\t\t\t<button onclick=\"javascript:addFeedCat()\">" . __('Create category') . "</button></div>";
        $result = db_query($link, "SELECT title,id FROM ttrss_feed_categories\n\t\t\t\tWHERE owner_uid = " . $_SESSION["uid"] . "\n\t\t\t\tORDER BY title");
        print "<p>";
        if (db_num_rows($result) != 0) {
            print __('Select:') . " \n\t\t\t\t\t<a href=\"javascript:selectPrefRows('fcat', true)\">" . __('All') . "</a>,\n\t\t\t\t\t<a href=\"javascript:selectPrefRows('fcat', false)\">" . __('None') . "</a>";
            print "<div class=\"prefFeedCatHolder\">";
            print "<form id=\"feed_cat_edit_form\" onsubmit=\"return false\">";
            print "<table width=\"100%\" class=\"prefFeedCatList\" \n\t\t\t\t\tcellspacing=\"0\" id=\"prefFeedCatList\">";
            $lnum = 0;
            while ($line = db_fetch_assoc($result)) {
                $class = $lnum % 2 ? "even" : "odd";
                $cat_id = $line["id"];
                $this_row_id = "id=\"FCATR-{$cat_id}\"";
                print "<tr class=\"{$class}\" {$this_row_id}>";
                $edit_title = htmlspecialchars($line["title"]);
                print "<td width='5%' align='center'><input \n\t\t\t\t\t\tonclick='toggleSelectPrefRow(this, \"fcat\");' \n\t\t\t\t\t\ttype=\"checkbox\" id=\"FCCHK-{$cat_id}\"></td>";
                print "<td><span id=\"FCATT-{$cat_id}\">" . $edit_title . "</span></td>";
                print "</tr>";
                ++$lnum;
            }
            print "</table>";
            print "</form>";
            print "</div>";
        } else {
            print "<p>" . __('No feed categories defined.') . "</p>";
        }
        print "<div class='dlgButtons'>\n\t\t\t\t<div style='float : left'>\n\t\t\t\t<button onclick=\"return removeSelectedFeedCats()\">" . __('Remove') . "</button>\n\t\t\t\t</div>";
        print "<button onclick=\"selectTab('feedConfig')\">" . __('Close this window') . "</button></div>";
        print "</div>";
        return;
    }
    if ($quiet) {
        return;
    }
    set_pref($link, "_PREFS_ACTIVE_TAB", "feedConfig");
    $result = db_query($link, "SELECT COUNT(id) AS num_errors\n\t\t\tFROM ttrss_feeds WHERE last_error != '' AND owner_uid = " . $_SESSION["uid"]);
    $num_errors = db_fetch_result($result, 0, "num_errors");
    if ($num_errors > 0) {
        print format_notice("<a href=\"javascript:showFeedsWithErrors()\">" . __('Some feeds have update errors (click for details)') . "</a>");
    }
    $feed_search = db_escape_string($_REQUEST["search"]);
    if (array_key_exists("search", $_REQUEST)) {
        $_SESSION["prefs_feed_search"] = $feed_search;
    } else {
        $feed_search = $_SESSION["prefs_feed_search"];
    }
    print "<div style='float : right'> \n\t\t\t<input id=\"feed_search\" size=\"20\" type=\"search\"\n\t\t\t\tonfocus=\"javascript:disableHotkeys();\" \n\t\t\t\tonblur=\"javascript:enableHotkeys();\"\n\t\t\t\tonchange=\"javascript:updateFeedList()\" value=\"{$feed_search}\">\n\t\t\t<button onclick=\"javascript:updateFeedList()\">" . __('Search') . "</button>\n\t\t\t</div>";
    print "<button onclick=\"quickAddFeed()\">" . __('Subscribe to feed') . "</button> ";
    print "<button onclick=\"editSelectedFeed()\">" . __('Edit feeds') . "</button> ";
    if (get_pref($link, 'ENABLE_FEED_CATS')) {
        print "<button onclick=\"javascript:editFeedCats()\">" . __('Edit categories') . "</button> ";
    }
    print "<button onclick=\"javascript:removeSelectedFeeds()\">" . __('Unsubscribe') . "</button> ";
    if (defined('_ENABLE_FEED_DEBUGGING')) {
        print "<select id=\"feedActionChooser\" onchange=\"feedActionChange()\">\n\t\t\t\t<option value=\"facDefault\" selected>" . __('More actions...') . "</option>";
        if (FORCE_ARTICLE_PURGE == 0) {
            print "<option value=\"facPurge\">" . __('Manual purge') . "</option>";
        }
        print "\n\t\t\t\t<option value=\"facClear\">" . __('Clear feed data') . "</option>\n\t\t\t\t<option value=\"facRescore\">" . __('Rescore articles') . "</option>";
        print "</select>";
    }
    $feeds_sort = db_escape_string($_REQUEST["sort"]);
    if (!$feeds_sort || $feeds_sort == "undefined") {
        $feeds_sort = $_SESSION["pref_sort_feeds"];
        if (!$feeds_sort) {
            $feeds_sort = "title";
        }
    }
    $_SESSION["pref_sort_feeds"] = $feeds_sort;
    if ($feed_search) {
        $feed_search = split(" ", $feed_search);
        $tokens = array();
        foreach ($feed_search as $token) {
            $token = trim($token);
            array_push($tokens, "(UPPER(F1.title) LIKE UPPER('%{$token}%') OR\n\t\t\t\t\tUPPER(C1.title) LIKE UPPER('%{$token}%') OR\n\t\t\t\t\tUPPER(F1.feed_url) LIKE UPPER('%{$token}%'))");
        }
        $search_qpart = "(" . join($tokens, " AND ") . ") AND ";
    } else {
        $search_qpart = "";
    }
    $show_last_article_info = false;
    $show_last_article_checked = "";
    $show_last_article_qpart = "";
    if ($_REQUEST["slat"] == "true") {
        $show_last_article_info = true;
        $show_last_article_checked = "checked";
        $show_last_article_qpart = ", (SELECT " . SUBSTRING_FOR_DATE . "(MAX(updated),1,16) FROM ttrss_user_entries,\n\t\t\t\tttrss_entries WHERE ref_id = ttrss_entries.id\n\t\t\t\tAND feed_id = F1.id) AS last_article";
    } else {
        if ($feeds_sort == "last_article") {
            $feeds_sort = "title";
        }
    }
    if (get_pref($link, 'ENABLE_FEED_CATS')) {
        $order_by_qpart = "category,{$feeds_sort},title";
    } else {
        $order_by_qpart = "{$feeds_sort},title";
    }
    $result = db_query($link, "SELECT \n\t\t\t\tF1.id,\n\t\t\t\tF1.title,\n\t\t\t\tF1.feed_url,\n\t\t\t\t" . SUBSTRING_FOR_DATE . "(F1.last_updated,1,16) AS last_updated,\n\t\t\t\tF1.parent_feed,\n\t\t\t\tF1.update_interval,\n\t\t\t\tF1.last_error,\n\t\t\t\tF1.purge_interval,\n\t\t\t\tF1.cat_id,\n\t\t\t\tF2.title AS parent_title,\n\t\t\t\tC1.title AS category,\n\t\t\t\tF1.include_in_digest\n\t\t\t\t{$show_last_article_qpart}\n\t\t\tFROM \n\t\t\t\tttrss_feeds AS F1 \n\t\t\t\tLEFT JOIN ttrss_feeds AS F2\n\t\t\t\t\tON (F1.parent_feed = F2.id)\n\t\t\t\tLEFT JOIN ttrss_feed_categories AS C1\n\t\t\t\t\tON (F1.cat_id = C1.id)\n\t\t\tWHERE \n\t\t\t\t{$search_qpart} F1.owner_uid = '" . $_SESSION["uid"] . "' \t\t\t\n\t\t\tORDER by {$order_by_qpart}");
    if (db_num_rows($result) != 0) {
        //			print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
        print "<p><table width=\"100%\" cellspacing=\"0\" \n\t\t\t\tclass=\"prefFeedList\" id=\"prefFeedList\">";
        print "<tr><td class=\"selectPrompt\" colspan=\"8\">" . "<div style='float : right'>" . "<input id='show_last_article_times' type='checkbox' onchange='feedlistToggleSLAT()'\n\t\t\t\t{$show_last_article_checked}><label \n\t\t\t\t\tfor='show_last_article_times'>" . __('Show last article times') . "</label></div>" . __('Select:') . "\n\t\t\t\t\t<a href=\"javascript:selectPrefRows('feed', true)\">" . __('All') . "</a>,\n\t\t\t\t\t<a href=\"javascript:selectPrefRows('feed', false)\">" . __('None') . "</a>\n\t\t\t\t</td</tr>";
        if (!get_pref($link, 'ENABLE_FEED_CATS')) {
            print "<tr class=\"title\">\n\t\t\t\t\t<td width='5%' align='center'>&nbsp;</td>";
            if (get_pref($link, 'ENABLE_FEED_ICONS')) {
                print "<td width='3%'>&nbsp;</td>";
            }
            print "<td width='60%'><a href=\"javascript:updateFeedList('title')\">" . __('Title') . "</a></td>";
            if ($show_last_article_info) {
                print "<td width='20%' align='right'><a href=\"javascript:updateFeedList('last_article')\">" . __('Last&nbsp;Article') . "</a></td>";
            }
            print "<td width='20%' align='right'><a href=\"javascript:updateFeedList('last_updated')\">" . __('Updated') . "</a></td>";
        }
        $lnum = 0;
        $cur_cat_id = -1;
        while ($line = db_fetch_assoc($result)) {
            $feed_id = $line["id"];
            $cat_id = $line["cat_id"];
            $edit_title = htmlspecialchars($line["title"]);
            $edit_cat = htmlspecialchars($line["category"]);
            $last_error = $line["last_error"];
            if (!$edit_cat) {
                $edit_cat = __("Uncategorized");
            }
            $last_updated = $line["last_updated"];
            if (!$last_updated) {
                $last_updated = "&mdash;";
            } else {
                if (get_pref($link, 'HEADLINES_SMART_DATE')) {
                    $last_updated = smart_date_time(strtotime($last_updated));
                } else {
                    $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
                    $last_updated = date($short_date, strtotime($last_updated));
                }
            }
            $last_article = $line["last_article"];
            if (!$last_article) {
                $last_article = "&mdash;";
            } else {
                if (get_pref($link, 'HEADLINES_SMART_DATE')) {
                    $last_article = smart_date_time(strtotime($last_article));
                } else {
                    $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
                    $last_article = date($short_date, strtotime($last_article));
                }
            }
            if (get_pref($link, 'ENABLE_FEED_CATS') && $cur_cat_id != $cat_id) {
                $lnum = 0;
                print "<tr><td colspan=\"6\" class=\"feedEditCat\">{$edit_cat}</td></tr>";
                print "<tr class=\"title\">\n\t\t\t\t\t\t<td width='5%'>&nbsp;</td>";
                if (get_pref($link, 'ENABLE_FEED_ICONS')) {
                    print "<td width='3%'>&nbsp;</td>";
                }
                print "<td width='60%'><a href=\"javascript:updateFeedList('title')\">" . __('Title') . "</a></td>";
                if ($show_last_article_info) {
                    print "<td width='20%' align='right'>\n\t\t\t\t\t\t\t<a href=\"javascript:updateFeedList('last_article')\">" . __('Last&nbsp;Article') . "</a></td>";
                }
                print "<td width='20%' align='right'>\n\t\t\t\t\t\t<a href=\"javascript:updateFeedList('last_updated')\">" . __('Updated') . "</a></td>";
                $cur_cat_id = $cat_id;
            }
            $class = $lnum % 2 ? "even" : "odd";
            $this_row_id = "id=\"FEEDR-{$feed_id}\"";
            print "<tr class=\"{$class}\" {$this_row_id}>";
            $icon_file = ICONS_DIR . "/{$feed_id}.ico";
            if (file_exists($icon_file) && filesize($icon_file) > 0) {
                $feed_icon = "<img class=\"tinyFeedIcon\"\tsrc=\"" . ICONS_URL . "/{$feed_id}.ico\">";
            } else {
                $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
            }
            print "<td class='feedSelect'><input onclick='toggleSelectPrefRow(this, \"feed\");' \n\t\t\t\ttype=\"checkbox\" id=\"FRCHK-" . $line["id"] . "\"></td>";
            $onclick = "onclick='editFeed({$feed_id})' title='" . __('Click to edit') . "'";
            if (get_pref($link, 'ENABLE_FEED_ICONS')) {
                print "<td {$onclick} class='feedIcon'>{$feed_icon}</td>";
            }
            if ($last_error) {
                $edit_title = "<span class=\"feed_error\">{$edit_title}</span>";
                $last_updated = "<span class=\"feed_error\">{$last_updated}</span>";
                $last_article = "<span class=\"feed_error\">{$last_article}</span>";
            }
            $parent_title = $line["parent_title"];
            if ($parent_title) {
                $linked_to = sprintf(__("(linked to %s)"), $parent_title);
                $parent_title = "<span class='groupPrompt'>{$linked_to}</span>";
            }
            print "<td {$onclick}>" . "{$edit_title} {$parent_title}" . "</td>";
            if ($show_last_article_info) {
                print "<td align='right' {$onclick}>" . "{$last_article}</td>";
            }
            print "<td {$onclick} align='right'>{$last_updated}</td>";
            print "</tr>";
            ++$lnum;
        }
        print "</table>";
        print "<p>";
    } else {
        print "<p>";
        if (!$feed_search) {
            print_warning(__("You don't have any subscribed feeds."));
        } else {
            print_warning(__('No matching feeds found.'));
        }
        print "</p>";
    }
    print "<h3>" . __('OPML') . "</h3>";
    /*		print "<div style='float : left'>
    		<form	enctype=\"multipart/form-data\" method=\"POST\" action=\"opml.php\">
    		".__('File:')." <input id=\"opml_file\" name=\"opml_file\" type=\"file\">&nbsp;
    			<input type=\"hidden\" name=\"op\" value=\"Import\">
    			<button onclick=\"return validateOpmlImport();\"
    				type=\"submit\">".__('Import')."</button>
    				</form></div>";
    
    		print "&nbsp;"; */
    print "<iframe name=\"upload_iframe\"\n\t\t\tstyle=\"width: 400px; height: 100px; display: none;\"></iframe>";
    print "<div style='float : left'>";
    print "<form style='display : block' target=\"upload_iframe\"\n\t\t\tenctype=\"multipart/form-data\" method=\"POST\" \n\t\t\t\taction=\"backend.php\">\n\t\t\t<input id=\"opml_file\" name=\"opml_file\" type=\"file\">&nbsp;\n\t\t\t<input type=\"hidden\" name=\"op\" value=\"dlg\">\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"importOpml\">\n\t\t\t<button onclick=\"return opmlImport();\"\n\t\t\t\ttype=\"submit\">" . __('Import') . "</button>\n\t\t\t</form>";
    print "</div>&nbsp;";
    print "<button onclick=\"gotoExportOpml()\">" . __('Export OPML') . "</button>";
    print "<h3>" . __("Firefox Integration") . "</h3>";
    print "<p>" . __('This Tiny Tiny RSS site can be used as a Firefox Feed Reader by clicking the link below.') . "</p>";
    print "<p";
    print "<button onclick='window.navigator.registerContentHandler(" . "\"application/vnd.mozilla.maybe.feed\", " . "\"" . add_feed_url() . "\", " . " \"Tiny Tiny RSS\")'>" . __('Click here to register this site as a feed reader.') . "</button>";
    print "</p>";
    print "<h3>" . __("Published articles") . "</h3>";
    if (!get_pref($link, "_PREFS_PUBLISH_KEY")) {
        set_pref($link, "_PREFS_PUBLISH_KEY", generate_publish_key());
    }
    if (!get_pref($link, "_PREFS_OPML_PUBLISH_KEY")) {
        set_pref($link, "_PREFS_OPML_PUBLISH_KEY", generate_publish_key());
    }
    print "<p>" . __('Published articles are exported as a public RSS feed and can be subscribed by anyone who knows the URL specified below.') . "</p>";
    print "<button onclick=\"return displayDlg('pubUrl')\">" . __('Display URL') . "</button> ";
    print "<p>" . __('Your OPML can be published publicly and can be subscribed by anyone who knows the URL below.') . "</p>";
    print "<button onclick=\"return displayDlg('pubOPMLUrl')\">" . __('Display URL') . "</button> ";
}