Exemplo n.º 1
0
 private function feedlist_init_cat($cat_id, $hidden = false)
 {
     $obj = array();
     $cat_id = (int) $cat_id;
     if ($cat_id > 0) {
         $cat_unread = ccache_find($this->link, $cat_id, $_SESSION["uid"], true);
     } else {
         if ($cat_id == 0 || $cat_id == -2) {
             $cat_unread = getCategoryUnread($this->link, $cat_id);
         }
     }
     $obj['id'] = 'CAT:' . $cat_id;
     $obj['items'] = array();
     $obj['name'] = getCategoryTitle($this->link, $cat_id);
     $obj['type'] = 'feed';
     $obj['unread'] = (int) $cat_unread;
     $obj['hidden'] = $hidden;
     $obj['bare_id'] = $cat_id;
     return $obj;
 }
Exemplo n.º 2
0
 private function getRuleName($rule)
 {
     if (!$rule) {
         $rule = json_decode($_REQUEST["rule"], true);
     }
     $feed_id = $rule["feed_id"];
     if (strpos($feed_id, "CAT:") === 0) {
         $feed_id = (int) substr($feed_id, 4);
         $feed = getCategoryTitle($this->link, $feed_id);
     } else {
         $feed_id = (int) $feed_id;
         if ($rule["feed_id"]) {
             $feed = getFeedTitle($this->link, (int) $rule["feed_id"]);
         } else {
             $feed = __("All feeds");
         }
     }
     $result = db_query($this->link, "SELECT description FROM ttrss_filter_types\n\t\t\tWHERE id = " . (int) $rule["filter_type"]);
     $match_on = db_fetch_result($result, 0, "description");
     return T_sprintf("%s on %s in %s", $rule["reg_exp"], $match_on, $feed);
 }
Exemplo n.º 3
0
function printCategoryHeader($link, $cat_id, $hidden = false, $can_browse = true)
{
    $tmp_category = getCategoryTitle($link, $cat_id);
    if ($cat_id > 0) {
        $cat_unread = ccache_find($link, $cat_id, $_SESSION["uid"], true);
    } else {
        if ($cat_id == 0 || $cat_id == -2) {
            $cat_unread = getCategoryUnread($link, $cat_id);
        }
    }
    if ($hidden) {
        $holder_style = "display:none;";
        $ellipsis = "…";
    } else {
        $holder_style = "";
        $ellipsis = "";
    }
    $catctr_class = $cat_unread > 0 ? "catCtrHasUnread" : "catCtrNoUnread";
    if ($can_browse) {
        $browse_cat_link = "onclick=\"javascript:viewCategory({$cat_id})\"";
        $inner_title_class = "catTitle";
    } else {
        $browse_cat_link = "";
        $inner_title_class = "catTitleNL";
    }
    $cat_class = "feedCat";
    print "<li class=\"{$cat_class}\" id=\"FCAT-{$cat_id}\">\n\t\t\t\t<img onclick=\"toggleCollapseCat({$cat_id})\" class=\"catCollapse\"\n\t\t\t\t\ttitle=\"" . __('Click to collapse category') . "\"\n\t\t\t\t\tsrc=\"images/cat-collapse.png\"><span class=\"{$inner_title_class}\" \n\t\t\t\t\tid=\"FCATN-{$cat_id}\" {$browse_cat_link}/>{$tmp_category}</span>";
    print "<span id=\"FCAP-{$cat_id}\">";
    print " <span id=\"FCATCTR-{$cat_id}\" \n\t\t\t\tclass=\"{$catctr_class}\">({$cat_unread})</span> {$ellipsis}";
    print "</span>";
    //print "</li>";
    print "<ul class=\"feedCatList\" id=\"FCATLIST-{$cat_id}\" style='{$holder_style}'>";
}
Exemplo n.º 4
0
 function search()
 {
     $this->params = explode(":", db_escape_string($_REQUEST["param"]), 2);
     $active_feed_id = sprintf("%d", $this->params[0]);
     $is_cat = $this->params[1] != "false";
     print "<div class=\"dlgSec\">" . __('Look for') . "</div>";
     print "<div class=\"dlgSecCont\">";
     if (!SPHINX_ENABLED) {
         print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\tstyle=\"font-size : 16px; width : 12em;\"\n\t\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>";
         print " " . __('match on') . " ";
         $search_fields = array("title" => __("Title"), "content" => __("Content"), "both" => __("Title or content"));
         print_select_hash("match_on", 3, $search_fields, 'dojoType="dijit.form.Select"');
     } else {
         print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\tstyle=\"font-size : 16px; width : 20em;\"\n\t\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>";
     }
     print "<hr/>" . __('Limit search to:') . " ";
     print "<select name=\"search_mode\" dojoType=\"dijit.form.Select\">\n\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>";
     $feed_title = getFeedTitle($this->link, $active_feed_id);
     if (!$is_cat) {
         $feed_cat_title = getFeedCatTitle($this->link, $active_feed_id);
     } else {
         $feed_cat_title = getCategoryTitle($this->link, $active_feed_id);
     }
     if ($active_feed_id && !$is_cat) {
         print "<option selected=\"1\" value=\"this_feed\">{$feed_title}</option>";
     } else {
         print "<option disabled=\"1\" value=\"false\">" . __('This feed') . "</option>";
     }
     if ($is_cat) {
         $cat_preselected = "selected=\"1\"";
     }
     if (get_pref($this->link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) {
         print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>";
     } else {
         //print "<option disabled>".__('This category')."</option>";
     }
     print "</select>";
     print "</div>";
     print "<div class=\"dlgButtons\">";
     if (!SPHINX_ENABLED) {
         print "<div style=\"float : left\">\n\t\t\t\t<a class=\"visibleLink\" target=\"_blank\" href=\"http://tt-rss.org/redmine/wiki/tt-rss/SearchSyntax\">Search syntax</a>\n\t\t\t\t</div>";
     }
     print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').execute()\">" . __('Search') . "</button>\n\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').hide()\">" . __('Cancel') . "</button>\n\t\t</div>";
 }
 private function getRuleName($rule)
 {
     if (!$rule) {
         $rule = json_decode($_REQUEST["rule"], true);
     }
     $feed_id = $rule["feed_id"];
     if (strpos($feed_id, "CAT:") === 0) {
         $feed_id = (int) substr($feed_id, 4);
         $feed = getCategoryTitle($feed_id);
     } else {
         $feed_id = (int) $feed_id;
         if ($rule["feed_id"]) {
             $feed = getFeedTitle((int) $rule["feed_id"]);
         } else {
             $feed = __("All feeds");
         }
     }
     $result = $this->dbh->query("SELECT description FROM ttrss_filter_types\n\t\t\tWHERE id = " . (int) $rule["filter_type"]);
     $filter_type = $this->dbh->fetch_result($result, 0, "description");
     return T_sprintf("%s on %s in %s %s", strip_tags($rule["reg_exp"]), $filter_type, $feed, isset($rule["inverse"]) ? __("(inverse)") : "");
 }
Exemplo n.º 6
0
function queryFeedHeadlines($feed, $limit, $view_mode, $cat_view, $search, $search_mode, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0, $include_children = false, $ignore_vfeed_group = false, $override_strategy = false, $override_vfeed = false, $start_ts = false)
{
    if (!$owner_uid) {
        $owner_uid = $_SESSION["uid"];
    }
    $ext_tables_part = "";
    $search_words = array();
    $search_query_part = "";
    if ($search) {
        // adjust $search_query_part
        foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH) as $plugin) {
            list($search_query_part, $search_words) = $plugin->hook_search($search);
            break;
        }
        // fall back in case of no plugins
        if (!$search_query_part) {
            list($search_query_part, $search_words) = search_to_sql($search);
        }
        $search_query_part .= " AND ";
    }
    $filter_query_part = "";
    if ($filter) {
        // adjust $filter_query_part
        if (DB_TYPE == "pgsql") {
            $query_strategy_part .= " AND updated > NOW() - INTERVAL '14 days' ";
        } else {
            $query_strategy_part .= " AND updated > DATE_SUB(NOW(), INTERVAL 14 DAY) ";
        }
        $override_order = "updated DESC";
        $filter_query_part = filter_to_sql($filter, $owner_uid);
        // Try to check if SQL regexp implementation chokes on a valid regexp
        $result = db_query("SELECT true AS true_val\n            FROM ttrss_entries\n            JOIN ttrss_user_entries ON ttrss_entries.id = ttrss_user_entries.ref_id\n            JOIN ttrss_feeds ON ttrss_feeds.id = ttrss_user_entries.feed_id\n            WHERE {$filter_query_part} LIMIT 1", false);
        if ($result) {
            $test = db_fetch_result($result, 0, "true_val");
            if (!$test) {
                $filter_query_part = "false AND";
            } else {
                $filter_query_part .= " AND";
            }
        } else {
            $filter_query_part = "false AND";
        }
    }
    $since_id_part = "";
    if ($since_id) {
        // adjust $since_id_part
        $since_id_part = "ttrss_entries.id > {$since_id} AND ";
    }
    $view_query_part = "";
    if ($view_mode == "adaptive") {
        // adjust $view_query_part
        if ($search) {
            $view_query_part = " ";
        } elseif ($feed != -1) {
            $unread = getFeedUnread($feed, $cat_view);
            if ($cat_view && $feed > 0 && $include_children) {
                $unread += getCategoryChildrenUnread($feed);
            }
            if ($unread > 0) {
                $view_query_part = " unread = true AND ";
            }
        }
    } elseif ($view_mode == "marked") {
        $view_query_part = " marked = true AND ";
    } elseif ($view_mode == "has_note") {
        $view_query_part = " (note IS NOT NULL AND note != '') AND ";
    } elseif ($view_mode == "published") {
        $view_query_part = " published = true AND ";
    } elseif ($view_mode == "unread" && $feed != -6) {
        $view_query_part = " unread = true AND ";
    }
    if ($limit > 0) {
        $limit_query_part = "LIMIT " . $limit;
    }
    $allow_archived = false;
    $vfeed_query_part = "";
    // override query strategy and enable feed display when searching globally
    if ($search && $search_mode == "all_feeds") {
        $query_strategy_part = "true";
        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
        /* tags */
    } elseif (!is_numeric($feed)) {
        $query_strategy_part = "true";
        $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE\n            id = feed_id) as feed_title,";
    } elseif ($search && $search_mode == "this_cat") {
        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
        if ($feed > 0) {
            if ($include_children) {
                $subcats = getChildCategories($feed, $owner_uid);
                array_push($subcats, $feed);
                $cats_qpart = join(",", $subcats);
            } else {
                $cats_qpart = $feed;
            }
            $query_strategy_part = "ttrss_feeds.cat_id IN ({$cats_qpart})";
        } else {
            $query_strategy_part = "ttrss_feeds.cat_id IS NULL";
        }
    } elseif ($feed > 0) {
        if ($cat_view) {
            $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
            if ($include_children) {
                # sub-cats
                $subcats = getChildCategories($feed, $owner_uid);
                array_push($subcats, $feed);
                $query_strategy_part = "cat_id IN (" . implode(",", $subcats) . ")";
            } else {
                $query_strategy_part = "cat_id = '{$feed}'";
            }
        } else {
            $query_strategy_part = "feed_id = '{$feed}'";
        }
    } elseif ($feed == 0 && !$cat_view) {
        // archive virtual feed
        $query_strategy_part = "feed_id IS NULL";
        $allow_archived = true;
    } elseif ($feed == 0 && $cat_view) {
        // uncategorized
        $query_strategy_part = "cat_id IS NULL AND feed_id IS NOT NULL";
        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
    } elseif ($feed == -1) {
        // starred virtual feed
        $query_strategy_part = "marked = true";
        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
        $allow_archived = true;
        if (!$override_order) {
            $override_order = "last_marked DESC, date_entered DESC, updated DESC";
        }
    } elseif ($feed == -2) {
        // published virtual feed OR labels category
        if (!$cat_view) {
            $query_strategy_part = "published = true";
            $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
            $allow_archived = true;
            if (!$override_order) {
                $override_order = "last_published DESC, date_entered DESC, updated DESC";
            }
        } else {
            $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
            $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2";
            $query_strategy_part = "ttrss_labels2.id = ttrss_user_labels2.label_id AND\n                ttrss_user_labels2.article_id = ref_id";
        }
    } elseif ($feed == -6) {
        // recently read
        $query_strategy_part = "unread = false AND last_read IS NOT NULL";
        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
        $allow_archived = true;
        $ignore_vfeed_group = true;
        if (!$override_order) {
            $override_order = "last_read DESC";
        }
        /*} elseif ($feed == -7) {
          // shared
          $query_strategy_part = "uuid != ''";
          $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
          $allow_archived = true; */
    } elseif ($feed == -3) {
        // fresh virtual feed
        $query_strategy_part = "unread = true AND score >= 0";
        $intl = get_pref("FRESH_ARTICLE_MAX_AGE", $owner_uid);
        if (DB_TYPE == "pgsql") {
            $query_strategy_part .= " AND date_entered > NOW() - INTERVAL '{$intl} hour' ";
        } else {
            $query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL {$intl} HOUR) ";
        }
        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
    } elseif ($feed == -4) {
        // all articles virtual feed
        $allow_archived = true;
        $query_strategy_part = "true";
        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
    } elseif ($feed <= LABEL_BASE_INDEX) {
        // labels
        $label_id = feed_to_label_id($feed);
        $query_strategy_part = "label_id = '{$label_id}' AND\n            ttrss_labels2.id = ttrss_user_labels2.label_id AND\n            ttrss_user_labels2.article_id = ref_id";
        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
        $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2";
        $allow_archived = true;
    } else {
        $query_strategy_part = "true";
    }
    $order_by = "score DESC, date_entered DESC, updated DESC";
    if ($view_mode == "unread_first") {
        $order_by = "unread DESC, {$order_by}";
    }
    if ($override_order) {
        $order_by = $override_order;
    }
    if ($override_strategy) {
        $query_strategy_part = $override_strategy;
    }
    if ($override_vfeed) {
        $vfeed_query_part = $override_vfeed;
    }
    $feed_title = "";
    if ($search) {
        $feed_title = T_sprintf("Search results: %s", $search);
    } elseif ($cat_view) {
        $feed_title = getCategoryTitle($feed);
    } elseif (is_numeric($feed) && $feed > 0) {
        $result = db_query("SELECT title,site_url,last_error,last_updated\n            FROM ttrss_feeds WHERE id = '{$feed}' AND owner_uid = {$owner_uid}");
        $feed_title = db_fetch_result($result, 0, "title");
        $feed_site_url = db_fetch_result($result, 0, "site_url");
        $last_error = db_fetch_result($result, 0, "last_error");
        $last_updated = db_fetch_result($result, 0, "last_updated");
    } else {
        $feed_title = getFeedTitle($feed);
    }
    $content_query_part = "content, ";
    if (is_numeric($feed)) {
        if ($feed >= 0) {
            $feed_kind = "Feeds";
        } else {
            $feed_kind = "Labels";
        }
        if ($limit_query_part) {
            $offset_query_part = "OFFSET {$offset}";
        }
        // proper override_order applied above
        if ($vfeed_query_part && !$ignore_vfeed_group && get_pref('VFEED_GROUP_BY_FEED', $owner_uid)) {
            if (!$override_order) {
                $order_by = "ttrss_feeds.title, {$order_by}";
            } else {
                $order_by = "ttrss_feeds.title, {$override_order}";
            }
        }
        if (!$allow_archived) {
            $from_qpart = "ttrss_entries,ttrss_user_entries,ttrss_feeds{$ext_tables_part}";
            $feed_check_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND";
        } else {
            $from_qpart = "ttrss_entries{$ext_tables_part},ttrss_user_entries\n                LEFT JOIN ttrss_feeds ON (feed_id = ttrss_feeds.id)";
        }
        if ($vfeed_query_part) {
            $vfeed_query_part .= "favicon_avg_color,";
        }
        if ($start_ts) {
            $start_ts_formatted = date("Y/m/d H:i:s", strtotime($start_ts));
            $start_ts_query_part = "date_entered >= '{$start_ts_formatted}' AND";
        } else {
            $start_ts_query_part = "";
        }
        $query = "SELECT DISTINCT\n                date_entered,\n                guid,\n                ttrss_entries.id,ttrss_entries.title,\n                updated,\n                label_cache,\n                tag_cache,\n                always_display_enclosures,\n                site_url,\n                note,\n                num_comments,\n                comments,\n                int_id,\n                uuid,\n                lang,\n                hide_images,\n                unread,feed_id,marked,published,link,last_read,orig_feed_id,\n                last_marked, last_published,\n                {$vfeed_query_part}\n                {$content_query_part}\n                author,score\n            FROM\n                {$from_qpart}\n            WHERE\n                {$feed_check_qpart}\n                ttrss_user_entries.ref_id = ttrss_entries.id AND\n                ttrss_user_entries.owner_uid = '{$owner_uid}' AND\n                {$search_query_part}\n                {$start_ts_query_part}\n                {$filter_query_part}\n                {$view_query_part}\n                {$since_id_part}\n                {$query_strategy_part} ORDER BY {$order_by}\n                {$limit_query_part} {$offset_query_part}";
        if ($_REQUEST["debug"]) {
            print $query;
        }
        $result = db_query($query);
    } else {
        // browsing by tag
        $select_qpart = "SELECT DISTINCT " . "date_entered," . "guid," . "note," . "ttrss_entries.id as id," . "title," . "updated," . "unread," . "feed_id," . "orig_feed_id," . "marked," . "num_comments, " . "comments, " . "tag_cache," . "label_cache," . "link," . "lang," . "uuid," . "last_read," . "(SELECT hide_images FROM ttrss_feeds WHERE id = feed_id) AS hide_images," . "last_marked, last_published, " . $since_id_part . $vfeed_query_part . $content_query_part . "score ";
        $feed_kind = "Tags";
        $all_tags = explode(",", $feed);
        if ($search_mode == 'any') {
            $tag_sql = "tag_name in (" . implode(", ", array_map("db_quote", $all_tags)) . ")";
            $from_qpart = " FROM ttrss_entries,ttrss_user_entries,ttrss_tags ";
            $where_qpart = " WHERE " . "ref_id = ttrss_entries.id AND " . "ttrss_user_entries.owner_uid = {$owner_uid} AND " . "post_int_id = int_id AND {$tag_sql} AND " . $view_query_part . $search_query_part . $query_strategy_part . " ORDER BY {$order_by} " . $limit_query_part;
        } else {
            $i = 1;
            $sub_selects = array();
            $sub_ands = array();
            foreach ($all_tags as $term) {
                array_push($sub_selects, "(SELECT post_int_id from ttrss_tags WHERE tag_name = " . db_quote($term) . " AND owner_uid = {$owner_uid}) as A{$i}");
                $i++;
            }
            if ($i > 2) {
                $x = 1;
                $y = 2;
                do {
                    array_push($sub_ands, "A{$x}.post_int_id = A{$y}.post_int_id");
                    $x++;
                    $y++;
                } while ($y < $i);
            }
            array_push($sub_ands, "A1.post_int_id = ttrss_user_entries.int_id and ttrss_user_entries.owner_uid = {$owner_uid}");
            array_push($sub_ands, "ttrss_user_entries.ref_id = ttrss_entries.id");
            $from_qpart = " FROM " . implode(", ", $sub_selects) . ", ttrss_user_entries, ttrss_entries";
            $where_qpart = " WHERE " . implode(" AND ", $sub_ands);
        }
        //                error_log("TAG SQL: " . $tag_sql);
        // $tag_sql = "tag_name = '$feed'";   DEFAULT way
        //                error_log("[". $select_qpart . "][" . $from_qpart . "][" .$where_qpart . "]");
        $result = db_query($select_qpart . $from_qpart . $where_qpart);
    }
    return array($result, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words);
}
Exemplo n.º 7
0
 function getCategories()
 {
     $unread_only = sql_bool_to_bool($_REQUEST["unread_only"]);
     $enable_nested = sql_bool_to_bool($_REQUEST["enable_nested"]);
     $include_empty = sql_bool_to_bool($_REQUEST['include_empty']);
     // TODO do not return empty categories, return Uncategorized and standard virtual cats
     if ($enable_nested) {
         $nested_qpart = "parent_cat IS NULL";
     } else {
         $nested_qpart = "true";
     }
     $result = $this->dbh->query("SELECT\n\t\t\t\tid, title, order_id, (SELECT COUNT(id) FROM\n\t\t\t\tttrss_feeds WHERE\n\t\t\t\tttrss_feed_categories.id IS NOT NULL AND cat_id = ttrss_feed_categories.id) AS num_feeds,\n\t\t\t(SELECT COUNT(id) FROM\n\t\t\t\tttrss_feed_categories AS c2 WHERE\n\t\t\t\tc2.parent_cat = ttrss_feed_categories.id) AS num_cats\n\t\t\tFROM ttrss_feed_categories\n\t\t\tWHERE {$nested_qpart} AND owner_uid = " . $_SESSION["uid"]);
     $cats = array();
     while ($line = $this->dbh->fetch_assoc($result)) {
         if ($include_empty || $line["num_feeds"] > 0 || $line["num_cats"] > 0) {
             $unread = getFeedUnread($line["id"], true);
             if ($enable_nested) {
                 $unread += getCategoryChildrenUnread($line["id"]);
             }
             if ($unread || !$unread_only) {
                 array_push($cats, array("id" => $line["id"], "title" => $line["title"], "unread" => $unread, "order_id" => (int) $line["order_id"]));
             }
         }
     }
     foreach (array(-2, -1, 0) as $cat_id) {
         if ($include_empty || !$this->isCategoryEmpty($cat_id)) {
             $unread = getFeedUnread($cat_id, true);
             if ($unread || !$unread_only) {
                 array_push($cats, array("id" => $cat_id, "title" => getCategoryTitle($cat_id), "unread" => $unread));
             }
         }
     }
     $this->wrap(self::STATUS_OK, $cats);
 }
Exemplo n.º 8
0
function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0, $include_children = false, $ignore_vfeed_group = false)
{
    if (!$owner_uid) {
        $owner_uid = $_SESSION["uid"];
    }
    $ext_tables_part = "";
    if ($search) {
        if (SPHINX_ENABLED) {
            $ids = join(",", @sphinx_search($search, 0, 500));
            if ($ids) {
                $search_query_part = "ref_id IN ({$ids}) AND ";
            } else {
                $search_query_part = "ref_id = -1 AND ";
            }
        } else {
            $search_query_part = search_to_sql($link, $search, $match_on);
            $search_query_part .= " AND ";
        }
    } else {
        $search_query_part = "";
    }
    if ($filter) {
        if (DB_TYPE == "pgsql") {
            $query_strategy_part .= " AND updated > NOW() - INTERVAL '14 days' ";
        } else {
            $query_strategy_part .= " AND updated > DATE_SUB(NOW(), INTERVAL 14 DAY) ";
        }
        $override_order = "updated DESC";
        $filter_query_part = filter_to_sql($link, $filter, $owner_uid);
        // Try to check if SQL regexp implementation chokes on a valid regexp
        $result = db_query($link, "SELECT true AS true_val FROM ttrss_entries,\n\t\t\t\t\tttrss_user_entries, ttrss_feeds, ttrss_feed_categories\n\t\t\t\t\tWHERE {$filter_query_part} LIMIT 1", false);
        if ($result) {
            $test = db_fetch_result($result, 0, "true_val");
            if (!$test) {
                $filter_query_part = "false AND";
            } else {
                $filter_query_part .= " AND";
            }
        } else {
            $filter_query_part = "false AND";
        }
    } else {
        $filter_query_part = "";
    }
    if ($since_id) {
        $since_id_part = "ttrss_entries.id > {$since_id} AND ";
    } else {
        $since_id_part = "";
    }
    $view_query_part = "";
    if ($view_mode == "adaptive" || $view_query_part == "noscores") {
        if ($search) {
            $view_query_part = " ";
        } else {
            if ($feed != -1) {
                $unread = getFeedUnread($link, $feed, $cat_view);
                if ($cat_view && $feed > 0 && $include_children) {
                    $unread += getCategoryChildrenUnread($link, $feed);
                }
                if ($unread > 0) {
                    $view_query_part = " unread = true AND ";
                }
            }
        }
    }
    if ($view_mode == "marked") {
        $view_query_part = " marked = true AND ";
    }
    if ($view_mode == "published") {
        $view_query_part = " published = true AND ";
    }
    if ($view_mode == "unread") {
        $view_query_part = " unread = true AND ";
    }
    if ($view_mode == "updated") {
        $view_query_part = " (last_read is null and unread = false) AND ";
    }
    if ($limit > 0) {
        $limit_query_part = "LIMIT " . $limit;
    }
    $allow_archived = false;
    $vfeed_query_part = "";
    // override query strategy and enable feed display when searching globally
    if ($search && $search_mode == "all_feeds") {
        $query_strategy_part = "true";
        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
        /* tags */
    } else {
        if (!is_numeric($feed)) {
            $query_strategy_part = "true";
            $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE\n\t\t\t\t\tid = feed_id) as feed_title,";
        } else {
            if ($search && $search_mode == "this_cat") {
                $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                if ($feed > 0) {
                    if ($include_children) {
                        $subcats = getChildCategories($link, $feed, $owner_uid);
                        array_push($subcats, $feed);
                        $cats_qpart = join(",", $subcats);
                    } else {
                        $cats_qpart = $feed;
                    }
                    $query_strategy_part = "ttrss_feeds.cat_id IN ({$cats_qpart})";
                } else {
                    $query_strategy_part = "ttrss_feeds.cat_id IS NULL";
                }
            } else {
                if ($feed > 0) {
                    if ($cat_view) {
                        if ($feed > 0) {
                            if ($include_children) {
                                # sub-cats
                                $subcats = getChildCategories($link, $feed, $owner_uid);
                                array_push($subcats, $feed);
                                $query_strategy_part = "cat_id IN (" . implode(",", $subcats) . ")";
                            } else {
                                $query_strategy_part = "cat_id = '{$feed}'";
                            }
                        } else {
                            $query_strategy_part = "cat_id IS NULL";
                        }
                        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                    } else {
                        $query_strategy_part = "feed_id = '{$feed}'";
                    }
                } else {
                    if ($feed == 0 && !$cat_view) {
                        // archive virtual feed
                        $query_strategy_part = "feed_id IS NULL";
                        $allow_archived = true;
                    } else {
                        if ($feed == 0 && $cat_view) {
                            // uncategorized
                            $query_strategy_part = "cat_id IS NULL AND feed_id IS NOT NULL";
                            $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                        } else {
                            if ($feed == -1) {
                                // starred virtual feed
                                $query_strategy_part = "marked = true";
                                $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                $allow_archived = true;
                            } else {
                                if ($feed == -2) {
                                    // published virtual feed OR labels category
                                    if (!$cat_view) {
                                        $query_strategy_part = "published = true";
                                        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                        $allow_archived = true;
                                        if (!$override_order) {
                                            $override_order = "last_read DESC, updated DESC";
                                        }
                                    } else {
                                        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                        $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2";
                                        $query_strategy_part = "ttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\t\tttrss_user_labels2.article_id = ref_id";
                                    }
                                } else {
                                    if ($feed == -6) {
                                        // recently read
                                        $query_strategy_part = "unread = false AND last_read IS NOT NULL";
                                        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                        $allow_archived = true;
                                        if (!$override_order) {
                                            $override_order = "last_read DESC";
                                        }
                                    } else {
                                        if ($feed == -3) {
                                            // fresh virtual feed
                                            $query_strategy_part = "unread = true AND score >= 0";
                                            $intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE", $owner_uid);
                                            if (DB_TYPE == "pgsql") {
                                                $query_strategy_part .= " AND updated > NOW() - INTERVAL '{$intl} hour' ";
                                            } else {
                                                $query_strategy_part .= " AND updated > DATE_SUB(NOW(), INTERVAL {$intl} HOUR) ";
                                            }
                                            $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                        } else {
                                            if ($feed == -4) {
                                                // all articles virtual feed
                                                $query_strategy_part = "true";
                                                $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                            } else {
                                                if ($feed <= -10) {
                                                    // labels
                                                    $label_id = -$feed - 11;
                                                    $query_strategy_part = "label_id = '{$label_id}' AND\n\t\t\t\t\tttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\tttrss_user_labels2.article_id = ref_id";
                                                    $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                                    $ext_tables_part = ",ttrss_labels2,ttrss_user_labels2";
                                                    $allow_archived = true;
                                                } else {
                                                    $query_strategy_part = "true";
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if (get_pref($link, "SORT_HEADLINES_BY_FEED_DATE", $owner_uid)) {
        $date_sort_field = "updated";
    } else {
        $date_sort_field = "date_entered";
    }
    if (get_pref($link, 'REVERSE_HEADLINES', $owner_uid)) {
        $order_by = "{$date_sort_field}";
    } else {
        $order_by = "{$date_sort_field} DESC";
    }
    if ($view_mode != "noscores") {
        $order_by = "score DESC, {$order_by}";
    }
    if ($override_order) {
        $order_by = $override_order;
    }
    $feed_title = "";
    if ($search) {
        $feed_title = T_sprintf("Search results: %s", $search);
    } else {
        if ($cat_view) {
            $feed_title = getCategoryTitle($link, $feed);
        } else {
            if (is_numeric($feed) && $feed > 0) {
                $result = db_query($link, "SELECT title,site_url,last_error\n\t\t\t\t\t\t\tFROM ttrss_feeds WHERE id = '{$feed}' AND owner_uid = {$owner_uid}");
                $feed_title = db_fetch_result($result, 0, "title");
                $feed_site_url = db_fetch_result($result, 0, "site_url");
                $last_error = db_fetch_result($result, 0, "last_error");
            } else {
                $feed_title = getFeedTitle($link, $feed);
            }
        }
    }
    $content_query_part = "content as content_preview, cached_content, ";
    if (is_numeric($feed)) {
        if ($feed >= 0) {
            $feed_kind = "Feeds";
        } else {
            $feed_kind = "Labels";
        }
        if ($limit_query_part) {
            $offset_query_part = "OFFSET {$offset}";
        }
        // proper override_order applied above
        if ($vfeed_query_part && !$ignore_vfeed_group && get_pref($link, 'VFEED_GROUP_BY_FEED', $owner_uid)) {
            if (!$override_order) {
                $order_by = "ttrss_feeds.title, {$order_by}";
            } else {
                $order_by = "ttrss_feeds.title, {$override_order}";
            }
        }
        if (!$allow_archived) {
            $from_qpart = "ttrss_entries,ttrss_user_entries,ttrss_feeds{$ext_tables_part}";
            $feed_check_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND";
        } else {
            $from_qpart = "ttrss_entries{$ext_tables_part},ttrss_user_entries\n\t\t\t\t\t\tLEFT JOIN ttrss_feeds ON (feed_id = ttrss_feeds.id)";
        }
        $query = "SELECT DISTINCT\n\t\t\t\t\t\tdate_entered,\n\t\t\t\t\t\tguid,\n\t\t\t\t\t\tttrss_entries.id,ttrss_entries.title,\n\t\t\t\t\t\tupdated,\n\t\t\t\t\t\tlabel_cache,\n\t\t\t\t\t\ttag_cache,\n\t\t\t\t\t\talways_display_enclosures,\n\t\t\t\t\t\tsite_url,\n\t\t\t\t\t\tnote,\n\t\t\t\t\t\tnum_comments,\n\t\t\t\t\t\tcomments,\n\t\t\t\t\t\tint_id,\n\t\t\t\t\t\tunread,feed_id,marked,published,link,last_read,orig_feed_id,\n\t\t\t\t\t\t" . SUBSTRING_FOR_DATE . "(last_read,1,19) as last_read_noms,\n\t\t\t\t\t\t{$vfeed_query_part}\n\t\t\t\t\t\t{$content_query_part}\n\t\t\t\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,19) as updated_noms,\n\t\t\t\t\t\tauthor,score\n\t\t\t\t\tFROM\n\t\t\t\t\t\t{$from_qpart}\n\t\t\t\t\tWHERE\n\t\t\t\t\t{$feed_check_qpart}\n\t\t\t\t\tttrss_user_entries.ref_id = ttrss_entries.id AND\n\t\t\t\t\tttrss_user_entries.owner_uid = '{$owner_uid}' AND\n\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t{$filter_query_part}\n\t\t\t\t\t{$view_query_part}\n\t\t\t\t\t{$since_id_part}\n\t\t\t\t\t{$query_strategy_part} ORDER BY {$order_by}\n\t\t\t\t\t{$limit_query_part} {$offset_query_part}";
        if ($_REQUEST["debug"]) {
            print $query;
        }
        $result = db_query($link, $query);
    } else {
        // browsing by tag
        $select_qpart = "SELECT DISTINCT " . "date_entered," . "guid," . "note," . "ttrss_entries.id as id," . "title," . "updated," . "unread," . "feed_id," . "orig_feed_id," . "marked," . "num_comments, " . "comments, " . "tag_cache," . "label_cache," . "link," . "last_read," . SUBSTRING_FOR_DATE . "(last_read,1,19) as last_read_noms," . $since_id_part . $vfeed_query_part . $content_query_part . SUBSTRING_FOR_DATE . "(updated,1,19) as updated_noms," . "score ";
        $feed_kind = "Tags";
        $all_tags = explode(",", $feed);
        if ($search_mode == 'any') {
            $tag_sql = "tag_name in (" . implode(", ", array_map("db_quote", $all_tags)) . ")";
            $from_qpart = " FROM ttrss_entries,ttrss_user_entries,ttrss_tags ";
            $where_qpart = " WHERE " . "ref_id = ttrss_entries.id AND " . "ttrss_user_entries.owner_uid = {$owner_uid} AND " . "post_int_id = int_id AND {$tag_sql} AND " . $view_query_part . $search_query_part . $query_strategy_part . " ORDER BY {$order_by} " . $limit_query_part;
        } else {
            $i = 1;
            $sub_selects = array();
            $sub_ands = array();
            foreach ($all_tags as $term) {
                array_push($sub_selects, "(SELECT post_int_id from ttrss_tags WHERE tag_name = " . db_quote($term) . " AND owner_uid = {$owner_uid}) as A{$i}");
                $i++;
            }
            if ($i > 2) {
                $x = 1;
                $y = 2;
                do {
                    array_push($sub_ands, "A{$x}.post_int_id = A{$y}.post_int_id");
                    $x++;
                    $y++;
                } while ($y < $i);
            }
            array_push($sub_ands, "A1.post_int_id = ttrss_user_entries.int_id and ttrss_user_entries.owner_uid = {$owner_uid}");
            array_push($sub_ands, "ttrss_user_entries.ref_id = ttrss_entries.id");
            $from_qpart = " FROM " . implode(", ", $sub_selects) . ", ttrss_user_entries, ttrss_entries";
            $where_qpart = " WHERE " . implode(" AND ", $sub_ands);
        }
        //				error_log("TAG SQL: " . $tag_sql);
        // $tag_sql = "tag_name = '$feed'";   DEFAULT way
        //				error_log("[". $select_qpart . "][" . $from_qpart . "][" .$where_qpart . "]");
        $result = db_query($link, $select_qpart . $from_qpart . $where_qpart);
    }
    return array($result, $feed_title, $feed_site_url, $last_error);
}
Exemplo n.º 9
0
function module_popup_dialog($link)
{
    $id = $_REQUEST["id"];
    $param = db_escape_string($_REQUEST["param"]);
    if ($id == "importOpml") {
        print "<div id=\"infoBoxTitle\">" . __('OPML Import') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<div class=\"prefFeedCatHolder\">";
        $owner_uid = $_SESSION["uid"];
        db_query($link, "BEGIN");
        /* create Imported feeds category just in case */
        $result = db_query($link, "SELECT id FROM\n\t\t\t\tttrss_feed_categories WHERE title = 'Imported feeds' AND\n\t\t\t\towner_uid = '{$owner_uid}' LIMIT 1");
        if (db_num_rows($result) == 0) {
            db_query($link, "INSERT INTO ttrss_feed_categories\n\t\t\t\t\t(title,owner_uid) \n\t\t\t\t\t\tVALUES ('Imported feeds', '{$owner_uid}')");
        }
        db_query($link, "COMMIT");
        /* Handle OPML import by DOMXML/DOMDocument */
        if (function_exists('domxml_open_file')) {
            print "<ul class='nomarks'>";
            print "<li>" . __("Importing using DOMXML.") . "</li>";
            require_once "modules/opml_domxml.php";
            opml_import_domxml($link, $owner_uid);
            print "</ul>";
        } else {
            if (PHP_VERSION >= 5) {
                print "<ul class='nomarks'>";
                print "<li>" . __("Importing using DOMDocument.") . "</li>";
                require_once "modules/opml_domdoc.php";
                opml_import_domdoc($link, $owner_uid);
                print "</ul>";
            } else {
                print_error(__("DOMXML extension is not found. It is required for PHP versions below 5."));
            }
        }
        print "</div>";
        print "<div align='center'>";
        print "<button onclick=\"return opmlImportDone()\">" . __('Close this window') . "</button>";
        print "</div>";
        print "<script type=\"text/javascript\">";
        print "parent.opmlImportHandler(this)";
        print "</script>";
        print "</div></div>";
        return;
    }
    if ($id == "editPrefProfiles") {
        print "<div id=\"infoBoxTitle\">" . __('Settings Profiles') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<div><input id=\"fadd_profile\" \n\t\t\t\t\tonkeypress=\"return filterCR(event, addPrefProfile)\"\n\t\t\t\t\tsize=\"40\">\n\t\t\t\t\t<button onclick=\"javascript:addPrefProfile()\">" . __('Create profile') . "</button></div>";
        print "<p>";
        $result = db_query($link, "SELECT title,id FROM ttrss_settings_profiles\n\t\t\t\tWHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title");
        print __('Select:') . " \n\t\t\t\t<a href=\"javascript:selectPrefRows('fcat', true)\">" . __('All') . "</a>,\n\t\t\t\t<a href=\"javascript:selectPrefRows('fcat', false)\">" . __('None') . "</a>";
        print "<div class=\"prefFeedCatHolder\">";
        print "<form id=\"profile_edit_form\" onsubmit=\"return false\">";
        print "<table width=\"100%\" class=\"prefFeedCatList\" \n\t\t\t\tcellspacing=\"0\" id=\"prefFeedCatList\">";
        print "<tr class=\"odd\" id=\"FCATR-0\">";
        print "<td width='5%' align='center'><input \n\t\t\t\tonclick='toggleSelectPrefRow(this, \"fcat\");' \n\t\t\t\ttype=\"checkbox\" id=\"FCCHK-0\"></td>";
        if (!$_SESSION["profile"]) {
            $is_active = __("(active)");
        } else {
            $is_active = "";
        }
        print "<td><span id=\"FCATT-0\">" . __("Default profile") . " {$is_active}</span></td>";
        print "</tr>";
        $lnum = 1;
        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\tonclick='toggleSelectPrefRow(this, \"fcat\");' \n\t\t\t\t\ttype=\"checkbox\" id=\"FCCHK-{$cat_id}\"></td>";
            if ($_SESSION["profile"] == $line["id"]) {
                $is_active = __("(active)");
            } else {
                $is_active = "";
            }
            print "<td><span id=\"FCATT-{$cat_id}\">" . $edit_title . "</span> {$is_active}</td>";
            print "</tr>";
            ++$lnum;
        }
        print "</table>";
        print "</form>";
        print "</div>";
        print "<div class='dlgButtons'>\n\t\t\t\t<div style='float : left'>\n\t\t\t\t<button onclick=\"return removeSelectedPrefProfiles()\">" . __('Remove') . "</button>\n\t\t\t\t<button onclick=\"return activatePrefProfile()\">" . __('Activate') . "</button>\n\t\t\t\t</div>";
        print "<button onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>";
        print "</div></div>";
        return;
    }
    if ($id == "pubUrl") {
        print "<div id=\"infoBoxTitle\">" . __('Published Articles') . "</div>";
        print "<div class=\"infoBoxContents\">";
        $url_path = article_publish_url($link);
        print __("Your Published articles feed URL is:");
        print "<div class=\"tagCloudContainer\">";
        print "<a id='pub_feed_url' href='{$url_path}' target='_blank'>{$url_path}</a>";
        print "</div>";
        print "<div align='center'>";
        print "<button onclick=\"return pubRegenKey()\">" . __('Generate new URL') . "</button> ";
        print "<input class=\"button\"\n\t\t\t\ttype=\"submit\" onclick=\"return closeInfoBox()\" \n\t\t\t\tvalue=\"" . __('Close this window') . "\">";
        print "</div></div>";
        return;
    }
    if ($id == "pubOPMLUrl") {
        print "<div id=\"infoBoxTitle\">" . __('Public OPML URL') . "</div>";
        print "<div class=\"infoBoxContents\">";
        $url_path = opml_publish_url($link);
        print __("Your Public OPML URL is:");
        print "<div class=\"tagCloudContainer\">";
        print "<a id='pub_opml_url' href='{$url_path}' target='_blank'>{$url_path}</a>";
        print "</div>";
        print "<div align='center'>";
        print "<button onclick=\"return opmlRegenKey()\">" . __('Generate new URL') . "</button> ";
        print "<input class=\"button\"\n\t\t\t\ttype=\"submit\" onclick=\"return closeInfoBox()\" \n\t\t\t\tvalue=\"" . __('Close this window') . "\">";
        print "</div></div>";
        return;
    }
    if ($id == "explainError") {
        print "<div id=\"infoBoxTitle\">" . __('Notice') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<div class=\"errorExplained\">";
        if ($param == 1) {
            print __("Update daemon is enabled in configuration, but daemon process is not running, which prevents all feeds from updating. Please start the daemon process or contact instance owner.");
            $stamp = (int) read_stampfile("update_daemon.stamp");
            print "<p>" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp);
        }
        if ($param == 2) {
            $msg = check_for_update($link);
            if (!$msg) {
                print __("You are running the latest version of Tiny Tiny RSS. The fact that you are seeing this dialog is probably a bug.");
            } else {
                print $msg;
            }
        }
        if ($param == 3) {
            print __("Update daemon is taking too long to perform a feed update. This could indicate a problem like crash or a hang. Please check the daemon process or contact instance owner.");
            $stamp = (int) read_stampfile("update_daemon.stamp");
            print "<p>" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp);
        }
        print "</div>";
        print "<div align='center'>";
        print "<input class=\"button\"\n\t\t\t\ttype=\"submit\" onclick=\"return closeInfoBox()\" \n\t\t\t\tvalue=\"" . __('Close this window') . "\">";
        print "</div></div>";
        return;
    }
    if ($id == "quickAddFeed") {
        print "<div id=\"infoBoxTitle\">" . __('Subscribe to Feed') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<form id='feed_add_form' onsubmit='return false'>";
        print "<input type=\"hidden\" name=\"op\" value=\"rpc\">";
        print "<input type=\"hidden\" name=\"subop\" value=\"addfeed\">";
        //print "<input type=\"hidden\" name=\"from\" value=\"tt-rss\">";
        print "<div class=\"dlgSec\">" . __("Feed") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print __("URL:") . " ";
        print "<input size=\"40\"\n\t\t\t\t\tonkeypress=\"return filterCR(event, subscribeToFeed)\"\n\t\t\t\t\tname=\"feed\" id=\"feed_url\"></td></tr>";
        print "<br/>";
        if (get_pref($link, 'ENABLE_FEED_CATS')) {
            print __('Place in category:') . " ";
            print_feed_cat_select($link, "cat");
        }
        print "</div>";
        print "<div id='fadd_login_container' style='display:none'>\n\t\n\t\t\t\t\t<div class=\"dlgSec\">" . __("Authentication") . "</div>\n\t\t\t\t\t<div class=\"dlgSecCont\">" . __('Login:'******'login' size=\"20\" \n\t\t\t\t\t\t\tonkeypress=\"return filterCR(event, subscribeToFeed)\"> " . __('Password:'******'password'\n\t\t\t\t\t\t\tname='pass' size=\"20\" \n\t\t\t\t\t\t\tonkeypress=\"return filterCR(event, subscribeToFeed)\">\n\t\t\t\t</div></div>";
        print "<div style=\"clear : both\">\t\t\t\t\n\t\t\t\t<input type=\"checkbox\" id=\"fadd_login_check\" \n\t\t\t\t\t\tonclick='checkboxToggleElement(this, \"fadd_login_container\")'>\n\t\t\t\t\t<label for=\"fadd_login_check\">" . __('This feed requires authentication.') . "</div>";
        print "</form>";
        print "<div class=\"dlgButtons\">\n\t\t\t\t<button class=\"button\" id=\"fadd_submit_btn\"\n\t\t\t\t\tonclick=\"return subscribeToFeed()\">" . __('Subscribe') . "</button>\n\t\t\t\t<button onclick=\"return displayDlg('feedBrowser')\">" . __('More feeds') . "</button>\n\t\t\t\t<button onclick=\"return closeInfoBox()\">" . __('Cancel') . "</button></div>";
        return;
    }
    if ($id == "feedBrowser") {
        print "<div id=\"infoBoxTitle\">" . __('Feed Browser') . "</div>";
        print "<div class=\"infoBoxContents\">";
        $browser_search = db_escape_string($_REQUEST["search"]);
        print "<form onsubmit='return false;' display='inline' \n\t\t\t\tname='feed_browser' id='feed_browser'>";
        print "<input type=\"hidden\" name=\"op\" value=\"rpc\">";
        print "<input type=\"hidden\" name=\"subop\" value=\"updateFeedBrowser\">";
        print "\n\t\t\t\t<div style='float : right'>\n\t\t\t\t<img style='display : none' \n\t\t\t\t\tid='feed_browser_spinner' src='" . theme_image($link, 'images/indicator_white.gif') . "'>\n\t\t\t\t<input name=\"search\" size=\"20\" type=\"search\"\n\t\t\t\t\tonchange=\"javascript:updateFeedBrowser()\" value=\"{$browser_search}\">\n\t\t\t\t<button onclick=\"javascript:updateFeedBrowser()\">" . __('Search') . "</button>\n\t\t\t</div>";
        print " <select name=\"mode\" onchange=\"updateFeedBrowser()\">\n\t\t\t\t<option value='1'>" . __('Popular feeds') . "</option>\n\t\t\t\t<option value='2'>" . __('Feed archive') . "</option>\n\t\t\t\t</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	__('Select:')." 
        				<a href=\"javascript:selectPrefRows('fbrowse', true)\">".__('All')."</a>,
        					<a href=\"javascript:selectPrefRows('fbrowse', false)\">".__('None')."</a>"; */
        print "<ul class='browseFeedList' id='browseFeedList'>";
        print_feed_browser($link, $search, 25);
        print "</ul>";
        print "<div align='center'>\n\t\t\t\t<button onclick=\"feedBrowserSubscribe()\">" . __('Subscribe') . "</button>\n\t\t\t\t<button style='display : none' id='feed_archive_remove' onclick=\"feedArchiveRemove()\">" . __('Remove') . "</button>\n\t\t\t\t<button onclick=\"closeInfoBox()\" >" . __('Cancel') . "</button></div>";
        print "</div>";
        return;
    }
    if ($id == "search") {
        print "<div id=\"infoBoxTitle\">" . __('Search') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<form id='search_form'  onsubmit='return false'>";
        #$active_feed_id = db_escape_string($_REQUEST["param"]);
        $params = split(":", db_escape_string($_REQUEST["param"]));
        $active_feed_id = sprintf("%d", $params[0]);
        $is_cat = $params[1] == "true";
        print "<div class=\"dlgSec\">" . __('Look for') . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<input onkeypress=\"return filterCR(event, search)\"\n\t\t\t\tname=\"query\" size=\"20\" type=\"search\"\tvalue=''>";
        print " " . __('match on') . " ";
        $search_fields = array("title" => __("Title"), "content" => __("Content"), "both" => __("Title or content"));
        print_select_hash("match_on", 3, $search_fields);
        print "<br/>" . __('Limit search to:') . " ";
        print "<select name=\"search_mode\">\n\t\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>";
        $feed_title = getFeedTitle($link, $active_feed_id);
        if (!$is_cat) {
            $feed_cat_title = getFeedCatTitle($link, $active_feed_id);
        } else {
            $feed_cat_title = getCategoryTitle($link, $active_feed_id);
        }
        if ($active_feed_id && !$is_cat) {
            print "<option selected value=\"this_feed\">{$feed_title}</option>";
        } else {
            print "<option disabled>" . __('This feed') . "</option>";
        }
        if ($is_cat) {
            $cat_preselected = "selected";
        }
        if (get_pref($link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) {
            print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>";
        } else {
            //print "<option disabled>".__('This category')."</option>";
        }
        print "</select>";
        print "</div>";
        print "</form>";
        print "<div class=\"dlgButtons\">\n\t\t\t<button onclick=\"javascript:search()\">" . __('Search') . "</button>\n\t\t\t<button onclick=\"javascript:closeInfoBox(true)\">" . __('Cancel') . "</button>\n\t\t\t</div>";
        print "</div>";
        return;
    }
    if ($id == "quickAddFilter") {
        $active_feed_id = db_escape_string($_REQUEST["param"]);
        print "<div id=\"infoBoxTitle\">" . __('Create Filter') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<form id=\"filter_add_form\" onsubmit='return false'>";
        print "<input type=\"hidden\" name=\"op\" value=\"pref-filters\">";
        print "<input type=\"hidden\" name=\"quiet\" value=\"1\">";
        print "<input type=\"hidden\" name=\"subop\" value=\"add\">";
        $result = db_query($link, "SELECT id,description \n\t\t\t\tFROM ttrss_filter_types ORDER BY description");
        $filter_types = array();
        while ($line = db_fetch_assoc($result)) {
            //array_push($filter_types, $line["description"]);
            $filter_types[$line["id"]] = __($line["description"]);
        }
        print "<div class=\"dlgSec\">" . __("Match") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<span id=\"filter_dlg_date_mod_box\" style=\"display : none\">";
        print __("Date") . " ";
        $filter_params = array("before" => __("before"), "after" => __("after"));
        print_select_hash("filter_date_modifier", "before", $filter_params);
        print "&nbsp;</span>";
        print "<input onkeypress=\"return filterCR(event, createFilter)\"\n\t\t\t\t name=\"reg_exp\" size=\"30\" value=\"{$reg_exp}\">";
        print "<span id=\"filter_dlg_date_chk_box\" style=\"display : none\">";
        print "&nbsp;<input class=\"button\"\n\t\t\t\ttype=\"submit\" onclick=\"return filterDlgCheckDate()\" \n\t\t\t\tvalue=\"" . __('Check it') . "\">";
        print "</span>";
        print "<br/> " . __("on field") . " ";
        print_select_hash("filter_type", 1, $filter_types, 'onchange="filterDlgCheckType(this)"');
        print "<br/>";
        print __("in") . " ";
        print_feed_select($link, "feed_id", $active_feed_id);
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Perform Action") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<select name=\"action_id\"\n\t\t\t\tonchange=\"filterDlgCheckAction(this)\">";
        $result = db_query($link, "SELECT id,description FROM ttrss_filter_actions \n\t\t\t\tORDER BY name");
        while ($line = db_fetch_assoc($result)) {
            printf("<option value='%d'>%s</option>", $line["id"], __($line["description"]));
        }
        print "</select>";
        print "<span id=\"filter_dlg_param_box\" style=\"display : none\">";
        print " " . __("with parameters:") . " ";
        print "<input size=\"20\"\n\t\t\t\t\tonkeypress=\"return filterCR(event, createFilter)\"\n\t\t\t\t\tname=\"action_param\">";
        print_label_select($link, "action_param_label", $action_param);
        print "</span>";
        print "&nbsp;";
        // tiny layout hack
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Options") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<div style=\"line-height : 100%\">";
        print "<input type=\"checkbox\" name=\"enabled\" id=\"enabled\" checked=\"1\">\n\t\t\t\t\t<label for=\"enabled\">" . __('Enabled') . "</label><br/>";
        print "<input type=\"checkbox\" name=\"inverse\" id=\"inverse\">\n\t\t\t\t<label for=\"inverse\">" . __('Inverse match') . "</label>";
        print "</div>";
        print "</div>";
        print "</form>";
        print "<div class=\"dlgButtons\">";
        print "<button onclick=\"return createFilter()\">" . __('Create') . "</button> ";
        print "<button onclick=\"return closeInfoBox()\">" . __('Cancel') . "</button>";
        print "</div>";
        //			print "</td></tr></table>";
        return;
    }
    if ($id == "feedUpdateErrors") {
        print "<div id=\"infoBoxTitle\">" . __('Update Errors') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print __("These feeds have not been updated because of errors:");
        $result = db_query($link, "SELECT id,title,feed_url,last_error\n\t\t\tFROM ttrss_feeds WHERE last_error != '' AND owner_uid = " . $_SESSION["uid"]);
        print "<ul class='feedErrorsList'>";
        while ($line = db_fetch_assoc($result)) {
            print "<li><b>" . $line["title"] . "</b> (" . $line["feed_url"] . "): " . "<em>" . $line["last_error"] . "</em>";
        }
        print "</ul>";
        print "<div align='center'>";
        print "<button onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>";
        print "</div>";
        return;
    }
    if ($id == "editArticleTags") {
        print "<div id=\"infoBoxTitle\">" . __('Edit Tags') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print "<form id=\"tag_edit_form\" onsubmit='return false'>";
        print __("Tags for this article (separated by commas):") . "<br>";
        $tags = get_article_tags($link, $param);
        $tags_str = join(", ", $tags);
        print "<table width='100%'>";
        print "<tr><td colspan='2'><input type=\"hidden\" name=\"id\" value=\"{$param}\"></td></tr>";
        print "<tr><td colspan='2'><textarea rows='4' class='iedit' id='tags_str' \n\t\t\t\tname='tags_str'>{$tags_str}</textarea>\n\t\t\t<div class=\"autocomplete\" id=\"tags_choices\" \n\t\t\t\t\tstyle=\"display:none\"></div>\t\n\t\t\t</td></tr>";
        print "</table>";
        print "</form>";
        print "<div align='right'>";
        print "<button onclick=\"return editTagsSave()\">" . __('Save') . "</button> ";
        print "<button onclick=\"return closeInfoBox()\">" . __('Cancel') . "</button>";
        print "</div>";
        return;
    }
    if ($id == "printTagCloud") {
        print "<div id=\"infoBoxTitle\">" . __('Tag Cloud') . "</div>";
        print "<div class=\"infoBoxContents\">";
        print __("Showing most popular tags ") . " (<a \n\t\t\thref='javascript:toggleTags(true)'>" . __('more tags') . "</a>):<br/>";
        print "<div class=\"tagCloudContainer\">";
        printTagCloud($link);
        print "</div>";
        print "<div align='center'>";
        print "<button onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>";
        print "</div>";
        print "</div>";
        return;
    }
    /*		if ($id == "offlineDownload") {
    			print "<div id=\"infoBoxTitle\">".__('Download articles')."</div>";
    			print "<div class=\"infoBoxContents\">";
    
    			print "<form name='download_ops_form' id='download_ops_form'>";
    
    			print "<div class=\"dlgSec\">".__("Download")."</div>";
    
    			print "<div class=\"dlgSecCont\">";
    
    			$amount = array(
    				50  => 50,
    				100 => 100,
    				250 => 250,
    				500 => 500);
    
    			print_select_hash("amount", 50, $amount);
    
    			print " " . __("latest articles for offline reading.");
    
    			print "<br/>";
    
    			print "<input checked='yes' type='checkbox' name='unread_only' id='unread_only'>";
    			print "<label for='unread_only'>".__('Only include unread articles')."</label>";
    
    			print "</div>";
    
    			print "</form>";
    
    			print "<div class=\"dlgButtons\">
    				<input class=\"button\"
    					type=\"submit\" onclick=\"return initiate_offline_download(0, this)\" value=\"".__('Download')."\">
    				<input class=\"button\"
    					type=\"submit\" onclick=\"return closeInfoBox()\" 
    					value=\"".__('Cancel')."\"></div>";
    
    			print "</div>";
    
    			return;
    		} */
    print "<div id='infoBoxTitle'>Internal Error</div>\n\t\t\t<div id='infoBoxContents'>\n\t\t\t<p>Unknown dialog <b>{$id}</b></p>\n\t\t\t</div></div>";
}
	<h4>Categories:</h4>
  <?php 
$categories = getCategoriesArchive();
if ($categories->count() > 0) {
    ?>
    <ul class="nav">
    <?php 
    foreach ($categories as $category) {
        ?>
      <li>
        <a href="<?php 
        echo getCategoryURL($category->name());
        ?>
">
          <?php 
        echo getCategoryTitle($category->name());
        ?>
 (<?php 
        echo $category->results();
        ?>
)
        </a>
      </li>
    <?php 
    }
    ?>
    </ul>
  <?php 
} else {
    ?>
    <p><strong>No categories found.</strong></p>
/**
 * Prints the full link to a news category
 *
 * @param string $before If you want to print text before the link
 * @param string $catlink The category link of a category
 *
 * @return string
 */
function printNewsCategoryURL($before = '', $catlink = '')
{
    if (!empty($catlink)) {
        echo "<a href=\"" . getNewsCategoryURL($catlink) . "\" title=\"" . html_encode(getCategoryTitle($catlink)) . "\">" . $before . getCategoryTitle($catlink) . "</a>";
    }
}
Exemplo n.º 12
0
function module_popup_dialog($link)
{
    $id = $_REQUEST["id"];
    $param = db_escape_string($_REQUEST["param"]);
    print "<dlg id=\"{$id}\">";
    if ($id == "importOpml") {
        print "<div class=\"prefFeedOPMLHolder\">";
        header("Content-Type: text/html");
        # required for iframe
        $owner_uid = $_SESSION["uid"];
        db_query($link, "BEGIN");
        /* create Imported feeds category just in case */
        $result = db_query($link, "SELECT id FROM\n\t\t\t\tttrss_feed_categories WHERE title = 'Imported feeds' AND\n\t\t\t\towner_uid = '{$owner_uid}' LIMIT 1");
        if (db_num_rows($result) == 0) {
            db_query($link, "INSERT INTO ttrss_feed_categories\n\t\t\t\t\t(title,owner_uid)\n\t\t\t\t\t\tVALUES ('Imported feeds', '{$owner_uid}')");
        }
        db_query($link, "COMMIT");
        /* Handle OPML import by DOMXML/DOMDocument */
        if (function_exists('domxml_open_file')) {
            print "<ul class='nomarks'>";
            print "<li>" . __("Importing using DOMXML.") . "</li>";
            require_once "opml_domxml.php";
            opml_import_domxml($link, $owner_uid);
            print "</ul>";
        } else {
            if (PHP_VERSION >= 5) {
                print "<ul class='nomarks'>";
                print "<li>" . __("Importing using DOMDocument.") . "</li>";
                require_once "opml_domdoc.php";
                opml_import_domdoc($link, $owner_uid);
                print "</ul>";
            } else {
                print_error(__("DOMXML extension is not found. It is required for PHP versions below 5."));
            }
        }
        print "</div>";
        print "<div align='center'>";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('opmlImportDlg').hide()\">" . __('Close this window') . "</button>";
        print "</div>";
        print "</div>";
        //return;
    }
    if ($id == "editPrefProfiles") {
        print "<div dojoType=\"dijit.Toolbar\">";
        #			TODO: depends on selectTableRows() being broken for this list
        #			print "<div dojoType=\"dijit.form.DropDownButton\">".
        #				"<span>" . __('Select')."</span>";
        #			print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">";
        #			print "<div onclick=\"selectTableRows('prefFeedProfileList', 'all')\"
        #				dojoType=\"dijit.MenuItem\">".__('All')."</div>";
        #			print "<div onclick=\"selectTableRows('prefFeedProfileList', 'none')\"
        #				dojoType=\"dijit.MenuItem\">".__('None')."</div>";
        #			print "</div></div>";
        #			print "<div style='float : right'>";
        print "<input name=\"newprofile\" dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\t\trequired=\"1\">\n\t\t\t\t<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('profileEditDlg').addProfile()\">" . __('Create profile') . "</button></div>";
        #			print "</div>";
        $result = db_query($link, "SELECT title,id FROM ttrss_settings_profiles\n\t\t\t\tWHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title");
        print "<div class=\"prefFeedCatHolder\">";
        print "<form id=\"profile_edit_form\" onsubmit=\"return false\">";
        print "<table width=\"100%\" class=\"prefFeedProfileList\"\n\t\t\t\tcellspacing=\"0\" id=\"prefFeedProfileList\">";
        print "<tr class=\"\" id=\"FCATR-0\">";
        #odd
        print "<td width='5%' align='center'><input\n\t\t\t\tonclick='toggleSelectRow2(this);'\n\t\t\t\tdojoType=\"dijit.form.CheckBox\"\n\t\t\t\ttype=\"checkbox\"></td>";
        if (!$_SESSION["profile"]) {
            $is_active = __("(active)");
        } else {
            $is_active = "";
        }
        print "<td><span>" . __("Default profile") . " {$is_active}</span></td>";
        print "</tr>";
        $lnum = 1;
        while ($line = db_fetch_assoc($result)) {
            $class = $lnum % 2 ? "even" : "odd";
            $profile_id = $line["id"];
            $this_row_id = "id=\"FCATR-{$profile_id}\"";
            print "<tr class=\"\" {$this_row_id}>";
            $edit_title = htmlspecialchars($line["title"]);
            print "<td width='5%' align='center'><input\n\t\t\t\t\tonclick='toggleSelectRow2(this);'\n\t\t\t\t\tdojoType=\"dijit.form.CheckBox\"\n\t\t\t\t\ttype=\"checkbox\"></td>";
            if ($_SESSION["profile"] == $line["id"]) {
                $is_active = __("(active)");
            } else {
                $is_active = "";
            }
            print "<td><span dojoType=\"dijit.InlineEditBox\"\n\t\t\t\t\twidth=\"300px\" autoSave=\"false\"\n\t\t\t\t\tprofile-id=\"{$profile_id}\">" . $edit_title . "<script type=\"dojo/method\" event=\"onChange\" args=\"item\">\n\t\t\t\t\t\tvar elem = this;\n\t\t\t\t\t\tdojo.xhrPost({\n\t\t\t\t\t\t\turl: 'backend.php',\n\t\t\t\t\t\t\tcontent: {op: 'rpc', subop: 'saveprofile',\n\t\t\t\t\t\t\t\tvalue: this.value,\n\t\t\t\t\t\t\t\tid: this.srcNodeRef.getAttribute('profile-id')},\n\t\t\t\t\t\t\t\tload: function(response) {\n\t\t\t\t\t\t\t\t\telem.attr('value', response);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t</script>\n\t\t\t\t</span> {$is_active}</td>";
            print "</tr>";
            ++$lnum;
        }
        print "</table>";
        print "</form>";
        print "</div>";
        print "<div class='dlgButtons'>\n\t\t\t\t<div style='float : left'>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('profileEditDlg').removeSelected()\">" . __('Remove selected profiles') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('profileEditDlg').activateProfile()\">" . __('Activate profile') . "</button>\n\t\t\t\t</div>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('profileEditDlg').hide()\">" . __('Close this window') . "</button>";
        print "</div>";
    }
    if ($id == "pubOPMLUrl") {
        print "<title>" . __('Public OPML URL') . "</title>";
        print "<content><![CDATA[";
        $url_path = opml_publish_url($link);
        print __("Your Public OPML URL is:");
        print "<div class=\"tagCloudContainer\">";
        print "<a id='pub_opml_url' href='{$url_path}' target='_blank'>{$url_path}</a>";
        print "</div>";
        print "<div align='center'>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"return opmlRegenKey()\">" . __('Generate new URL') . "</button> ";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>";
        print "</div>";
        print "]]></content>";
        //return;
    }
    if ($id == "explainError") {
        print "<title>" . __('Notice') . "</title>";
        print "<content><![CDATA[";
        print "<div class=\"errorExplained\">";
        if ($param == 1) {
            print __("Update daemon is enabled in configuration, but daemon process is not running, which prevents all feeds from updating. Please start the daemon process or contact instance owner.");
            $stamp = (int) file_get_contents(LOCK_DIRECTORY . "/update_daemon.stamp");
            print "<p>" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp);
        }
        if ($param == 3) {
            print __("Update daemon is taking too long to perform a feed update. This could indicate a problem like crash or a hang. Please check the daemon process or contact instance owner.");
            $stamp = (int) file_get_contents(LOCK_DIRECTORY . "/update_daemon.stamp");
            print "<p>" . __("Last update:") . " " . date("Y.m.d, G:i", $stamp);
        }
        print "</div>";
        print "<div align='center'>";
        print "<button onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>";
        print "</div>";
        print "]]></content>";
        //return;
    }
    if ($id == "quickAddFeed") {
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"addfeed\">";
        print "<div class=\"dlgSec\">" . __("Feed") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<input style=\"font-size : 16px; width : 20em;\"\n\t\t\t\tplaceHolder=\"" . __("Feed URL") . "\"\n\t\t\t\tdojoType=\"dijit.form.ValidationTextBox\" required=\"1\" name=\"feed\" id=\"feedDlg_feedUrl\">";
        print "<hr/>";
        if (get_pref($link, 'ENABLE_FEED_CATS')) {
            print __('Place in category:') . " ";
            print_feed_cat_select($link, "cat", false, 'dojoType="dijit.form.Select"');
        }
        print "</div>";
        print '<div id="feedDlg_feedsContainer" style="display : none">

					<div class="dlgSec">' . __('Available feeds') . '</div>
					<div class="dlgSecCont">' . '<select id="feedDlg_feedContainerSelect"
						dojoType="dijit.form.Select" size="3">
						<script type="dojo/method" event="onChange" args="value">
							dijit.byId("feedDlg_feedUrl").attr("value", value);
						</script>
					</select>' . '</div></div>';
        print "<div id='feedDlg_loginContainer' style='display : none'>\n\n\t\t\t\t\t<div class=\"dlgSec\">" . __("Authentication") . "</div>\n\t\t\t\t\t<div class=\"dlgSecCont\">" . " <input dojoType=\"dijit.form.TextBox\" name='login'\"\n\t\t\t\t\t\tplaceHolder=\"" . __("Login") . "\"\n\t\t\t\t\t\tstyle=\"width : 10em;\"> " . " <input\n\t\t\t\t\t\tplaceHolder=\"" . __("Password") . "\"\n\t\t\t\t\t\tdojoType=\"dijit.form.TextBox\" type='password'\n\t\t\t\t\t\tstyle=\"width : 10em;\" name='pass'\">\n\t\t\t\t</div></div>";
        print "<div style=\"clear : both\">\n\t\t\t\t<input type=\"checkbox\" dojoType=\"dijit.form.CheckBox\" id=\"feedDlg_loginCheck\"\n\t\t\t\t\t\tonclick='checkboxToggleElement(this, \"feedDlg_loginContainer\")'>\n\t\t\t\t\t<label for=\"feedDlg_loginCheck\">" . __('This feed requires authentication.') . "</div>";
        print "</form>";
        print "<div class=\"dlgButtons\">\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('feedAddDlg').execute()\">" . __('Subscribe') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"return feedBrowser()\">" . __('More feeds') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('feedAddDlg').hide()\">" . __('Cancel') . "</button>\n\t\t\t\t</div>";
        //return;
    }
    if ($id == "feedBrowser") {
        $browser_search = db_escape_string($_REQUEST["search"]);
        #			print "<form onsubmit='return false;' display='inline'
        #				name='feed_browser' id='feed_browser'>";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"updateFeedBrowser\">";
        print "<div dojoType=\"dijit.Toolbar\">\n\t\t\t\t<div style='float : right'>\n\t\t\t\t<img style='display : none'\n\t\t\t\t\tid='feed_browser_spinner' src='" . theme_image($link, 'images/indicator_white.gif') . "'>\n\t\t\t\t<input name=\"search\" dojoType=\"dijit.form.TextBox\" size=\"20\" type=\"search\"\n\t\t\t\t\tonchange=\"dijit.byId('feedBrowserDlg').update()\" value=\"{$browser_search}\">\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').update()\">" . __('Search') . "</button>\n\t\t\t</div>";
        print " <select name=\"mode\" dojoType=\"dijit.form.Select\" onchange=\"dijit.byId('feedBrowserDlg').update()\">\n\t\t\t\t<option value='1'>" . __('Popular feeds') . "</option>\n\t\t\t\t<option value='2'>" . __('Feed archive') . "</option>\n\t\t\t\t</select> ";
        print __("limit:");
        print " <select dojoType=\"dijit.form.Select\" name=\"limit\" onchange=\"dijit.byId('feedBrowserDlg').update()\">";
        foreach (array(25, 50, 100, 200) as $l) {
            $issel = $l == $limit ? "selected=\"1\"" : "";
            print "<option {$issel} value=\"{$l}\">{$l}</option>";
        }
        print "</select> ";
        print "</div>";
        $owner_uid = $_SESSION["uid"];
        print "<ul class='browseFeedList' id='browseFeedList'>";
        print make_feed_browser($link, $search, 25);
        print "</ul>";
        print "<div align='center'>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').execute()\">" . __('Subscribe') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" style='display : none' id='feed_archive_remove' onclick=\"dijit.byId('feedBrowserDlg').removeFromArchive()\">" . __('Remove') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').hide()\" >" . __('Cancel') . "</button></div>";
    }
    if ($id == "search") {
        $params = explode(":", db_escape_string($_REQUEST["param"]), 2);
        $active_feed_id = sprintf("%d", $params[0]);
        $is_cat = $params[1] != "false";
        print "<div class=\"dlgSec\">" . __('Look for') . "</div>";
        print "<div class=\"dlgSecCont\">";
        if (!SPHINX_ENABLED) {
            print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\t\tstyle=\"font-size : 16px; width : 12em;\"\n\t\t\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>";
            print " " . __('match on') . " ";
            $search_fields = array("title" => __("Title"), "content" => __("Content"), "both" => __("Title or content"));
            print_select_hash("match_on", 3, $search_fields, 'dojoType="dijit.form.Select"');
        } else {
            print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\t\tstyle=\"font-size : 16px; width : 20em;\"\n\t\t\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>";
        }
        print "<hr/>" . __('Limit search to:') . " ";
        print "<select name=\"search_mode\" dojoType=\"dijit.form.Select\">\n\t\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>";
        $feed_title = getFeedTitle($link, $active_feed_id);
        if (!$is_cat) {
            $feed_cat_title = getFeedCatTitle($link, $active_feed_id);
        } else {
            $feed_cat_title = getCategoryTitle($link, $active_feed_id);
        }
        if ($active_feed_id && !$is_cat) {
            print "<option selected=\"1\" value=\"this_feed\">{$feed_title}</option>";
        } else {
            print "<option disabled=\"1\" value=\"false\">" . __('This feed') . "</option>";
        }
        if ($is_cat) {
            $cat_preselected = "selected=\"1\"";
        }
        if (get_pref($link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) {
            print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>";
        } else {
            //print "<option disabled>".__('This category')."</option>";
        }
        print "</select>";
        print "</div>";
        print "<div class=\"dlgButtons\">";
        if (!SPHINX_ENABLED) {
            print "<div style=\"float : left\">\n\t\t\t\t\t<a class=\"visibleLink\" target=\"_blank\" href=\"http://tt-rss.org/redmine/wiki/tt-rss/SearchSyntax\">Search syntax</a>\n\t\t\t\t\t</div>";
        }
        print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').execute()\">" . __('Search') . "</button>\n\t\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').hide()\">" . __('Cancel') . "</button>\n\t\t\t</div>";
    }
    if ($id == "quickAddFilter") {
        $active_feed_id = db_escape_string($_REQUEST["param"]);
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"pref-filters\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"quiet\" value=\"1\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"add\">";
        $result = db_query($link, "SELECT id,description\n\t\t\t\tFROM ttrss_filter_types ORDER BY description");
        $filter_types = array();
        while ($line = db_fetch_assoc($result)) {
            //array_push($filter_types, $line["description"]);
            $filter_types[$line["id"]] = __($line["description"]);
        }
        print "<div class=\"dlgSec\">" . __("Match") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<span id=\"filterDlg_dateModBox\" style=\"display : none\">";
        $filter_params = array("before" => __("before"), "after" => __("after"));
        print_select_hash("filter_date_modifier", "before", $filter_params, 'dojoType="dijit.form.Select"');
        print "&nbsp;</span>";
        print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\t\t required=\"true\" id=\"filterDlg_regExp\"\n\t\t\t\t style=\"font-size : 16px\"\n\t\t\t\t name=\"reg_exp\" value=\"{$reg_exp}\"/>";
        print "<span id=\"filterDlg_dateChkBox\" style=\"display : none\">";
        print "&nbsp;<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return filterDlgCheckDate()\">" . __('Check it') . "</button>";
        print "</span>";
        print "<hr/>" . __("on field") . " ";
        print_select_hash("filter_type", 1, $filter_types, 'onchange="filterDlgCheckType(this)" dojoType="dijit.form.Select"');
        print "<hr/>";
        print __("in") . " ";
        print_feed_select($link, "feed_id", $active_feed_id, 'dojoType="dijit.form.FilteringSelect"');
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Perform Action") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<select name=\"action_id\" dojoType=\"dijit.form.Select\"\n\t\t\t\tonchange=\"filterDlgCheckAction(this)\">";
        $result = db_query($link, "SELECT id,description FROM ttrss_filter_actions\n\t\t\t\tORDER BY name");
        while ($line = db_fetch_assoc($result)) {
            printf("<option value='%d'>%s</option>", $line["id"], __($line["description"]));
        }
        print "</select>";
        print "<span id=\"filterDlg_paramBox\" style=\"display : none\">";
        print " " . __("with parameters:") . " ";
        print "<input dojoType=\"dijit.form.TextBox\"\n\t\t\t\tid=\"filterDlg_actionParam\"\n\t\t\t\tname=\"action_param\">";
        print_label_select($link, "action_param_label", $action_param, 'id="filterDlg_actionParamLabel" dojoType="dijit.form.Select"');
        print "</span>";
        print "&nbsp;";
        // tiny layout hack
        print "</div>";
        print "<div class=\"dlgSec\">" . __("Options") . "</div>";
        print "<div class=\"dlgSecCont\">";
        print "<input dojoType=\"dijit.form.CheckBox\" type=\"checkbox\" name=\"enabled\" id=\"enabled\" checked=\"1\">\n\t\t\t\t\t<label for=\"enabled\">" . __('Enabled') . "</label><hr/>";
        print "<input dojoType=\"dijit.form.CheckBox\" type=\"checkbox\" name=\"inverse\" id=\"inverse\">\n\t\t\t\t<label for=\"inverse\">" . __('Inverse match') . "</label>";
        print "</div>";
        print "<div class=\"dlgButtons\">";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').test()\">" . __('Test') . "</button> ";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').execute()\">" . __('Create') . "</button> ";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('filterEditDlg').hide()\">" . __('Cancel') . "</button>";
        print "</div>";
        //return;
    }
    if ($id == "inactiveFeeds") {
        if (DB_TYPE == "pgsql") {
            $interval_qpart = "NOW() - INTERVAL '3 months'";
        } else {
            $interval_qpart = "DATE_SUB(NOW(), INTERVAL 3 MONTH)";
        }
        $result = db_query($link, "SELECT ttrss_feeds.title, ttrss_feeds.site_url,\n\t\t\t  \t\tttrss_feeds.feed_url, ttrss_feeds.id, MAX(updated) AS last_article\n\t\t\t\tFROM ttrss_feeds, ttrss_entries, ttrss_user_entries WHERE\n\t\t\t\t\t(SELECT MAX(updated) FROM ttrss_entries, ttrss_user_entries WHERE\n\t\t\t\t\t\tttrss_entries.id = ref_id AND\n\t\t\t\t\t\t\tttrss_user_entries.feed_id = ttrss_feeds.id) < {$interval_qpart}\n\t\t\t\tAND ttrss_feeds.owner_uid = " . $_SESSION["uid"] . " AND\n\t\t\t\t\tttrss_user_entries.feed_id = ttrss_feeds.id AND\n\t\t\t\t\tttrss_entries.id = ref_id\n\t\t\t\tGROUP BY ttrss_feeds.title, ttrss_feeds.id, ttrss_feeds.site_url, ttrss_feeds.feed_url\n\t\t\t\tORDER BY last_article");
        print __("These feeds have not been updated with new content for 3 months (oldest first):");
        print "<div class=\"inactiveFeedHolder\">";
        print "<table width=\"100%\" cellspacing=\"0\" id=\"prefInactiveFeedList\">";
        $lnum = 1;
        while ($line = db_fetch_assoc($result)) {
            $class = $lnum % 2 ? "even" : "odd";
            $feed_id = $line["id"];
            $this_row_id = "id=\"FUPDD-{$feed_id}\"";
            print "<tr class=\"\" {$this_row_id}>";
            $edit_title = htmlspecialchars($line["title"]);
            print "<td width='5%' align='center'><input\n\t\t\t\t\tonclick='toggleSelectRow2(this);' dojoType=\"dijit.form.CheckBox\"\n\t\t\t\t\ttype=\"checkbox\"></td>";
            print "<td>";
            print "<a class=\"visibleLink\" href=\"#\" " . "title=\"" . __("Click to edit feed") . "\" " . "onclick=\"editFeed(" . $line["id"] . ")\">" . htmlspecialchars($line["title"]) . "</a>";
            print "</td><td class=\"insensitive\" align='right'>";
            print make_local_datetime($link, $line['last_article'], false);
            print "</td>";
            print "</tr>";
            ++$lnum;
        }
        print "</table>";
        print "</div>";
        print "<div class='dlgButtons'>";
        print "<div style='float : left'>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('inactiveFeedsDlg').removeSelected()\">" . __('Unsubscribe from selected feeds') . "</button> ";
        print "</div>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('inactiveFeedsDlg').hide()\">" . __('Close this window') . "</button>";
        print "</div>";
    }
    if ($id == "feedsWithErrors") {
        #			print "<title>".__('Feeds with update errors')."</title>";
        #			print "<content><![CDATA[";
        print __("These feeds have not been updated because of errors:");
        $result = db_query($link, "SELECT id,title,feed_url,last_error,site_url\n\t\t\tFROM ttrss_feeds WHERE last_error != '' AND owner_uid = " . $_SESSION["uid"]);
        print "<div class=\"inactiveFeedHolder\">";
        print "<table width=\"100%\" cellspacing=\"0\" id=\"prefErrorFeedList\">";
        $lnum = 1;
        while ($line = db_fetch_assoc($result)) {
            $class = $lnum % 2 ? "even" : "odd";
            $feed_id = $line["id"];
            $this_row_id = "id=\"FUPDD-{$feed_id}\"";
            print "<tr class=\"\" {$this_row_id}>";
            $edit_title = htmlspecialchars($line["title"]);
            print "<td width='5%' align='center'><input\n\t\t\t\t\tonclick='toggleSelectRow2(this);' dojoType=\"dijit.form.CheckBox\"\n\t\t\t\t\ttype=\"checkbox\"></td>";
            print "<td>";
            print "<a class=\"visibleLink\" href=\"#\" " . "title=\"" . __("Click to edit feed") . "\" " . "onclick=\"editFeed(" . $line["id"] . ")\">" . htmlspecialchars($line["title"]) . "</a>: ";
            print "<span class=\"insensitive\">";
            print htmlspecialchars($line["last_error"]);
            print "</span>";
            print "</td>";
            print "</tr>";
            ++$lnum;
        }
        print "</table>";
        print "</div>";
        print "<div class='dlgButtons'>";
        print "<div style='float : left'>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('errorFeedsDlg').removeSelected()\">" . __('Unsubscribe from selected feeds') . "</button> ";
        print "</div>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('errorFeedsDlg').hide()\">" . __('Close this window') . "</button>";
        print "</div>";
    }
    if ($id == "editArticleTags") {
        #			print "<form id=\"tag_edit_form\" onsubmit='return false'>";
        print __("Tags for this article (separated by commas):") . "<br>";
        $tags = get_article_tags($link, $param);
        $tags_str = join(", ", $tags);
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"id\" value=\"{$param}\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"setArticleTags\">";
        print "<table width='100%'><tr><td>";
        print "<textarea dojoType=\"dijit.form.SimpleTextarea\" rows='4'\n\t\t\t\tstyle='font-size : 12px; width : 100%' id=\"tags_str\"\n\t\t\t\tname='tags_str'>{$tags_str}</textarea>\n\t\t\t<div class=\"autocomplete\" id=\"tags_choices\"\n\t\t\t\t\tstyle=\"display:none\"></div>";
        print "</td></tr></table>";
        #			print "</form>";
        print "<div class='dlgButtons'>";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('editTagsDlg').execute()\">" . __('Save') . "</button> ";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('editTagsDlg').hide()\">" . __('Cancel') . "</button>";
        print "</div>";
    }
    if ($id == "printTagCloud") {
        print "<title>" . __('Tag Cloud') . "</title>";
        print "<content><![CDATA[";
        #			print __("Showing most popular tags ")." (<a
        #			href='javascript:toggleTags(true)'>".__('more tags')."</a>):<br/>";
        print "<div class=\"tagCloudContainer\">";
        printTagCloud($link);
        print "</div>";
        print "<div align='center'>";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>";
        print "</div>";
        print "]]></content>";
    }
    if ($id == 'printTagSelect') {
        print "<title>" . __('Select item(s) by tags') . "</title>";
        print "<content><![CDATA[";
        print __("Match:") . "&nbsp;" . "<input class=\"noborder\" dojoType=\"dijit.form.RadioButton\" type=\"radio\" checked value=\"any\" name=\"tag_mode\">&nbsp;Any&nbsp;";
        print "<input class=\"noborder\" dojoType=\"dijit.form.RadioButton\" type=\"radio\" value=\"all\" name=\"tag_mode\">&nbsp;All&nbsp;";
        print "&nbsp;tags.";
        print "<select id=\"all_tags\" name=\"all_tags\" title=\"" . __('Which Tags?') . "\" multiple=\"multiple\" size=\"10\" style=\"width : 100%\">";
        $result = db_query($link, "SELECT DISTINCT tag_name FROM ttrss_tags WHERE owner_uid = " . $_SESSION['uid'] . "\n\t\t\t\tAND LENGTH(tag_name) <= 30 ORDER BY tag_name ASC");
        while ($row = db_fetch_assoc($result)) {
            $tmp = htmlspecialchars($row["tag_name"]);
            print "<option value=\"" . str_replace(" ", "%20", $tmp) . "\">{$tmp}</option>";
        }
        print "</select>";
        print "<div align='right'>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"viewfeed(get_all_tags(\$('all_tags')),\n\t\t\t\tget_radio_checked(\$('tag_mode')));\">" . __('Display entries') . "</button>";
        print "&nbsp;";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\tonclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>";
        print "</div>";
        print "]]></content>";
    }
    if ($id == "emailArticle") {
        $secretkey = sha1(uniqid(rand(), true));
        $_SESSION['email_secretkey'] = $secretkey;
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"secretkey\" value=\"{$secretkey}\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"sendEmail\">";
        $result = db_query($link, "SELECT email, full_name FROM ttrss_users WHERE\n\t\t\t\tid = " . $_SESSION["uid"]);
        $user_email = htmlspecialchars(db_fetch_result($result, 0, "email"));
        $user_name = htmlspecialchars(db_fetch_result($result, 0, "full_name"));
        if (!$user_name) {
            $user_name = $_SESSION['name'];
        }
        $_SESSION['email_replyto'] = $user_email;
        $_SESSION['email_fromname'] = $user_name;
        require_once "lib/MiniTemplator.class.php";
        $tpl = new MiniTemplator();
        $tpl_t = new MiniTemplator();
        $tpl->readTemplateFromFile("templates/email_article_template.txt");
        $tpl->setVariable('USER_NAME', $_SESSION["name"]);
        $tpl->setVariable('USER_EMAIL', $user_email);
        $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"]);
        //			$tpl->addBlock('header');
        $result = db_query($link, "SELECT link, content, title\n\t\t\t\tFROM ttrss_user_entries, ttrss_entries WHERE id = ref_id AND\n\t\t\t\tid IN ({$param}) AND owner_uid = " . $_SESSION["uid"]);
        if (db_num_rows($result) > 1) {
            $subject = __("[Forwarded]") . " " . __("Multiple articles");
        }
        while ($line = db_fetch_assoc($result)) {
            if (!$subject) {
                $subject = __("[Forwarded]") . " " . htmlspecialchars($line["title"]);
            }
            $tpl->setVariable('ARTICLE_TITLE', strip_tags($line["title"]));
            $tpl->setVariable('ARTICLE_URL', strip_tags($line["link"]));
            $tpl->addBlock('article');
        }
        $tpl->addBlock('email');
        $content = "";
        $tpl->generateOutputToString($content);
        print "<table width='100%'><tr><td>";
        print __('From:');
        print "</td><td>";
        print "<input dojoType=\"dijit.form.TextBox\" disabled=\"1\" style=\"width : 30em;\"\n\t\t\t\t\tvalue=\"{$user_name} <{$user_email}>\">";
        print "</td></tr><tr><td>";
        print __('To:');
        print "</td><td>";
        print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"true\"\n\t\t\t\t\tstyle=\"width : 30em;\"\n\t\t\t\t\tname=\"destination\" id=\"emailArticleDlg_destination\">";
        print "<div class=\"autocomplete\" id=\"emailArticleDlg_dst_choices\"\n\t\t\t\t\tstyle=\"z-index: 30; display : none\"></div>";
        print "</td></tr><tr><td>";
        print __('Subject:');
        print "</td><td>";
        print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"true\"\n\t\t\t\t\tstyle=\"width : 30em;\"\n\t\t\t\t\tname=\"subject\" value=\"{$subject}\" id=\"subject\">";
        print "</td></tr>";
        print "<tr><td colspan='2'><textarea dojoType=\"dijit.form.SimpleTextarea\" style='font-size : 12px; width : 100%' rows=\"20\"\n\t\t\t\tname='content'>{$content}</textarea>";
        print "</td></tr></table>";
        print "<div class='dlgButtons'>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('emailArticleDlg').execute()\">" . __('Send e-mail') . "</button> ";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('emailArticleDlg').hide()\">" . __('Cancel') . "</button>";
        print "</div>";
        //return;
    }
    if ($id == "generatedFeed") {
        print "<title>" . __('View as RSS') . "</title>";
        print "<content><![CDATA[";
        $params = explode(":", $param, 3);
        $feed_id = db_escape_string($params[0]);
        $is_cat = (bool) $params[1];
        $key = get_feed_access_key($link, $feed_id, $is_cat);
        $url_path = htmlspecialchars($params[2]) . "&key=" . $key;
        print __("You can view this feed as RSS using the following URL:");
        print "<div class=\"tagCloudContainer\">";
        print "<a id='gen_feed_url' href='{$url_path}' target='_blank'>{$url_path}</a>";
        print "</div>";
        print "<div align='center'>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"return genUrlChangeKey('{$feed_id}', '{$is_cat}')\">" . __('Generate new URL') . "</button> ";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"return closeInfoBox()\">" . __('Close this window') . "</button>";
        print "</div>";
        print "]]></content>";
        //return;
    }
    if ($id == "newVersion") {
        $version_data = check_for_update($link);
        $version = $version_data['version'];
        $id = $version_data['version_id'];
        print "<div class='tagCloudContainer'>";
        print T_sprintf("New version of Tiny Tiny RSS is available (%s).", "<b>{$version}</b>");
        print "</div>";
        $details = "http://tt-rss.org/redmine/versions/show/{$id}";
        $download = "http://tt-rss.org/#Download";
        print "<div style='text-align : center'>";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return window.open('{$details}')\">" . __("Details") . "</button>";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return window.open('{$download}')\">" . __("Download") . "</button>";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"return dijit.byId('newVersionDlg').hide()\">" . __('Close this window') . "</button>";
        print "</div>";
    }
    if ($id == "customizeCSS") {
        $value = get_pref($link, "USER_STYLESHEET");
        $value = str_replace("<br/>", "\n", $value);
        print T_sprintf("You can override colors, fonts and layout of your currently selected theme with custom CSS declarations here. <a target=\"_blank\" class=\"visibleLink\" href=\"%s\">This file</a> can be used as a baseline.", "tt-rss.css");
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"setpref\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"key\" value=\"USER_STYLESHEET\">";
        print "<table width='100%'><tr><td>";
        print "<textarea dojoType=\"dijit.form.SimpleTextarea\"\n\t\t\t\tstyle='font-size : 12px; width : 100%; height: 200px;'\n\t\t\t\tplaceHolder='body#ttrssMain { font-size : 14px; };'\n\t\t\t\tname='value'>{$value}</textarea>";
        print "</td></tr></table>";
        print "<div class='dlgButtons'>";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('cssEditDlg').execute()\">" . __('Save') . "</button> ";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('cssEditDlg').hide()\">" . __('Cancel') . "</button>";
        print "</div>";
    }
    if ($id == "editArticleNote") {
        $result = db_query($link, "SELECT note FROM ttrss_user_entries WHERE\n\t\t\t\tref_id = '{$param}' AND owner_uid = " . $_SESSION['uid']);
        $note = db_fetch_result($result, 0, "note");
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"id\" value=\"{$param}\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"subop\" value=\"setNote\">";
        print "<table width='100%'><tr><td>";
        print "<textarea dojoType=\"dijit.form.SimpleTextarea\"\n\t\t\t\tstyle='font-size : 12px; width : 100%; height: 100px;'\n\t\t\t\tplaceHolder='body#ttrssMain { font-size : 14px; };'\n\t\t\t\tname='note'>{$note}</textarea>";
        print "</td></tr></table>";
        print "<div class='dlgButtons'>";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('editNoteDlg').execute()\">" . __('Save') . "</button> ";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('editNoteDlg').hide()\">" . __('Cancel') . "</button>";
        print "</div>";
    }
    if ($id == "about") {
        print "<table width='100%'><tr><td align='center'>";
        print "<img src=\"images/logo_big.png\">";
        print "</td>";
        print "<td width='70%'>";
        print "<h1>Tiny Riny RSS</h1>\n\t\t\t\t<strong>Version " . VERSION . "</strong>\n\t\t\t\t<p>Copyright &copy; 2005-" . date('Y') . "\n\t\t\t\t<a target=\"_blank\" class=\"visibleLink\"\n\t\t\t\thref=\"http://fakecake.org/\">Andrew Dolgov</a>\n\t\t\t\tand other contributors.</p>\n\t\t\t\t<p class=\"insensitive\">Licensed under GNU GPL version 2.</p>";
        print "<p class=\"insensitive\">\n\t\t\t\t<a class=\"visibleLink\" target=\"_blank\"\n\t\t\t\t\thref=\"http://tt-rss.org/\">Official site</a> &mdash;\n\t\t\t\t<a href=\"http://tt-rss.org/redmine/wiki/tt-rss/Donate\"\n\t\t\t\ttarget=\"_blank\" class=\"visibleLink\">\n\t\t\t\tSupport the project.</a></p>";
        print "</td></tr>";
        print "</table>";
        print "<div align='center'>";
        print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\ttype=\"submit\">" . __('Close this window') . "</button>";
        print "</div>";
    }
    if ($id == "addInstance") {
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\"  name=\"op\" value=\"pref-instances\">";
        print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\"  name=\"subop\" value=\"add\">";
        print "<div class=\"dlgSec\">" . __("Instance") . "</div>";
        print "<div class=\"dlgSecCont\">";
        /* URL */
        print __("URL:") . " ";
        print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\"\n\t\t\t\tplaceHolder=\"" . __("Instance URL") . "\"\n\t\t\t\tregExp='^(http|https)://.*'\n\t\t\t\tstyle=\"font-size : 16px; width: 20em\" name=\"access_url\">";
        print "<hr/>";
        $access_key = sha1(uniqid(rand(), true));
        /* Access key */
        print __("Access key:") . " ";
        print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\"\n\t\t\t\tplaceHolder=\"" . __("Access key") . "\" regExp='\\w{40}'\n\t\t\t\tstyle=\"width: 20em\" name=\"access_key\" id=\"instance_add_key\"\n\t\t\t\tvalue=\"{$access_key}\">";
        print "<p class='insensitive'>" . __("Use one access key for both linked instances.");
        print "</div>";
        print "<div class=\"dlgButtons\">\n\t\t\t\t<div style='float : left'>\n\t\t\t\t\t<button dojoType=\"dijit.form.Button\"\n\t\t\t\t\t\tonclick=\"return dijit.byId('instanceAddDlg').regenKey()\">" . __('Generate new key') . "</button>\n\t\t\t\t</div>\n\t\t\t\t<button dojoType=\"dijit.form.Button\"\n\t\t\t\t\tonclick=\"return dijit.byId('instanceAddDlg').execute()\">" . __('Create link') . "</button>\n\t\t\t\t<button dojoType=\"dijit.form.Button\"\n\t\t\t\t\tonclick=\"return dijit.byId('instanceAddDlg').hide()\"\">" . __('Cancel') . "</button></div>";
        return;
    }
    if ($id == "shareArticle") {
        $result = db_query($link, "SELECT uuid, ref_id FROM ttrss_user_entries WHERE int_id = '{$param}'\n\t\t\t\tAND owner_uid = " . $_SESSION['uid']);
        if (db_num_rows($result) == 0) {
            print "Article not found.";
        } else {
            $uuid = db_fetch_result($result, 0, "uuid");
            $ref_id = db_fetch_result($result, 0, "ref_id");
            if (!$uuid) {
                $uuid = db_escape_string(sha1(uniqid(rand(), true)));
                db_query($link, "UPDATE ttrss_user_entries SET uuid = '{$uuid}' WHERE int_id = '{$param}'\n\t\t\t\t\t\tAND owner_uid = " . $_SESSION['uid']);
            }
            print __("You can share this article by the following unique URL:");
            $url_path = get_self_url_prefix();
            $url_path .= "/public.php?op=share&key={$uuid}";
            print "<div class=\"tagCloudContainer\">";
            print "<a id='pub_opml_url' href='{$url_path}' target='_blank'>{$url_path}</a>";
            print "</div>";
            /* if (!label_find_id($link, __('Shared'), $_SESSION["uid"]))
            					label_create($link, __('Shared'), $_SESSION["uid"]);
            
            				label_add_article($link, $ref_id, __('Shared'), $_SESSION['uid']); */
        }
        print "<div align='center'>";
        print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('shareArticleDlg').hide()\">" . __('Close this window') . "</button>";
        print "</div>";
        return;
    }
    print "</dlg>";
}
Exemplo n.º 13
0
function queryFeedHeadlines($params)
{
    $feed = $params["feed"];
    $limit = isset($params["limit"]) ? $params["limit"] : 30;
    $view_mode = $params["view_mode"];
    $cat_view = isset($params["cat_view"]) ? $params["cat_view"] : false;
    $search = isset($params["search"]) ? $params["search"] : false;
    $search_language = isset($params["search_language"]) ? $params["search_language"] : "";
    $override_order = isset($params["override_order"]) ? $params["override_order"] : false;
    $offset = isset($params["offset"]) ? $params["offset"] : 0;
    $owner_uid = isset($params["owner_uid"]) ? $params["owner_uid"] : $_SESSION["uid"];
    $since_id = isset($params["since_id"]) ? $params["since_id"] : 0;
    $include_children = isset($params["include_children"]) ? $params["include_children"] : false;
    $ignore_vfeed_group = isset($params["ignore_vfeed_group"]) ? $params["ignore_vfeed_group"] : false;
    $override_strategy = isset($params["override_strategy"]) ? $params["override_strategy"] : false;
    $override_vfeed = isset($params["override_vfeed"]) ? $params["override_vfeed"] : false;
    $start_ts = isset($params["start_ts"]) ? $params["start_ts"] : false;
    $check_first_id = isset($params["check_first_id"]) ? $params["check_first_id"] : false;
    $api_request = isset($params["api_request"]) ? $params["api_request"] : false;
    $ext_tables_part = "";
    $query_strategy_part = "";
    $search_words = array();
    if ($search) {
        foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH) as $plugin) {
            list($search_query_part, $search_words) = $plugin->hook_search($search);
            break;
        }
        // fall back in case of no plugins
        if (!$search_query_part) {
            list($search_query_part, $search_words) = search_to_sql($search, $search_language);
        }
        $search_query_part .= " AND ";
    } else {
        $search_query_part = "";
    }
    if ($since_id) {
        $since_id_part = "ttrss_entries.id > {$since_id} AND ";
    } else {
        $since_id_part = "";
    }
    $view_query_part = "";
    $disable_offsets = false;
    if ($view_mode == "adaptive") {
        if ($search) {
            $view_query_part = " ";
        } else {
            if ($feed != -1) {
                $unread = getFeedUnread($feed, $cat_view);
                if ($cat_view && $feed > 0 && $include_children) {
                    $unread += getCategoryChildrenUnread($feed);
                }
                if ($unread > 0) {
                    $view_query_part = " unread = true AND ";
                    $disable_offsets = !$api_request && get_pref("CDM_AUTO_CATCHUP") && get_pref("CDM_EXPANDED");
                }
            }
        }
    }
    if ($view_mode == "marked") {
        $view_query_part = " marked = true AND ";
    }
    if ($view_mode == "has_note") {
        $view_query_part = " (note IS NOT NULL AND note != '') AND ";
    }
    if ($view_mode == "published") {
        $view_query_part = " published = true AND ";
    }
    if ($view_mode == "unread" && $feed != -6) {
        $view_query_part = " unread = true AND ";
        $disable_offsets = !$api_request && get_pref("CDM_AUTO_CATCHUP") && get_pref("CDM_EXPANDED");
    }
    if ($limit > 0) {
        $limit_query_part = "LIMIT " . $limit;
    }
    $allow_archived = false;
    $vfeed_query_part = "";
    /* tags */
    if (!is_numeric($feed)) {
        $query_strategy_part = "true";
        $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE\n\t\t\t\t\tid = feed_id) as feed_title,";
    } else {
        if ($feed > 0) {
            if ($cat_view) {
                if ($feed > 0) {
                    if ($include_children) {
                        # sub-cats
                        $subcats = getChildCategories($feed, $owner_uid);
                        array_push($subcats, $feed);
                        $query_strategy_part = "cat_id IN (" . implode(",", $subcats) . ")";
                    } else {
                        $query_strategy_part = "cat_id = '{$feed}'";
                    }
                } else {
                    $query_strategy_part = "cat_id IS NULL";
                }
                $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
            } else {
                $query_strategy_part = "feed_id = '{$feed}'";
            }
        } else {
            if ($feed == 0 && !$cat_view) {
                // archive virtual feed
                $query_strategy_part = "feed_id IS NULL";
                $allow_archived = true;
            } else {
                if ($feed == 0 && $cat_view) {
                    // uncategorized
                    $query_strategy_part = "cat_id IS NULL AND feed_id IS NOT NULL";
                    $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                } else {
                    if ($feed == -1) {
                        // starred virtual feed
                        $query_strategy_part = "marked = true";
                        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                        $allow_archived = true;
                        if (!$override_order) {
                            $override_order = "last_marked DESC, date_entered DESC, updated DESC";
                        }
                    } else {
                        if ($feed == -2) {
                            // published virtual feed OR labels category
                            if (!$cat_view) {
                                $query_strategy_part = "published = true";
                                $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                $allow_archived = true;
                                if (!$override_order) {
                                    $override_order = "last_published DESC, date_entered DESC, updated DESC";
                                }
                            } else {
                                $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                $ext_tables_part = "ttrss_labels2,ttrss_user_labels2,";
                                $query_strategy_part = "ttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\t\tttrss_user_labels2.article_id = ref_id";
                            }
                        } else {
                            if ($feed == -6) {
                                // recently read
                                $query_strategy_part = "unread = false AND last_read IS NOT NULL";
                                if (DB_TYPE == "pgsql") {
                                    $query_strategy_part .= " AND date_entered > NOW() - INTERVAL '1 DAY' ";
                                } else {
                                    $query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL 1 DAY) ";
                                }
                                $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                $allow_archived = true;
                                $ignore_vfeed_group = true;
                                if (!$override_order) {
                                    $override_order = "last_read DESC";
                                }
                            } else {
                                if ($feed == -3) {
                                    // fresh virtual feed
                                    $query_strategy_part = "unread = true AND score >= 0";
                                    $intl = get_pref("FRESH_ARTICLE_MAX_AGE", $owner_uid);
                                    if (DB_TYPE == "pgsql") {
                                        $query_strategy_part .= " AND date_entered > NOW() - INTERVAL '{$intl} hour' ";
                                    } else {
                                        $query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL {$intl} HOUR) ";
                                    }
                                    $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                } else {
                                    if ($feed == -4) {
                                        // all articles virtual feed
                                        $allow_archived = true;
                                        $query_strategy_part = "true";
                                        $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                    } else {
                                        if ($feed <= LABEL_BASE_INDEX) {
                                            // labels
                                            $label_id = feed_to_label_id($feed);
                                            $query_strategy_part = "label_id = '{$label_id}' AND\n\t\t\t\t\tttrss_labels2.id = ttrss_user_labels2.label_id AND\n\t\t\t\t\tttrss_user_labels2.article_id = ref_id";
                                            $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
                                            $ext_tables_part = "ttrss_labels2,ttrss_user_labels2,";
                                            $allow_archived = true;
                                        } else {
                                            $query_strategy_part = "true";
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    $order_by = "score DESC, date_entered DESC, updated DESC";
    if ($override_order) {
        $order_by = $override_order;
    }
    if ($override_strategy) {
        $query_strategy_part = $override_strategy;
    }
    if ($override_vfeed) {
        $vfeed_query_part = $override_vfeed;
    }
    $feed_title = "";
    if ($search) {
        $feed_title = T_sprintf("Search results: %s", $search);
    } else {
        if ($cat_view) {
            $feed_title = getCategoryTitle($feed);
        } else {
            if (is_numeric($feed) && $feed > 0) {
                $result = db_query("SELECT title,site_url,last_error,last_updated\n\t\t\t\t\t\t\tFROM ttrss_feeds WHERE id = '{$feed}' AND owner_uid = {$owner_uid}");
                $feed_title = db_fetch_result($result, 0, "title");
                $feed_site_url = db_fetch_result($result, 0, "site_url");
                $last_error = db_fetch_result($result, 0, "last_error");
                $last_updated = db_fetch_result($result, 0, "last_updated");
            } else {
                $feed_title = getFeedTitle($feed);
            }
        }
    }
    $content_query_part = "content, ";
    if ($limit_query_part) {
        $offset_query_part = "OFFSET {$offset}";
    } else {
        $offset_query_part = "";
    }
    if (is_numeric($feed)) {
        // proper override_order applied above
        if ($vfeed_query_part && !$ignore_vfeed_group && get_pref('VFEED_GROUP_BY_FEED', $owner_uid)) {
            if (!$override_order) {
                $order_by = "ttrss_feeds.title, {$order_by}";
            } else {
                $order_by = "ttrss_feeds.title, {$override_order}";
            }
        }
        if (!$allow_archived) {
            $from_qpart = "{$ext_tables_part}ttrss_entries LEFT JOIN ttrss_user_entries ON (ref_id = ttrss_entries.id),ttrss_feeds";
            $feed_check_qpart = "ttrss_user_entries.feed_id = ttrss_feeds.id AND";
        } else {
            $from_qpart = "{$ext_tables_part}ttrss_entries LEFT JOIN ttrss_user_entries ON (ref_id = ttrss_entries.id)\n\t\t\t\t\t\tLEFT JOIN ttrss_feeds ON (feed_id = ttrss_feeds.id)";
        }
        if ($vfeed_query_part) {
            $vfeed_query_part .= "favicon_avg_color,";
        }
        if ($start_ts) {
            $start_ts_formatted = date("Y/m/d H:i:s", strtotime($start_ts));
            $start_ts_query_part = "date_entered >= '{$start_ts_formatted}' AND";
        } else {
            $start_ts_query_part = "";
        }
        $first_id = 0;
        $first_id_query_strategy_part = $query_strategy_part;
        if ($feed == -3) {
            $first_id_query_strategy_part = "true";
        }
        if (DB_TYPE == "pgsql") {
            $sanity_interval_qpart = "date_entered >= NOW() - INTERVAL '1 hour' AND";
        } else {
            $sanity_interval_qpart = "date_entered >= DATE_SUB(NOW(), INTERVAL 1 hour) AND";
        }
        if (!$search && !$disable_offsets) {
            // if previous topmost article id changed that means our current pagination is no longer valid
            $query = "SELECT DISTINCT\n\t\t\t\t\t\t\tttrss_feeds.title,\n\t\t\t\t\t\t\tdate_entered,\n\t\t\t\t\t\t\tguid,\n\t\t\t\t\t\t\tttrss_entries.id,\n\t\t\t\t\t\t\tttrss_entries.title,\n\t\t\t\t\t\t\tupdated,\n\t\t\t\t\t\t\tscore,\n\t\t\t\t\t\t\tmarked,\n\t\t\t\t\t\t\tpublished,\n\t\t\t\t\t\t\tlast_marked,\n\t\t\t\t\t\t\tlast_published,\n\t\t\t\t\t\t\tlast_read\n\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t{$from_qpart}\n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t{$feed_check_qpart}\n\t\t\t\t\t\tttrss_user_entries.owner_uid = '{$owner_uid}' AND\n\t\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t\t{$start_ts_query_part}\n\t\t\t\t\t\t{$since_id_part}\n\t\t\t\t\t\t{$sanity_interval_qpart}\n\t\t\t\t\t\t{$first_id_query_strategy_part} ORDER BY {$order_by} LIMIT 1";
            if ($_REQUEST["debug"]) {
                print $query;
            }
            $result = db_query($query);
            if ($result && db_num_rows($result) > 0) {
                $first_id = (int) db_fetch_result($result, 0, "id");
                if ($offset > 0 && $first_id && $check_first_id && $first_id != $check_first_id) {
                    return array(-1, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words, $first_id);
                }
            }
        }
        if ($disable_offsets) {
            $offset_query_part = "";
        }
        $query = "SELECT DISTINCT\n\t\t\t\t\t\tdate_entered,\n\t\t\t\t\t\tguid,\n\t\t\t\t\t\tttrss_entries.id,ttrss_entries.title,\n\t\t\t\t\t\tupdated,\n\t\t\t\t\t\tlabel_cache,\n\t\t\t\t\t\ttag_cache,\n\t\t\t\t\t\talways_display_enclosures,\n\t\t\t\t\t\tsite_url,\n\t\t\t\t\t\tnote,\n\t\t\t\t\t\tnum_comments,\n\t\t\t\t\t\tcomments,\n\t\t\t\t\t\tint_id,\n\t\t\t\t\t\tuuid,\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\thide_images,\n\t\t\t\t\t\tunread,feed_id,marked,published,link,last_read,orig_feed_id,\n\t\t\t\t\t\tlast_marked, last_published,\n\t\t\t\t\t\t{$vfeed_query_part}\n\t\t\t\t\t\t{$content_query_part}\n\t\t\t\t\t\tauthor,score\n\t\t\t\t\tFROM\n\t\t\t\t\t\t{$from_qpart}\n\t\t\t\t\tWHERE\n\t\t\t\t\t{$feed_check_qpart}\n\t\t\t\t\tttrss_user_entries.owner_uid = '{$owner_uid}' AND\n\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t{$start_ts_query_part}\n\t\t\t\t\t{$view_query_part}\n\t\t\t\t\t{$since_id_part}\n\t\t\t\t\t{$query_strategy_part} ORDER BY {$order_by}\n\t\t\t\t\t{$limit_query_part} {$offset_query_part}";
        if ($_REQUEST["debug"]) {
            print $query;
        }
        $result = db_query($query);
    } else {
        // browsing by tag
        $query = "SELECT DISTINCT\n\t\t\t\t\t\t\tdate_entered,\n\t\t\t\t\t\t\tguid,\n\t\t\t\t\t\t\tnote,\n\t\t\t\t\t\t\tttrss_entries.id as id,\n\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\tupdated,\n\t\t\t\t\t\t\tunread,\n\t\t\t\t\t\t\tfeed_id,\n\t\t\t\t\t\t\torig_feed_id,\n\t\t\t\t\t\t\tmarked,\n\t\t\t\t\t\t\tnum_comments,\n\t\t\t\t\t\t\tcomments,\n\t\t\t\t\t\t\ttag_cache,\n\t\t\t\t\t\t\tlabel_cache,\n\t\t\t\t\t\t\tlink,\n\t\t\t\t\t\t\tlang,\n\t\t\t\t\t\t\tuuid,\n\t\t\t\t\t\t\tlast_read,\n\t\t\t\t\t\t\t(SELECT hide_images FROM ttrss_feeds WHERE id = feed_id) AS hide_images,\n\t\t\t\t\t\t\tlast_marked, last_published,\n\t\t\t\t\t\t\t{$since_id_part}\n\t\t\t\t\t\t\t{$vfeed_query_part}\n\t\t\t\t\t\t\t{$content_query_part}\n\t\t\t\t\t\t\tauthor, score\n\t\t\t\t\t\tFROM ttrss_entries, ttrss_user_entries, ttrss_tags\n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\tref_id = ttrss_entries.id AND\n\t\t\t\t\t\t\tttrss_user_entries.owner_uid = {$owner_uid} AND\n\t\t\t\t\t\t\tpost_int_id = int_id AND\n\t\t\t\t\t\t\ttag_name = '{$feed}' AND\n\t\t\t\t\t\t\t{$view_query_part}\n\t\t\t\t\t\t\t{$search_query_part}\n\t\t\t\t\t\t\t{$query_strategy_part} ORDER BY {$order_by}\n\t\t\t\t\t\t\t{$limit_query_part} {$offset_query_part}";
        if ($_REQUEST["debug"]) {
            print $query;
        }
        $result = db_query($query);
    }
    return array($result, $feed_title, $feed_site_url, $last_error, $last_updated, $search_words, $first_id);
}
Exemplo n.º 14
0
function render_search_form($link, $active_feed_id = false, $is_cat = false)
{
    print "<div id=\"heading\">";
    print __("Search") . " <span id=\"headingAddon\">\n\t\t\t\t(<a href=\"index.php\">" . __("Go back") . "</a>)</span></div>";
    print "<form method=\"GET\" action=\"index.php\" class=\"searchForm\">";
    print "<input type=\"hidden\" name=\"go\" value=\"vf\">";
    print "<input type=\"hidden\" name=\"id\" value=\"{$active_feed_id}\">";
    print "<input type=\"hidden\" name=\"cat\" value=\"{$is_cat}\">";
    print "<table><tr><td>" . __('Search:') . "</td><td>";
    print "<input name=\"query\"></td></tr>";
    print "<tr><td>" . __('Where:') . "</td><td>";
    print "<select name=\"search_mode\">\n\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>";
    $feed_title = getFeedTitle($link, $active_feed_id);
    if (!$is_cat) {
        $feed_cat_title = getFeedCatTitle($link, $active_feed_id);
    } else {
        $feed_cat_title = getCategoryTitle($link, $active_feed_id);
    }
    if ($active_feed_id && !$is_cat) {
        print "<option selected value=\"this_feed\">{$feed_title}</option>";
    } else {
        print "<option disabled>" . __('This feed') . "</option>";
    }
    if ($is_cat) {
        $cat_preselected = "selected";
    }
    if (get_pref($link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) {
        print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>";
    } else {
        //print "<option disabled>".__('This category')."</option>";
    }
    print "</select></td></tr>";
    print "<tr><td>" . __('Match on:') . "</td><td>";
    $search_fields = array("title" => __("Title"), "content" => __("Content"), "both" => __("Title or content"));
    print_select_hash("match_on", 3, $search_fields);
    print "</td></tr></table>";
    print "<input type=\"submit\" value=\"" . __('Search') . "\">";
    print "</form>";
    print "</div>";
}
Exemplo n.º 15
0
 /**
  * load an question from DB
  *
  * @author Sebastien Piraux <*****@*****.**>
  * @param integer $id id of question
  * @return boolean load successfull ?
  */
 public function load($id)
 {
     $sql = "SELECT\n                    `id`,\n                    `title`,\n                    `description`,\n                    `attachment`,\n                    `type`,\n                    `grade`,\n                    `id_category`\n            FROM `" . $this->tblQuestion . "`\n            WHERE `id` = " . (int) $id;
     $data = claro_sql_query_get_single_row($sql);
     if (!empty($data)) {
         // from query
         $this->id = (int) $data['id'];
         $this->title = $data['title'];
         $this->description = $data['description'];
         $this->attachment = $data['attachment'];
         $this->type = $data['type'];
         $this->grade = $data['grade'];
         $this->categoryId = $data['id_category'];
         $this->categoryTitle = getCategoryTitle($this->categoryId);
         // create answer object
         $this->setAnswer();
         if (!is_null($this->answer)) {
             $this->answer->load();
         }
         $this->buildDirPaths();
         return true;
     } else {
         return false;
     }
 }
Exemplo n.º 16
0
 function search()
 {
     $this->params = explode(":", $this->dbh->escape_string($_REQUEST["param"]), 2);
     $active_feed_id = sprintf("%d", $this->params[0]);
     $is_cat = $this->params[1] != "false";
     print "<div class=\"dlgSec\">" . __('Look for') . "</div>";
     print "<div class=\"dlgSecCont\">";
     print "<input dojoType=\"dijit.form.ValidationTextBox\"\n\t\t\tstyle=\"font-size : 16px; width : 20em;\"\n\t\t\trequired=\"1\" name=\"query\" type=\"search\" value=''>";
     print "<hr/>" . __('Limit search to:') . " ";
     print "<select name=\"search_mode\" dojoType=\"dijit.form.Select\">\n\t\t\t<option value=\"all_feeds\">" . __('All feeds') . "</option>";
     $feed_title = getFeedTitle($active_feed_id);
     if (!$is_cat) {
         $feed_cat_title = getFeedCatTitle($active_feed_id);
     } else {
         $feed_cat_title = getCategoryTitle($active_feed_id);
     }
     if ($active_feed_id && !$is_cat) {
         print "<option selected=\"1\" value=\"this_feed\">{$feed_title}</option>";
     } else {
         print "<option disabled=\"1\" value=\"false\">" . __('This feed') . "</option>";
     }
     if ($is_cat) {
         $cat_preselected = "selected=\"1\"";
     }
     if (get_pref('ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) {
         print "<option {$cat_preselected} value=\"this_cat\">{$feed_cat_title}</option>";
     } else {
         //print "<option disabled>".__('This category')."</option>";
     }
     print "</select>";
     print "</div>";
     print "<div class=\"dlgButtons\">";
     if (count(PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEARCH)) == 0) {
         print "<div style=\"float : left\">\n\t\t\t\t<a class=\"visibleLink\" target=\"_blank\" href=\"http://tt-rss.org/wiki/SearchSyntax\">" . __("Search syntax") . "</a>\n\t\t\t\t</div>";
     }
     print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').execute()\">" . __('Search') . "</button>\n\t\t<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').hide()\">" . __('Cancel') . "</button>\n\t\t</div>";
 }
Exemplo n.º 17
0
    <?php 
$questionIterator = 0;
foreach ($this->questionList as $question) {
    $questionIterator++;
    ?>
        <tr>
            <td align="center"><?php 
    echo $question['id'];
    ?>
</td>
            <td><?php 
    echo $question['title'];
    ?>
</td>
            <td><?php 
    echo getCategoryTitle($question['id_category']);
    ?>
</td>
            <td><small><?php 
    echo $this->localizedQuestionType[$question['type']];
    ?>
</small></td>
            <?php 
    if ('reuse' == $this->context) {
        ?>
                <td align="center">
                    <a href="<?php 
        echo claro_htmlspecialchars(Url::Contextualize('question_pool.php?exId=' . $this->exId . '&amp;cmd=rqUse&amp;quId=' . $question['id']));
        ?>
">
                        <img src="<?php 
function render_article($link, $id, $feed_id, $cat_id, $is_cat)
{
    $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"]);
        $updated_fmt = make_local_datetime($link, $line['updated'], false);
        $title = $line["title"];
        $article_link = $line["link"];
        if (!$is_cat) {
            $feed_title = getFeedTitle($link, $feed_id);
        } else {
            $feed_title = getCategoryTitle($link, $feed_id);
        }
        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}&is_cat={$is_cat}'>";
        if ($line['feed_id'] != $feed_id) {
            $real_feed_title = getFeedTitle($link, $line['feed_id']);
            $real_feed_id = $line['feed_id'];
            $feed_link = "(<a href=\"feed.php?id={$real_feed_id}\">{$real_feed_title}</a>)";
        }
        //			print "<fieldset>";
        print "<div style='float : right'>({$updated_fmt})</div>";
        print "<h2><a target='_blank' href='{$article_link}'>{$title}</a> {$feed_link}</h2>";
        print "<hr>";
        /*			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 type='text' enabled='false' name='updated' disabled value='$updated_fmt'/>";
        //print "</div>";
        //			print "</fieldset>";
        $content = sanitize($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 "<div class='nav'>\n                    <label>Navigation</label>\n                    <div class='button left' onclick='goPrev({$id}, {$feed_id}, this)'>Prev</div>\n                    <div class='button right' onclick='goNext({$id}, {$feed_id}, this)'>Next</div>\n                  </div>";
        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 "<div class=\"row\">\n\t                <label>Unread</label>\n\t                <div class=\"toggle\" onclick=\"toggleUnread({$id}, this)\" toggled=\"{$is_unread}\"><span class=\"thumb\"></span><span class=\"toggleOn\">ON</span><span class=\"toggleOff\">OFF</span></div>\n\t            </div>";
        print "</fieldset>";
        print "</div>";
    }
}
Exemplo n.º 19
0
function getFeedTitle($id, $cat = false)
{
    if ($cat) {
        return getCategoryTitle($id);
    } else {
        if ($id == -1) {
            return __("Starred articles");
        } else {
            if ($id == -2) {
                return __("Published articles");
            } else {
                if ($id == -3) {
                    return __("Fresh articles");
                } else {
                    if ($id == -4) {
                        return __("All articles");
                    } else {
                        if ($id === 0 || $id === "0") {
                            return __("Archived articles");
                        } else {
                            if ($id == -6) {
                                return __("Recently read");
                            } else {
                                if ($id < LABEL_BASE_INDEX) {
                                    $label_id = feed_to_label_id($id);
                                    $result = db_query("SELECT caption FROM ttrss_labels2 WHERE id = '{$label_id}'");
                                    if (db_num_rows($result) == 1) {
                                        return db_fetch_result($result, 0, "caption");
                                    } else {
                                        return "Unknown label ({$label_id})";
                                    }
                                } else {
                                    if (is_numeric($id) && $id > 0) {
                                        $result = db_query("SELECT title FROM ttrss_feeds WHERE id = '{$id}'");
                                        if (db_num_rows($result) == 1) {
                                            return db_fetch_result($result, 0, "title");
                                        } else {
                                            return "Unknown feed ({$id})";
                                        }
                                    } else {
                                        return $id;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
Exemplo n.º 20
0
 function getCategories()
 {
     $unread_only = (bool) db_escape_string($_REQUEST["unread_only"]);
     $enable_nested = (bool) db_escape_string($_REQUEST["enable_nested"]);
     // TODO do not return empty categories, return Uncategorized and standard virtual cats
     if ($enable_nested) {
         $nested_qpart = "parent_cat IS NULL";
     } else {
         $nested_qpart = "true";
     }
     $result = db_query($this->link, "SELECT\n\t\t\t\tid, title, order_id FROM ttrss_feed_categories\n\t\t\tWHERE {$nested_qpart} AND owner_uid = " . $_SESSION["uid"]);
     $cats = array();
     while ($line = db_fetch_assoc($result)) {
         $unread = getFeedUnread($this->link, $line["id"], true);
         if ($enable_nested) {
             $unread += getCategoryChildrenUnread($this->link, $line["id"]);
         }
         if ($unread || !$unread_only) {
             array_push($cats, array("id" => $line["id"], "title" => $line["title"], "unread" => $unread, "order_id" => (int) $line["order_id"]));
         }
     }
     foreach (array(-2, -1, 0) as $cat_id) {
         $unread = getFeedUnread($this->link, $cat_id, true);
         if ($unread || !$unread_only) {
             array_push($cats, array("id" => $cat_id, "title" => getCategoryTitle($this->link, $cat_id), "unread" => $unread));
         }
     }
     print $this->wrap(self::STATUS_OK, $cats);
 }
Exemplo n.º 21
0
function render_headlines_list($link, $feed_id, $cat_id, $offset, $search)
{
    $feed_id = $feed_id;
    $limit = 15;
    $filter = '';
    $is_cat = false;
    $view_mode = 'adaptive';
    if ($search) {
        $search_mode = 'this_feed';
        $match_on = 'both';
    } else {
        $search_mode = '';
        $match_on = '';
    }
    $qfh_ret = queryFeedHeadlines($link, $feed_id, $limit, $view_mode, $is_cat, $search, $search_mode, $match_on, false, $offset);
    $result = $qfh_ret[0];
    $feed_title = $qfh_ret[1];
    if (!$offset) {
        print "<form id=\"searchForm-{$feed_id}-{$cat_id}\" class=\"dialog\" method=\"POST\" \n\t\t\t\taction=\"feed.php\">\n\n\t\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$feed_id}\">\n\t\t\t\t<input type=\"hidden\" name=\"cat\" value=\"{$cat_id}\">\n\n\t        <fieldset>\n\t\t\t  <h1>Search</h1>\n\t            <a class=\"button leftButton\" type=\"cancel\">Cancel</a>\n\t            <a class=\"button blueButton\" type=\"submit\">Search</a>\n\n\t            <label>Search:</label>\n\t\t\t\t\t<input id=\"search\" type=\"text\" name=\"search\"/>\n\t        </fieldset>\n\t\t\t  </form>";
        if ($cat_id) {
            $cat_title = getCategoryTitle($link, $cat_id);
            print "<ul id=\"feed-{$feed_id}\" title=\"{$feed_title}\" selected=\"true\"\n\t\t\t\t\tmyBackLabel='{$cat_title}' myBackHref='cat.php?id={$cat_id}'>";
        } else {
            print "<ul id=\"feed-{$feed_id}\" title=\"{$feed_title}\" selected=\"true\"\n\t\t\t\t\tmyBackLabel='" . __("Home") . "' myBackHref='home.php'>";
        }
        print "<li><a href='#searchForm-{$feed_id}-{$cat_id}'>Search...</a></li>";
    }
    $num_headlines = 0;
    while ($line = db_fetch_assoc($result)) {
        $id = $line["id"];
        $real_feed_id = $line["feed_id"];
        if (sql_bool_to_bool($line["unread"])) {
            $class = '';
        } else {
            $class = 'oldItem';
        }
        if (mobile_feed_has_icon($real_feed_id)) {
            $icon_url = "../" . ICONS_URL . "/{$real_feed_id}.ico";
        } else {
            $icon_url = "../images/blank_icon.gif";
        }
        print "<li class='{$class}'><a href='article.php?id={$id}&feed={$feed_id}&cat={$cat_id}'>\n\t\t\t\t<img class='tinyIcon' src='{$icon_url}'>";
        print $line["title"];
        print "</a></li>";
        ++$num_headlines;
    }
    if ($num_headlines == 0 && $search) {
        $articles_url = "feed.php?id={$feed_id}&cat={$cat_id}&skip={$next_offset}";
        print "<li><a href=\"{$articles_url}\">" . __("Nothing found (click to reload feed).") . "</a></li>";
    }
    //		print "<a target='_replace' href='feed.php?id=$feed_id&cat=$cat_id&skip=0'>Next $limit articles...</a>";
    $next_offset = $offset + $num_headlines;
    $num_unread = getFeedUnread($link, $feed_id, $is_cat);
    /* FIXME needs normal implementation */
    if ($num_headlines > 0 && ($num_unread == 0 || $num_unread > $next_offset)) {
        $articles_url = "feed.php?id={$feed_id}&cat={$cat_id}&skip={$next_offset}" . "&search={$search}";
        print "<li><a href=\"{$articles_url}\" \n\t\t\t\ttarget=\"_replace\">Get more articles...</a></li>";
    }
    if (!$offset) {
        print "</ul>";
    }
}
    ?>
				<?php 
    if ($category && $post->category() != "") {
        ?>
						in <?php 
        $count = 0;
        foreach ($post->category()->split() as $cat) {
            if ($count > 0) {
                echo ', ';
            }
            ?>
<a href="<?php 
            echo getCategoryURL($cat);
            ?>
"><?php 
            echo getCategoryTitle($cat);
            ?>
</a><?php 
            $count++;
        }
        ?>
	
				<?php 
    }
    ?>
			</div>
		<?php 
}
?>

		<?php