]> git.wh0rd.org Git - tt-rss.git/blob - backend.php
search dialog improvements, main toolbar overhaul
[tt-rss.git] / backend.php
1 <?
2         require_once "sessions.php";
3         require_once "backend-rpc.php";
4         
5         header("Cache-Control: no-cache, must-revalidate");
6         header("Pragma: no-cache");
7         header("Expires: -1");
8         
9 /*      if ($_GET["debug"]) {
10                 define('DEFAULT_ERROR_LEVEL', E_ALL);
11         } else {
12                 define('DEFAULT_ERROR_LEVEL', E_ERROR | E_WARNING | E_PARSE);
13         }
14         
15         error_reporting(DEFAULT_ERROR_LEVEL); */
16
17         $op = $_REQUEST["op"];
18
19         define('SCHEMA_VERSION', 8);
20
21         require_once "sanity_check.php";
22         require_once "config.php";
23         
24         require_once "db.php";
25         require_once "db-prefs.php";
26         require_once "functions.php";
27         require_once "magpierss/rss_fetch.inc";
28
29         $err_msg = check_configuration_variables();
30
31         if ($err_msg) {
32                 header("Content-Type: application/xml");
33                 print_error_xml(9, $err_msg); die;
34         }
35
36         if ((!$op || $op == "rpc" || $op == "globalUpdateFeeds") && !$_REQUEST["noxml"]) {
37                 header("Content-Type: application/xml");
38         }
39
40         if (!$_SESSION["uid"] && $op != "globalUpdateFeeds") {
41
42                 if ($op == "rpc") {
43                         print_error_xml(6); die;
44                 } else {
45                         print "
46                         <html><body>
47                                 <p>Error: Not logged in.</p>
48                                 <script type=\"text/javascript\">
49                                         if (parent.window != 'undefined') {
50                                                 parent.window.location = \"login.php\";         
51                                         } else {
52                                                 window.location = \"login.php\";
53                                         }
54                                 </script>
55                         </body></html>
56                         ";
57                 }
58                 exit;
59         }
60
61         if (!$op) {
62                 print_error_xml(7); exit;
63         }
64
65         $purge_intervals = array(
66                 0  => "Use default",
67                 -1 => "Never purge",
68                 5  => "1 week old",
69                 14 => "2 weeks old",
70                 31 => "1 month old",
71                 60 => "2 months old",
72                 90 => "3 months old");
73
74         $update_intervals = array(
75                 0   => "Use default",
76                 -1  => "Disable updates",
77                 30  => "Each 30 minutes",
78                 60  => "Hourly",
79                 240 => "Each 4 hours",
80                 720 => "Each 12 hours",
81                 1440 => "Daily",
82                 10080 => "Weekly");
83
84         $access_level_names = array(
85                 0 => "User", 
86                 10 => "Administrator");
87
88         $script_started = getmicrotime();
89
90         $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); 
91
92         if (!$link) {
93                 if (DB_TYPE == "mysql") {
94                         print mysql_error();
95                 }
96                 // PG seems to display its own errors just fine by default.             
97                 return;
98         }
99
100         if (DB_TYPE == "pgsql") {
101                 pg_query("set client_encoding = 'utf-8'");
102         }
103
104         if ($_SESSION["uid"]) {
105                 if (get_pref($link, "HIDE_READ_FEEDS") == "true") {
106                         setcookie("ttrss_vf_hreadf", 1);
107                 } else {
108                         setcookie("ttrss_vf_hreadf", 0);
109                 }  
110
111                 setcookie('ttrss_vf_refresh', FEEDS_FRAME_REFRESH);
112                 setcookie('ttrss_vf_daemon', ENABLE_UPDATE_DAEMON);
113
114                 if (get_pref($link, "ON_CATCHUP_SHOW_NEXT_FEED")) {             
115                         setcookie('ttrss_vf_catchupnext', 1);
116                 } else {
117                         setcookie('ttrss_vf_catchupnext', 0);
118                 }               
119         }
120
121         $fetch = $_GET["fetch"];
122
123 //      setcookie("ttrss_icons_url", ICONS_URL);
124
125         if (!sanity_check($link)) { return; }
126
127         function outputFeedList($link, $tags = false) {
128
129                 print "<html><head>
130                         <title>Tiny Tiny RSS : Feedlist</title>
131                         <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">";
132
133                 $user_theme = $_SESSION["theme"];
134                 if ($user_theme) { 
135                         print "<link rel=\"stylesheet\" type=\"text/css\" 
136                                 href=\"themes/$user_theme/theme.css\">";
137                 }
138
139                 if (get_pref($link, 'USE_COMPACT_STYLESHEET')) {
140                         print "<link rel=\"stylesheet\" type=\"text/css\" 
141                                 href=\"tt-rss_compact.css\"/>";
142                 } else {
143                         print "<link title=\"Compact Stylesheet\" rel=\"alternate stylesheet\" 
144                                         type=\"text/css\" href=\"tt-rss_compact.css\"/>";
145                 }
146
147                 $script_dt_add = get_script_dt_add();
148
149                 print "
150                         <script type=\"text/javascript\" src=\"prototype.js\"></script>
151                         <script type=\"text/javascript\" src=\"functions.js?$script_dt_add\"></script>
152                         <script type=\"text/javascript\" src=\"feedlist.js?$script_dt_add\"></script>
153                         <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
154                         <!--[if gte IE 5.5000]>
155                         <script type=\"text/javascript\" src=\"pngfix.js\"></script>
156                         <link rel=\"stylesheet\" type=\"text/css\" href=\"tt-rss-ie.css\">
157                         <![endif]-->
158                         </head><body>
159                         <script type=\"text/javascript\">
160                                 if (document.addEventListener) {
161                                         document.addEventListener(\"DOMContentLoaded\", init, null);
162                                 }
163                                 window.onload = init;
164                         </script>";
165
166                 print "<ul class=\"feedList\" id=\"feedList\">\n";
167
168                 $owner_uid = $_SESSION["uid"];
169
170                 if (!$tags) {
171
172                         /* virtual feeds */
173
174                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
175                                 print "<li class=\"feedCat\">Special</li>";
176                                 print "<li id=\"feedCatHolder\"><ul class=\"feedCatList\">";
177                         }
178
179                         $result = db_query($link, "SELECT count(id) as num_starred 
180                                 FROM ttrss_entries,ttrss_user_entries 
181                                 WHERE marked = true AND 
182                                 ttrss_user_entries.ref_id = ttrss_entries.id AND
183                                 unread = true AND owner_uid = '$owner_uid'");
184                         $num_starred = db_fetch_result($result, 0, "num_starred");
185
186                         $class = "virt";
187
188                         if ($num_starred > 0) $class .= "Unread";
189
190                         printFeedEntry(-1, $class, "Starred articles", $num_starred, 
191                                 "images/mark_set.png", $link);
192
193                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
194                                 print "</ul>\n";
195                         }
196
197                         if (GLOBAL_ENABLE_LABELS && get_pref($link, 'ENABLE_LABELS')) {
198         
199                                 $result = db_query($link, "SELECT id,sql_exp,description FROM
200                                         ttrss_labels WHERE owner_uid = '$owner_uid' ORDER by description");
201                 
202                                 if (db_num_rows($result) > 0) {
203                                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
204                                                 print "<li class=\"feedCat\">Labels</li>";
205                                                 print "<li id=\"feedCatHolder\"><ul class=\"feedCatList\">";
206                                         } else {
207                                                 print "<li><hr></li>";
208                                         }
209                                 }
210                 
211                                 while ($line = db_fetch_assoc($result)) {
212         
213                                         error_reporting (0);
214                 
215                                         $tmp_result = db_query($link, "SELECT count(id) as count 
216                                                 FROM ttrss_entries,ttrss_user_entries
217                                                 WHERE (" . $line["sql_exp"] . ") AND unread = true AND
218                                                 ttrss_user_entries.ref_id = ttrss_entries.id
219                                                 AND owner_uid = '$owner_uid'");
220         
221                                         $count = db_fetch_result($tmp_result, 0, "count");
222         
223                                         $class = "label";
224         
225                                         if ($count > 0) {
226                                                 $class .= "Unread";
227                                         }
228                                         
229                                         error_reporting (DEFAULT_ERROR_LEVEL);
230         
231                                         printFeedEntry(-$line["id"]-11, 
232                                                 $class, $line["description"], $count, "images/label.png", $link);
233                 
234                                 }
235
236                                 if (db_num_rows($result) > 0) {
237                                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
238                                                 print "</ul>";
239                                         }
240                                 }
241
242                         }
243
244 //                      if (!get_pref($link, 'ENABLE_FEED_CATS')) {
245                                 print "<li><hr></li>";
246 //                      }
247
248                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
249                                 $order_by_qpart = "category,title";
250                         } else {
251                                 $order_by_qpart = "title";
252                         }
253
254                         $result = db_query($link, "SELECT ttrss_feeds.*,
255                                 SUBSTRING(last_updated,1,19) AS last_updated_noms,
256                                 (SELECT COUNT(id) FROM ttrss_entries,ttrss_user_entries
257                                         WHERE feed_id = ttrss_feeds.id AND 
258                                         ttrss_user_entries.ref_id = ttrss_entries.id AND
259                                         owner_uid = '$owner_uid') AS total,
260                                 (SELECT COUNT(id) FROM ttrss_entries,ttrss_user_entries
261                                         WHERE feed_id = ttrss_feeds.id AND unread = true
262                                                 AND ttrss_user_entries.ref_id = ttrss_entries.id
263                                                 AND owner_uid = '$owner_uid') as unread,
264                                 cat_id,last_error,
265                                 ttrss_feed_categories.title AS category,
266                                 ttrss_feed_categories.collapsed 
267                                 FROM ttrss_feeds LEFT JOIN ttrss_feed_categories 
268                                         ON (ttrss_feed_categories.id = cat_id)                          
269                                 WHERE 
270                                         ttrss_feeds.owner_uid = '$owner_uid' AND parent_feed IS NULL
271                                 ORDER BY $order_by_qpart"); 
272
273                         $actid = $_GET["actid"];
274         
275                         /* real feeds */
276         
277                         $lnum = 0;
278         
279                         $total_unread = 0;
280
281                         $category = "";
282
283                         $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
284         
285                         while ($line = db_fetch_assoc($result)) {
286                         
287                                 $feed = db_unescape_string($line["title"]);
288                                 $feed_id = $line["id"];   
289         
290                                 $subop = $_GET["subop"];
291                                 
292                                 $total = $line["total"];
293                                 $unread = $line["unread"];
294
295                                 if (get_pref($link, 'HEADLINES_SMART_DATE')) {
296                                         $last_updated = smart_date_time(strtotime($line["last_updated_noms"]));
297                                 } else {
298                                         $last_updated = date($short_date, strtotime($line["last_updated_noms"]));
299                                 }
300
301                                 $rtl_content = sql_bool_to_bool($line["rtl_content"]);
302
303                                 if ($rtl_content) {
304                                         $rtl_tag = "dir=\"RTL\"";
305                                 } else {
306                                         $rtl_tag = "";
307                                 }
308
309                                 $tmp_result = db_query($link,
310                                         "SELECT id,COUNT(unread) AS unread
311                                         FROM ttrss_feeds LEFT JOIN ttrss_user_entries 
312                                                 ON (ttrss_feeds.id = ttrss_user_entries.feed_id) 
313                                         WHERE parent_feed = '$feed_id' AND unread = true 
314                                         GROUP BY ttrss_feeds.id");
315                         
316                                 if (db_num_rows($tmp_result) > 0) {                             
317                                         while ($l = db_fetch_assoc($tmp_result)) {
318                                                 $unread += $l["unread"];
319                                         }
320                                 }
321
322                                 $cat_id = $line["cat_id"];
323
324                                 $tmp_category = $line["category"];
325
326                                 if (!$tmp_category) {
327                                         $tmp_category = "Uncategorized";
328                                 }
329                                 
330         //                      $class = ($lnum % 2) ? "even" : "odd";
331
332                                 if ($line["last_error"]) {
333                                         $class = "error";
334                                 } else {
335                                         $class = "feed";
336                                 }
337         
338                                 if ($unread > 0) $class .= "Unread";
339         
340                                 if ($actid == $feed_id) {
341                                         $class .= "Selected";
342                                 }
343         
344                                 $total_unread += $unread;
345
346                                 if ($category != $tmp_category && get_pref($link, 'ENABLE_FEED_CATS')) {
347                                 
348                                         if ($category) {
349                                                 print "</ul></li>";
350                                         }
351                                 
352                                         $category = $tmp_category;
353
354                                         $collapsed = $line["collapsed"];
355
356                                         // workaround for NULL category
357                                         if ($category == "Uncategorized") {
358                                                 if ($_COOKIE["ttrss_vf_uclps"] == 1) {
359                                                         $collapsed = "t";
360                                                 }
361                                         }
362
363                                         if ($collapsed == "t" || $collapsed == "1") {
364                                                 $holder_class = "invisible";
365                                                 $ellipsis = "...";
366                                         } else {
367                                                 $holder_class = "";
368                                                 $ellipsis = "";
369                                         }
370
371                                         if ($cat_id) {
372                                                 $cat_id_qpart = "cat_id = '$cat_id'";
373                                         } else {
374                                                 $cat_id_qpart = "cat_id IS NULL";
375                                         }
376
377                                         $tmp_result = db_query($link, "SELECT count(int_id) AS unread
378                                                 FROM ttrss_user_entries,ttrss_feeds WHERE
379                                                         unread = true AND
380                                                         feed_id = ttrss_feeds.id AND $cat_id_qpart AND
381                                                         ttrss_user_entries.owner_uid = " . $_SESSION["uid"]);
382
383                                         $cat_unread = db_fetch_result($tmp_result, 0, "unread");
384
385                                         $cat_id = sprintf("%d", $cat_id);
386                                         
387                                         print "<li class=\"feedCat\" id=\"FCAT-$cat_id\">
388                                                 <a href=\"javascript:toggleCollapseCat($cat_id)\">$tmp_category</a>
389                                                         <a href=\"javascript:viewCategory($cat_id)\" id=\"FCAP-$cat_id\">
390                                                         <span id=\"FCATCTR-$cat_id\" 
391                                                         class=\"$catctr_class\">($cat_unread unread)$ellipsis</span>
392                                                         </a></li>";
393
394                                         // !!! NO SPACE before <ul...feedCatList - breaks firstChild DOM function
395                                         // -> keyboard navigation, etc.
396                                         print "<li id=\"feedCatHolder\" class=\"$holder_class\"><ul class=\"feedCatList\" id=\"FCATLIST-$cat_id\">";
397                                 }
398         
399                                 printFeedEntry($feed_id, $class, $feed, $unread, 
400                                         "icons/$feed_id.ico", $link, $rtl_content, 
401                                         $last_updated, $line["last_error"]);
402         
403                                 ++$lnum;
404                         }
405
406                 } else {
407
408                         // tags
409
410 /*                      $result = db_query($link, "SELECT tag_name,count(ttrss_entries.id) AS count
411                                 FROM ttrss_tags,ttrss_entries,ttrss_user_entries WHERE
412                                 post_int_id = ttrss_user_entries.int_id AND 
413                                 unread = true AND ref_id = ttrss_entries.id
414                                 AND ttrss_tags.owner_uid = '$owner_uid' GROUP BY tag_name       
415                         UNION
416                                 select tag_name,0 as count FROM ttrss_tags WHERE owner_uid = '$owner_uid'
417                         ORDER BY tag_name"); */
418
419                         $result = db_query($link, "SELECT tag_name,SUM((SELECT COUNT(int_id) 
420                                 FROM ttrss_user_entries WHERE int_id = post_int_id 
421                                         AND unread = true)) AS count FROM ttrss_tags 
422                                 WHERE owner_uid = 2 GROUP BY tag_name ORDER BY tag_name");
423
424                         $tags = array();
425         
426                         while ($line = db_fetch_assoc($result)) {
427                                 $tags[$line["tag_name"]] += $line["count"];
428                         }
429         
430                         foreach (array_keys($tags) as $tag) {
431         
432                                 $unread = $tags[$tag];
433         
434                                 $class = "tag";
435         
436                                 if ($unread > 0) {
437                                         $class .= "Unread";
438                                 }
439         
440                                 printFeedEntry($tag, $class, $tag, $unread, "images/tag.png", $link);
441         
442                         } 
443
444                 }
445
446                 if (db_num_rows($result) == 0) {
447                         if ($tags) {
448                                 $what = "tags";
449                         } else {
450                                 $what = "feeds";
451                         }
452                         print "<li>No $what to display.</li>";
453                 }
454
455                 print "</ul>";
456
457                 print '
458                         <script type="text/javascript">
459                                 /* for IE */
460                                 function statechange() {
461                                         if (document.readyState == "interactive") init();
462                                 }
463                         
464                                 if (document.readyState) {      
465                                         if (document.readyState == "interactive" || document.readyState == "complete") {
466                                                 init();
467                                         } else {
468                                                 document.onreadystatechange = statechange;
469                                         }
470                                 }
471                         </script></body></html>';
472         }
473
474
475         if ($op == "rpc") {
476                 handle_rpc_request($link);
477         }
478         
479         if ($op == "feeds") {
480
481                 $tags = $_GET["tags"];
482
483                 $subop = $_GET["subop"];
484
485                 if ($subop == "catchupAll") {
486                         db_query($link, "UPDATE ttrss_user_entries SET 
487                                 last_read = NOW(),unread = false WHERE owner_uid = " . $_SESSION["uid"]);
488                 }
489
490                 if ($subop == "collapse") {
491                         $cat_id = db_escape_string($_GET["cid"]);
492
493                         db_query($link, "UPDATE ttrss_feed_categories SET
494                                 collapsed = NOT collapsed WHERE id = '$cat_id' AND owner_uid = " . 
495                                 $_SESSION["uid"]);
496                         return;
497                 }
498
499                 outputFeedList($link, $tags);
500
501         }
502
503         if ($op == "view") {
504
505                 $id = db_escape_string($_GET["id"]);
506                 $feed_id = db_escape_string($_GET["feed"]);
507
508                 $result = db_query($link, "SELECT rtl_content FROM ttrss_feeds
509                         WHERE id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]);
510
511                 if (db_num_rows($result) == 1) {
512                         $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
513                 } else {
514                         $rtl_content = false;
515                 }
516
517                 if ($rtl_content) {
518                         $rtl_tag = "dir=\"RTL\"";
519                         $rtl_class = "RTL";
520                 } else {
521                         $rtl_tag = "";
522                         $rtl_class = "";
523                 }
524
525                 $result = db_query($link, "UPDATE ttrss_user_entries 
526                         SET unread = false,last_read = NOW() 
527                         WHERE ref_id = '$id' AND feed_id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]);
528
529                 $result = db_query($link, "SELECT title,link,content,feed_id,comments,int_id,
530                         SUBSTRING(updated,1,16) as updated,
531                         (SELECT icon_url FROM ttrss_feeds WHERE id = feed_id) as icon_url,
532                         num_comments,
533                         author
534                         FROM ttrss_entries,ttrss_user_entries
535                         WHERE   id = '$id' AND ref_id = id AND owner_uid = " . $_SESSION["uid"]);
536
537                 print "<html><head>
538                         <title>Tiny Tiny RSS : Article $id</title>
539                         <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">";
540
541                 $user_theme = $_SESSION["theme"];
542                 if ($user_theme) { 
543                         print "<link rel=\"stylesheet\" type=\"text/css\" 
544                                 href=\"themes/$user_theme/theme.css\">";
545                 }
546
547                 if (get_pref($link, 'USE_COMPACT_STYLESHEET')) {
548                         print "<link rel=\"stylesheet\" type=\"text/css\" 
549                                 href=\"tt-rss_compact.css\"/>";
550                 } else {
551                         print "<link title=\"Compact Stylesheet\" rel=\"alternate stylesheet\" 
552                                         type=\"text/css\" href=\"tt-rss_compact.css\"/>";
553                 }
554
555                 $script_dt_add = get_script_dt_add();
556
557                 print "
558                         <script type=\"text/javascript\" src=\"prototype.js\"></script>
559                         <script type=\"text/javascript\" src=\"functions.js?$script_dt_add\"></script>
560                         <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
561                         </head><body $rtl_tag>";
562
563                 if ($result) {
564
565                         $line = db_fetch_assoc($result);
566
567                         if ($line["icon_url"]) {
568                                 $feed_icon = "<img class=\"feedIcon\" src=\"" . $line["icon_url"] . "\">";
569                         } else {
570                                 $feed_icon = "&nbsp;";
571                         }
572
573 /*                      if ($line["comments"] && $line["link"] != $line["comments"]) {
574                                 $entry_comments = "(<a href=\"".$line["comments"]."\">Comments</a>)";
575                         } else {
576                                 $entry_comments = "";
577                         } */
578
579                         $num_comments = $line["num_comments"];
580                         $entry_comments = "";
581
582                         if ($num_comments > 0) {
583                                 if ($line["comments"]) {
584                                         $comments_url = $line["comments"];
585                                 } else {
586                                         $comments_url = $line["link"];
587                                 }
588                                 $entry_comments = "<a href=\"$comments_url\">$num_comments comments</a>";
589                         } else {
590                                 if ($line["comments"] && $line["link"] != $line["comments"]) {
591                                         $entry_comments = "<a href=\"".$line["comments"]."\">comments</a>";
592                                 }                               
593                         }
594
595                         print "<div class=\"postReply\">";
596
597                         print "<div class=\"postHeader\"><table width=\"100%\">";
598
599                         $entry_author = $line["author"];
600
601                         if ($entry_author) {
602                                 $entry_author = " - by $entry_author";
603                         }
604
605                         print "<tr><td><a href=\"" . $line["link"] . "\">" . $line["title"] . 
606                                 "</a>$entry_author</td>";
607
608                         $parsed_updated = date(get_pref($link, 'LONG_DATE_FORMAT'), 
609                                 strtotime($line["updated"]));
610                 
611                         print "<td class=\"postDate$rtl_class\">$parsed_updated</td>";
612                                                 
613                         print "</tr>";
614
615                         $tmp_result = db_query($link, "SELECT DISTINCT tag_name FROM
616                                 ttrss_tags WHERE post_int_id = " . $line["int_id"] . "
617                                 ORDER BY tag_name");
618         
619                         $tags_str = "";
620                         $f_tags_str = "";
621
622                         $num_tags = 0;
623
624                         while ($tmp_line = db_fetch_assoc($tmp_result)) {
625                                 $num_tags++;
626                                 $tag = $tmp_line["tag_name"];                           
627                                 $tag_str = "<a href=\"javascript:parent.viewfeed('$tag')\">$tag</a>, "; 
628                                 
629                                 if ($num_tags == 5) {
630                                         $tags_str .= "<a href=\"javascript:showBlockElement('allEntryTags')\">...</a>";
631                                 } else if ($num_tags < 5) {
632                                         $tags_str .= $tag_str;
633                                 }
634                                 $f_tags_str .= $tag_str;
635                         }
636
637                         $tags_str = preg_replace("/, $/", "", $tags_str);
638                         $f_tags_str = preg_replace("/, $/", "", $f_tags_str);
639
640 //                      $truncated_link = truncate_string($line["link"], 60);
641
642                         if ($tags_str || $entry_comments) {
643                                 print "<tr><td width='50%'>
644                                         $entry_comments</td>
645                                         <td align=\"right\">$tags_str</td></tr>";
646                         }
647
648                         print "</table></div>";
649
650                         print "<div class=\"postIcon\">" . $feed_icon . "</div>";
651                         print "<div class=\"postContent\">";
652                         
653                         if (db_num_rows($tmp_result) > 5) {
654                                 print "<div id=\"allEntryTags\">Tags: $f_tags_str</div>";
655                         }
656
657                         if (get_pref($link, 'OPEN_LINKS_IN_NEW_WINDOW')) {
658                                 $line["content"] = preg_replace("/href=/i", "target=\"_new\" href=", $line["content"]);
659                         }
660
661                         print $line["content"] . "</div>";
662                         
663                         print "</div>";
664
665                         print "<script type=\"text/javascript\">
666                                 try {
667                                         parent.update_all_counters('$feed_id');
668                                 } catch (e) {
669                                         exception_error('view/footer', e);
670                                 }
671                         </script>";
672                 }
673
674                 print "</body></html>";
675         }
676
677         if ($op == "viewfeed") {
678
679                 $feed = db_escape_string($_GET["feed"]);
680                 $subop = db_escape_string($_GET["subop"]);
681                 $view_mode = db_escape_string($_GET["view_mode"]);
682                 $limit = db_escape_string($_GET["limit"]);
683                 $cat_view = db_escape_string($_GET["cat"]);
684                 $next_unread_feed = db_escape_string($_GET["nuf"]);
685
686                 if ($subop == "undefined") $subop = "";
687
688                 print "<html><head>
689                         <title>Tiny Tiny RSS : Feed $feed</title>
690                         <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">";
691
692                 $user_theme = $_SESSION["theme"];
693                 if ($user_theme) { 
694                         print "<link rel=\"stylesheet\" type=\"text/css\" 
695                                 href=\"themes/$user_theme/theme.css\">";
696                 }
697
698                 if (get_pref($link, 'USE_COMPACT_STYLESHEET')) {
699                         print "<link rel=\"stylesheet\" 
700                                         type=\"text/css\" href=\"tt-rss_compact.css\"/>";
701
702                 } else {
703                         print "<link title=\"Compact Stylesheet\" rel=\"alternate stylesheet\" 
704                                         type=\"text/css\" href=\"tt-rss_compact.css\"/>";
705                 }
706
707                 if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) {
708                         update_generic_feed($link, $feed, $cat_view);
709                 }
710
711                 if ($subop == "MarkAllRead")  {
712                         catchup_feed($link, $feed, $cat_view);
713
714                         if (get_pref($link, 'ON_CATCHUP_SHOW_NEXT_FEED')) {
715                                 if ($next_unread_feed) {
716                                         $feed = $next_unread_feed;
717                                 }
718                         }
719                 }
720
721                 if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) {
722         
723                         $result = db_query($link, "SELECT rtl_content FROM ttrss_feeds
724                                 WHERE id = '$feed' AND owner_uid = " . $_SESSION["uid"]);
725
726                         if (db_num_rows($result) == 1) {
727                                 $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
728                         } else {
729                                 $rtl_content = false;
730                         }
731         
732                         if ($rtl_content) {
733                                 $rtl_tag = "dir=\"RTL\"";
734                         } else {
735                                 $rtl_tag = "";
736                         }
737                 } else {
738                         $rtl_tag = "";
739                         $rtl_content = false;
740                 }
741
742                 $script_dt_add = get_script_dt_add();
743
744                 print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">  
745                         <script type=\"text/javascript\" src=\"prototype.js\"></script>
746                         <script type=\"text/javascript\" src=\"functions.js?$script_dt_add\"></script>
747                         <script type=\"text/javascript\" src=\"viewfeed.js?$script_dt_add\"></script>
748                         <!--[if gte IE 5.5000]>
749                         <script type=\"text/javascript\" src=\"pngfix.js\"></script>
750                         <link rel=\"stylesheet\" type=\"text/css\" href=\"tt-rss-ie.css\">
751                         <![endif]-->
752                         </head><body $rtl_tag>
753                         <script type=\"text/javascript\">
754                         if (document.addEventListener) {
755                                 document.addEventListener(\"DOMContentLoaded\", init, null);
756                         }
757                         window.onload = init;
758                         </script>";
759
760 //              print_r($_GET);
761
762                 $search = db_escape_string($_GET["query"]);
763                 $search_mode = db_escape_string($_GET["search_mode"]);
764                 $match_on = db_escape_string($_GET["match_on"]);
765
766                 if (!$match_on) {
767                         $match_on = "both";
768                 }
769                 
770                 if ($search) {
771                         if ($match_on == "both") {
772                                 $search_query_part = "(upper(ttrss_entries.title) LIKE upper('%$search%') 
773                                         OR upper(ttrss_entries.content) LIKE '%$search%') AND";
774                         } else if ($match_on == "title") {
775                                 $search_query_part = "upper(ttrss_entries.title) LIKE upper('%$search%') 
776                                         AND";
777                         } else if ($match_on == "content") {
778                                 $search_query_part = "upper(ttrss_entries.content) LIKE upper('%$search%') AND";
779                         }
780                 } else {
781                         $search_query_part = "";
782                 }
783
784                 $view_query_part = "";
785
786                 if ($view_mode == "adaptive") {
787                         if ($search) {
788                                 $view_query_part = " ";
789                         } else if ($feed != -1) {
790                                 $unread = getFeedUnread($link, $feed);
791                                 if ($unread > 0) {
792                                         $view_query_part = " unread = true AND ";
793                                 }
794                         }
795                 }
796
797                 if ($view_mode == "marked") {
798                         $view_query_part = " marked = true AND ";
799                 }
800
801                 if ($view_mode == "unread") {
802                         $view_query_part = " unread = true AND ";
803                 }
804
805                 if ($limit > 0) {
806                         $limit_query_part = "LIMIT " . $limit;
807                 } 
808
809                 $vfeed_query_part = "";
810
811                 // override query strategy and enable feed display when searching globally
812                 if ($search && $search_mode == "all_feeds") {
813                         $query_strategy_part = "ttrss_entries.id > 0";
814                         $vfeed_query_part = "ttrss_feeds.title AS feed_title,";         
815                 } else if (preg_match("/^-?[0-9][0-9]*$/", $feed) == false) {
816                         $query_strategy_part = "ttrss_entries.id > 0";
817                         $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE
818                                 id = feed_id) as feed_title,";
819                 } else if ($feed >= 0 && $search && $search_mode == "this_cat") {
820
821                         $vfeed_query_part = "ttrss_feeds.title AS feed_title,";         
822
823                         $tmp_result = db_query($link, "SELECT id 
824                                 FROM ttrss_feeds WHERE cat_id = 
825                                         (SELECT cat_id FROM ttrss_feeds WHERE id = '$feed') AND id != '$feed'");
826
827                         $cat_siblings = array();
828
829                         if (db_num_rows($tmp_result) > 0) {
830                                 while ($p = db_fetch_assoc($tmp_result)) {
831                                         array_push($cat_siblings, "feed_id = " . $p["id"]);
832                                 }
833
834                                 $query_strategy_part = sprintf("(feed_id = %d OR %s)", 
835                                         $feed, implode(" OR ", $cat_siblings));
836
837                         } else {
838                                 $query_strategy_part = "ttrss_entries.id > 0";
839                         }
840                         
841                 } else if ($feed >= 0) {
842
843                         if ($cat_view) {
844
845                                 if ($feed > 0) {
846                                         $query_strategy_part = "cat_id = '$feed'";
847                                 } else {
848                                         $query_strategy_part = "cat_id IS NULL";
849                                 }
850
851                                 $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
852
853                         } else {                
854                                 $tmp_result = db_query($link, "SELECT id 
855                                         FROM ttrss_feeds WHERE parent_feed = '$feed'
856                                         ORDER BY cat_id,title");
857         
858                                 $parent_ids = array();
859         
860                                 if (db_num_rows($tmp_result) > 0) {
861                                         while ($p = db_fetch_assoc($tmp_result)) {
862                                                 array_push($parent_ids, "feed_id = " . $p["id"]);
863                                         }
864         
865                                         $query_strategy_part = sprintf("(feed_id = %d OR %s)", 
866                                                 $feed, implode(" OR ", $parent_ids));
867         
868                                         $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
869                                 } else {
870                                         $query_strategy_part = "feed_id = '$feed'";
871                                 }
872                         }
873                 } else if ($feed == -1) { // starred virtual feed
874                         $query_strategy_part = "marked = true";
875                         $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
876                 } else if ($feed <= -10) { // labels
877                         $label_id = -$feed - 11;
878
879                         $tmp_result = db_query($link, "SELECT sql_exp FROM ttrss_labels
880                                 WHERE id = '$label_id'");
881                 
882                         $query_strategy_part = db_fetch_result($tmp_result, 0, "sql_exp");
883         
884                         $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
885                 } else {
886                         $query_strategy_part = "id > 0"; // dumb
887                 }
888
889                 $order_by = "updated DESC";
890
891 //              if ($feed < -10) {
892 //                      $order_by = "feed_id,updated DESC";
893 //              }
894
895                 $feed_title = "";
896
897                 if ($search && $search_mode == "all_feeds") {
898                         $feed_title = "Global search results ($search)";
899                 } else if ($search && preg_match('/^-?[0-9][0-9]*$/', $feed) == false) {
900                         $feed_title = "Feed search results ($search, $feed)";
901                 } else if (preg_match('/^-?[0-9][0-9]*$/', $feed) == false) {
902                         $feed_title = $feed;
903                 } else if (preg_match('/^-?[0-9][0-9]*$/', $feed) != false && $feed >= 0) {
904
905                         if ($cat_view) {
906
907                                 if ($feed != 0) {                       
908                                         $result = db_query($link, "SELECT title FROM ttrss_feed_categories
909                                                 WHERE id = '$feed' AND owner_uid = " . $_SESSION["uid"]);
910                                         $feed_title = db_fetch_result($result, 0, "title");
911                                 } else {
912                                         $feed_title = "Uncategorized";
913                                 }
914                         } else {
915                                 
916                                 $result = db_query($link, "SELECT title,site_url,last_error FROM ttrss_feeds 
917                                         WHERE id = '$feed' AND owner_uid = " . $_SESSION["uid"]);
918         
919                                 $feed_title = db_fetch_result($result, 0, "title");
920                                 $feed_site_url = db_fetch_result($result, 0, "site_url");
921                                 $last_error = db_fetch_result($result, 0, "last_error");
922
923                         }
924
925                 } else if ($feed == -1) {
926                         $feed_title = "Starred articles";
927                 } else if ($feed < -10) {
928                         $label_id = -$feed - 11;
929                         $result = db_query($link, "SELECT description FROM ttrss_labels
930                                 WHERE id = '$label_id'");
931                         $feed_title = db_fetch_result($result, 0, "description");
932                 } else {
933                         $feed_title = "?";
934                 }
935
936                 $feed_title = db_unescape_string($feed_title);
937
938                 if ($feed < -10) error_reporting (0);
939
940                 print "<div id=\"headlinesContainer\">";
941
942                 if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) {
943
944                         if ($feed >= 0) {
945                                 $feed_kind = "Feeds";
946                         } else {
947                                 $feed_kind = "Labels";
948                         }
949
950 //                      if (!$vfeed_query_part) {
951                         $content_query_part = "content as content_preview,";
952 //                      } else {
953 //                              $content_query_part = "";
954 //                      }
955
956                         $query = "SELECT 
957                                         ttrss_entries.id,ttrss_entries.title,
958                                         SUBSTRING(updated,1,16) as updated,
959                                         unread,feed_id,marked,link,last_read,
960                                         SUBSTRING(last_read,1,19) as last_read_noms,
961                                         $vfeed_query_part
962                                         $content_query_part
963                                         SUBSTRING(updated,1,19) as updated_noms
964                                 FROM
965                                         ttrss_entries,ttrss_user_entries,ttrss_feeds
966                                 WHERE
967                                 ttrss_user_entries.feed_id = ttrss_feeds.id AND
968                                 ttrss_user_entries.ref_id = ttrss_entries.id AND
969                                 ttrss_user_entries.owner_uid = '".$_SESSION["uid"]."' AND
970                                 $search_query_part
971                                 $view_query_part
972                                 $query_strategy_part ORDER BY $order_by
973                                 $limit_query_part";
974                                 
975                         $result = db_query($link, $query);
976
977                         if ($_GET["debug"]) print $query;
978
979                 } else {
980                         // browsing by tag
981
982                         $feed_kind = "Tags";
983
984                         $result = db_query($link, "SELECT
985                                 ttrss_entries.id as id,title,
986                                 SUBSTRING(updated,1,16) as updated,
987                                 unread,feed_id,
988                                 marked,link,last_read,                          
989                                 SUBSTRING(last_read,1,19) as last_read_noms,
990                                 $vfeed_query_part
991                                 $content_query_part
992                                 SUBSTRING(updated,1,19) as updated_noms
993                                 FROM
994                                         ttrss_entries,ttrss_user_entries,ttrss_tags
995                                 WHERE
996                                         ref_id = ttrss_entries.id AND
997                                         ttrss_user_entries.owner_uid = '".$_SESSION["uid"]."' AND
998                                         post_int_id = int_id AND tag_name = '$feed' AND
999                                         $view_query_part
1000                                         $search_query_part
1001                                         $query_strategy_part ORDER BY $order_by
1002                                 $limit_query_part");    
1003                 }
1004
1005                 if (!$result) {
1006                         print "<div align='center'>
1007                                 Could not display feed (query failed). Please check label match syntax or local configuration.</div>";
1008                         return;
1009                 }
1010
1011                 function print_headline_subtoolbar($link, $feed_site_url, $feed_title, 
1012                                                 $bottom = false, $rtl_content = false) {
1013
1014                         if (!$bottom) {
1015                                 $class = "headlinesSubToolbar";
1016                                 $tid = "headlineActionsTop";
1017                         } else {
1018                                 $class = "invisible";
1019                                 $tid = "headlineActionsBottom";
1020                         }
1021
1022                         print "<table class=\"$class\" id=\"$tid\"
1023                                 width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr>";
1024
1025                         if ($rtl_content) {
1026                                 $rtl_cpart = "RTL";
1027                         } else {
1028                                 $rtl_cpart = "";
1029                         }
1030
1031                         if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
1032
1033                                 print "<td class=\"headlineActions$rtl_cpart\">
1034                                         Select: 
1035                                                                 <a href='#' onclick=\"javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, '', true)\">All</a>,
1036                                                                 <a href='#' onclick=\"javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', true, 'Unread', true)\">Unread</a>,
1037                                                                 <a href='#' onclick=\"javascript:selectTableRowsByIdPrefix('headlinesList', 'RROW-', 'RCHK-', false)\">None</a>
1038                                                 &nbsp;&nbsp;
1039                                                 Toggle: <a href='#' onclick=\"javascript:selectionToggleUnread()\">Unread</a>,
1040                                                                 <a href='#' onclick=\"javascript:selectionToggleMarked()\">Starred</a>";
1041                                 print "</td>";
1042
1043                         } else {
1044
1045                                 print "<td class=\"headlineActions$rtl_cpart\">
1046                                         Select: 
1047                                                                 <a href=\"#\" onclick=\"javascript:cdmSelectArticles('all')\">All</a>,
1048                                                                 <a href=\"#\" onclick=\"javascript:cdmSelectArticles('unread')\">Unread</a>,
1049                                                                 <a href=\"#\" onclick=\"javascript:cdmSelectArticles('none')\">None</a>
1050                                                 &nbsp;&nbsp;
1051                                                 Toggle: <a href=\"#\" onclick=\"javascript:selectionToggleUnread(true)\">Unread</a>,
1052                                                                 <a href=\"#\" onclick=\"javascript:selectionToggleMarked(true)\">Starred</a>";
1053                         
1054                                 print "</td>";
1055
1056                         }
1057
1058                         print "<td class=\"headlineTitle$rtl_cpart\">";
1059                 
1060                         if ($feed_site_url) {
1061                                 if (!$bottom) {
1062                                         $target = "target=\"_blank\"";
1063                                 }
1064                                 print "<a $target href=\"$feed_site_url\">$feed_title</a>";
1065                         } else {
1066                                 print $feed_title;
1067                         }
1068                                 
1069                         print "</td>";
1070                         print "</tr></table>";
1071
1072                 }
1073         
1074                 if (db_num_rows($result) > 0) {
1075
1076                         print_headline_subtoolbar($link, $feed_site_url, $feed_title, false, 
1077                                 $rtl_content);
1078
1079                         if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
1080                                 print "<table class=\"headlinesList\" id=\"headlinesList\" 
1081                                         cellspacing=\"0\" width=\"100%\">";
1082                         }
1083
1084                         $lnum = 0;
1085         
1086                         error_reporting (DEFAULT_ERROR_LEVEL);
1087         
1088                         $num_unread = 0;
1089         
1090                         while ($line = db_fetch_assoc($result)) {
1091
1092                                 $class = ($lnum % 2) ? "even" : "odd";
1093         
1094                                 $id = $line["id"];
1095                                 $feed_id = $line["feed_id"];
1096         
1097                                 if ($line["last_read"] == "" && 
1098                                                 ($line["unread"] != "t" && $line["unread"] != "1")) {
1099         
1100                                         $update_pic = "<img id='FUPDPIC-$id' src=\"images/updated.png\" 
1101                                                 alt=\"Updated\">";
1102                                 } else {
1103                                         $update_pic = "<img id='FUPDPIC-$id' src=\"images/blank_icon.gif\" 
1104                                                 alt=\"Updated\">";
1105                                 }
1106         
1107                                 if ($line["unread"] == "t" || $line["unread"] == "1") {
1108                                         $class .= "Unread";
1109                                         ++$num_unread;
1110                                         $is_unread = true;
1111                                 } else {
1112                                         $is_unread = false;
1113                                 }
1114         
1115                                 if ($line["marked"] == "t" || $line["marked"] == "1") {
1116                                         $marked_pic = "<img id=\"FMARKPIC-$id\" src=\"images/mark_set.png\" 
1117                                                 alt=\"Reset mark\" onclick='javascript:toggleMark($id)'>";
1118                                 } else {
1119                                         $marked_pic = "<img id=\"FMARKPIC-$id\" src=\"images/mark_unset.png\" 
1120                                                 alt=\"Set mark\" onclick='javascript:toggleMark($id)'>";
1121                                 }
1122         
1123                                 $content_link = "<a href=\"javascript:view($id,$feed_id);\">" .
1124                                         $line["title"] . "</a>";
1125
1126                                 if (get_pref($link, 'HEADLINES_SMART_DATE')) {
1127                                         $updated_fmt = smart_date_time(strtotime($line["updated"]));
1128                                 } else {
1129                                         $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
1130                                         $updated_fmt = date($short_date, strtotime($line["updated"]));
1131                                 }                               
1132
1133                                 if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) {
1134                                         $content_preview = truncate_string(strip_tags($line["content_preview"]), 
1135                                                 100);
1136                                 }
1137
1138                                 if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {
1139                                         
1140                                         print "<tr class='$class' id='RROW-$id'>";
1141                 
1142                                         print "<td class='hlUpdatePic'>$update_pic</td>";
1143                 
1144                                         print "<td class='hlSelectRow'>
1145                                                 <input type=\"checkbox\" onclick=\"toggleSelectRow(this)\"
1146                                                         class=\"feedCheckBox\" id=\"RCHK-$id\">
1147                                                 </td>";
1148                 
1149                                         print "<td class='hlMarkedPic'>$marked_pic</td>";
1150                 
1151                                         if ($line["feed_title"]) {                      
1152                                                 print "<td class='hlContent'>$content_link</td>";
1153                                                 print "<td class='hlFeed'>
1154                                                         <a href='javascript:viewfeed($feed_id)'>".
1155                                                                 $line["feed_title"]."</a>&nbsp;</td>";
1156                                         } else {                        
1157                                                 print "<td class='hlContent' valign='middle'>";
1158                 
1159                                                 print "<a href=\"javascript:view($id,$feed_id);\">" .
1160                                                         $line["title"];
1161                 
1162                                                 if (get_pref($link, 'SHOW_CONTENT_PREVIEW') && !$rtl_tag) {
1163                                                         if ($content_preview) {
1164                                                                 print "<span class=\"contentPreview\"> - $content_preview</span>";
1165                                                         }
1166                                                 }
1167                 
1168                                                 print "</a>";
1169                                                 print "</td>";
1170                                         }
1171                                         
1172                                         print "<td class=\"hlUpdated\"><nobr>$updated_fmt&nbsp;</nobr></td>";
1173                 
1174                                         print "</tr>";
1175
1176                                 } else {
1177                                         
1178                                         if ($is_unread) {
1179                                                 $add_class = "Unread";
1180                                         } else {
1181                                                 $add_class = "";
1182                                         }       
1183                                         
1184                                         print "<div class=\"cdmArticle$add_class\" id=\"RROW-$id\">";
1185
1186                                         print "<div class=\"cdmHeader\">";
1187
1188                                         print "<div style=\"float : right\">$updated_fmt,
1189                                                 <a class=\"cdmToggleLink\"
1190                                                         href=\"javascript:toggleUnread($id)\">Toggle unread</a>
1191                                         </div>";
1192                                         
1193                                         print "<a class=\"title\" 
1194                                                 onclick=\"javascript:toggleUnread($id, 0)\"
1195                                                 target=\"new\" href=\"".$line["link"]."\">".$line["title"]."</a>";
1196
1197                                         if ($line["feed_title"]) {      
1198                                                 print "&nbsp;(<a href='javascript:viewfeed($feed_id)'>".$line["feed_title"]."</a>)";
1199                                         }
1200
1201                                         print "</div>";
1202
1203                                         print "<div class=\"cdmContent\">" . $line["content_preview"] . "</div>";
1204
1205                                         print "<div style=\"float : right\">$marked_pic</div>
1206                                                 <div lass=\"cdmFooter\">
1207                                                         <input type=\"checkbox\" onclick=\"toggleSelectRowById(this, 
1208                                                         'RROW-$id')\" class=\"feedCheckBox\" id=\"RCHK-$id\"></div>";
1209
1210 #                                       print "<div align=\"center\"><a class=\"cdmToggleLink\"
1211 #                                                       href=\"javascript:toggleUnread($id)\">
1212 #                                                       Toggle unread</a></div>";
1213
1214                                         print "</div>"; 
1215
1216                                 }                               
1217         
1218                                 ++$lnum;
1219                         }
1220
1221                         if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) {                        
1222                                 print "</table>";
1223                         }
1224
1225                         print_headline_subtoolbar($link, 
1226                                 "javascript:catchupPage()", "Mark page as read", true, $rtl_content);
1227
1228
1229                 } else {
1230                         print "<div width='100%' align='center'>No articles found.</div>";
1231                 }
1232
1233                 print "</div>";
1234
1235                 print "
1236                         <script type=\"text/javascript\">
1237                                 try {
1238                                         document.onkeydown = hotkey_handler;
1239                                         parent.update_all_counters(\"$feed\");
1240                                 } catch (e) {
1241                                         exception_error(\"viewfeed/footer1\", e);
1242                                 }
1243
1244                                 /* for IE */
1245                                 function statechange() {
1246                                         if (document.readyState == \"interactive\") init();
1247                                 }
1248
1249                                 if (document.readyState) {      
1250                                         if (document.readyState == \"interactive\" || document.readyState == \"complete\") {
1251                                                 init();
1252                                         } else {
1253                                                 document.onreadystatechange = statechange;
1254                                         }
1255                                 }
1256                         </script>";
1257
1258                 print "</body></html>";
1259         }
1260
1261         if ($op == "pref-feeds") {
1262         
1263                 $subop = $_REQUEST["subop"];
1264                 $quiet = $_REQUEST["quiet"];
1265
1266                 if ($subop == "massSubscribe") {
1267                         $ids = split(",", db_escape_string($_GET["ids"]));
1268
1269                         $subscribed = array();
1270
1271                         foreach ($ids as $id) {
1272                                 $result = db_query($link, "SELECT feed_url,title FROM ttrss_feeds
1273                                         WHERE id = '$id'");
1274
1275                                 $feed_url = db_fetch_result($result, 0, "feed_url");
1276                                 $title = db_fetch_result($result, 0, "title");
1277
1278                                 $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
1279                                         feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
1280
1281                                 if (db_num_rows($result) == 0) {                        
1282                                         $result = db_query($link,
1283                                                 "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id) 
1284                                                 VALUES ('".$_SESSION["uid"]."', '$feed_url', '$title', NULL)");
1285
1286                                         array_push($subscribed, $title);
1287                                 }
1288                         }
1289
1290                         if (count($subscribed) > 0) {
1291                                 print "<div class=\"notice\">";
1292                                 print "<b>Subscribed to feeds:</b>";
1293                                 print "<ul class=\"nomarks\">";
1294                                 foreach ($subscribed as $title) {
1295                                         print "<li>$title</li>";
1296                                 }
1297                                 print "</ul>";
1298                                 print "</div>";
1299                         }
1300                 }               
1301
1302                 if ($subop == "browse") {
1303
1304                         if (!ENABLE_FEED_BROWSER) {
1305                                 print "Feed browser is administratively disabled.";
1306                                 return;
1307                         }
1308
1309                         print "<div id=\"infoBoxTitle\">Other feeds: Top 25</div>";
1310                         
1311                         print "<div class=\"infoBoxContents\">";
1312
1313                         print "<p>Showing top 25 registered feeds, sorted by popularity:</p>";
1314
1315                         $result = db_query($link, "SELECT feed_url,count(id) AS subscribers 
1316                                 FROM ttrss_feeds 
1317                                 WHERE auth_login = '' AND auth_pass = '' AND private = false
1318                                 GROUP BY feed_url ORDER BY subscribers DESC LIMIT 25");
1319                         
1320                         print "<ul class='browseFeedList' id='browseFeedList'>";
1321
1322                         $feedctr = 0;
1323                         
1324                         while ($line = db_fetch_assoc($result)) {
1325                                 $feed_url = $line["feed_url"];
1326                                 $subscribers = $line["subscribers"];
1327
1328                                 $sub_result = db_query($link, "SELECT id
1329                                         FROM ttrss_feeds WHERE feed_url = '$feed_url' AND owner_uid =" . 
1330                                         $_SESSION["uid"]);
1331
1332                                 if (db_num_rows($sub_result) > 0) {
1333                                         continue; // already subscribed
1334                                 }
1335                         
1336                                 $det_result = db_query($link, "SELECT site_url,title,id 
1337                                         FROM ttrss_feeds WHERE feed_url = '$feed_url' LIMIT 1");
1338
1339                                 $details = db_fetch_assoc($det_result);
1340                         
1341                                 $icon_file = ICONS_DIR . "/" . $details["id"] . ".ico";
1342
1343                                 if (file_exists($icon_file) && filesize($icon_file) > 0) {
1344                                                 $feed_icon = "<img class=\"tinyFeedIcon\"       src=\"" . ICONS_URL . 
1345                                                         "/".$details["id"].".ico\">";
1346                                 } else {
1347                                         $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
1348                                 }
1349
1350                                 $check_box = "<input onclick='toggleSelectListRow(this)' class='feedBrowseCB' 
1351                                         type=\"checkbox\" id=\"FBCHK-" . $details["id"] . "\">";
1352
1353                                 $class = ($feedctr % 2) ? "even" : "odd";
1354
1355                                 print "<li class='$class' id=\"FBROW-".$details["id"]."\">$check_box".
1356                                         "$feed_icon " . db_unescape_string($details["title"]) . 
1357                                         "&nbsp;<span class='subscribers'>($subscribers)</span></li>";
1358
1359                                         ++$feedctr;
1360                         }
1361
1362                         if ($feedctr == 0) {
1363                                 print "<li>No feeds found to subscribe.</li>";
1364                         }
1365
1366                         print "</ul>";
1367
1368                         print "<div align='center'>
1369                                 <input type=\"submit\" class=\"button\" 
1370                                 onclick=\"feedBrowserSubscribe()\" value=\"Subscribe\">
1371                                 <input type='submit' class='button'                     
1372                                 onclick=\"closeInfoBox()\" value=\"Cancel\"></div>";
1373
1374                         print "</div>";
1375                         return;
1376                 }
1377
1378                 if ($subop == "editfeed") {
1379                         $feed_id = db_escape_string($_REQUEST["id"]);
1380
1381                         $result = db_query($link, 
1382                                 "SELECT * FROM ttrss_feeds WHERE id = '$feed_id' AND
1383                                         owner_uid = " . $_SESSION["uid"]);
1384
1385                         $title = htmlspecialchars(db_unescape_string(db_fetch_result($result,
1386                                 0, "title")));
1387
1388                         $icon_file = ICONS_DIR . "/$feed_id.ico";
1389         
1390                         if (file_exists($icon_file) && filesize($icon_file) > 0) {
1391                                         $feed_icon = "<img width=\"16\" height=\"16\"
1392                                                 src=\"" . ICONS_URL . "/$feed_id.ico\">";
1393                         } else {
1394                                 $feed_icon = "";
1395                         }
1396
1397                         print "<div id=\"infoBoxTitle\">Feed editor</div>";
1398
1399                         print "<div class=\"infoBoxContents\">";
1400
1401                         print "<form id=\"edit_feed_form\">";   
1402
1403                         print "<input type=\"hidden\" name=\"id\" value=\"$feed_id\">";
1404                         print "<input type=\"hidden\" name=\"op\" value=\"pref-feeds\">";
1405                         print "<input type=\"hidden\" name=\"subop\" value=\"editSave\">";
1406
1407                         print "<table width='100%'>";
1408
1409                         print "<tr><td>Title:</td>";
1410                         print "<td><input class=\"iedit\" name=\"title\" value=\"$title\"></td></tr>";
1411
1412                         $feed_url = db_fetch_result($result, 0, "feed_url");
1413                         $feed_url = htmlspecialchars(db_unescape_string(db_fetch_result($result,
1414                                 0, "feed_url")));
1415                                 
1416                         print "<tr><td>Feed URL:</td>";
1417                         print "<td><input class=\"iedit\" name=\"feed_url\" value=\"$feed_url\"></td></tr>";
1418
1419                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
1420
1421                                 $cat_id = db_fetch_result($result, 0, "cat_id");
1422
1423                                 print "<tr><td>Category:</td>";
1424                                 print "<td>";
1425
1426                                 print_feed_cat_select($link, "cat_id", $cat_id, "class=\"iedit\"");
1427
1428                                 print "</td>";
1429                                 print "</td></tr>";
1430         
1431                         }
1432
1433                         $update_interval = db_fetch_result($result, 0, "update_interval");
1434
1435                         print "<tr><td>Update Interval:</td>";
1436
1437                         print "<td>";
1438
1439                         print_select_hash("update_interval", $update_interval, $update_intervals,
1440                                 "class=\"iedit\"");
1441
1442                         print "</td>";
1443
1444                         print "<tr><td>Link to:</td><td>";
1445
1446                         $tmp_result = db_query($link, "SELECT COUNT(id) AS count
1447                                 FROM ttrss_feeds WHERE parent_feed = '$feed_id'");
1448
1449                         $linked_count = db_fetch_result($tmp_result, 0, "count");
1450
1451                         $parent_feed = db_fetch_result($result, 0, "parent_feed");
1452
1453                         if ($linked_count > 0) {
1454                                 $disabled = "disabled";
1455                         }
1456
1457                         print "<select class=\"iedit\" $disabled name=\"parent_feed\">";
1458                         
1459                         print "<option value=\"0\">Not linked</option>";
1460
1461                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
1462                                 if ($cat_id) {
1463                                         $cat_qpart = "AND cat_id = '$cat_id'";
1464                                 } else {
1465                                         $cat_qpart = "AND cat_id IS NULL";
1466                                 }
1467                         }
1468
1469                         $tmp_result = db_query($link, "SELECT id,title FROM ttrss_feeds
1470                                 WHERE id != '$feed_id' AND owner_uid = ".$_SESSION["uid"]." 
1471                                         $cat_qpart ORDER BY title");
1472
1473                                 if (db_num_rows($tmp_result) > 0) {
1474                                         print "<option disabled>--------</option>";
1475                                 }
1476
1477                                 while ($tmp_line = db_fetch_assoc($tmp_result)) {
1478                                         if ($tmp_line["id"] == $parent_feed) {
1479                                                 $is_selected = "selected";
1480                                         } else {
1481                                                 $is_selected = "";
1482                                         }
1483                                         printf("<option $is_selected value='%d'>%s</option>", 
1484                                                 $tmp_line["id"], $tmp_line["title"]);
1485                                 }
1486
1487                         print "</select>";
1488                         print "</td></tr>";
1489
1490                         $purge_interval = db_fetch_result($result, 0, "purge_interval");
1491
1492                         print "<tr><td>Article purging:</td>";
1493
1494                         print "<td>";
1495
1496                         print_select_hash("purge_interval", $purge_interval, $purge_intervals, 
1497                                 "class=\"iedit\"");
1498                         
1499                         print "</td>";
1500
1501                         $auth_login = db_fetch_result($result, 0, "auth_login");
1502
1503                         print "<tr><td>Login:</td>";
1504                         print "<td><input class=\"iedit\" name=\"auth_login\" value=\"$auth_login\"></td></tr>";
1505
1506                         $auth_pass = db_fetch_result($result, 0, "auth_pass");
1507
1508                         print "<tr><td>Password:</td>";
1509                         print "<td><input class=\"iedit\" type=\"password\" name=\"auth_pass\" 
1510                                 value=\"$auth_pass\"></td></tr>";
1511
1512                         $private = sql_bool_to_bool(db_fetch_result($result, 0, "private"));
1513
1514                         if ($private) {
1515                                 $checked = "checked";
1516                         } else {
1517                                 $checked = "";
1518                         }
1519
1520                         print "<tr><td valign='top'>Options:</td>";
1521                         print "<td><input type=\"checkbox\" name=\"private\" id=\"private\" 
1522                                 $checked><label for=\"private\">Hide from feed browser</label>";
1523
1524                         $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
1525
1526                         if ($rtl_content) {
1527                                 $checked = "checked";
1528                         } else {
1529                                 $checked = "";
1530                         }
1531
1532                         print "<br><input type=\"checkbox\" id=\"rtl_content\" name=\"rtl_content\"
1533                                 $checked><label for=\"rtl_content\">Right-to-left content</label>";
1534                         
1535                         print "</td></tr>";
1536
1537                         print "</table>";
1538
1539                         print "</form>";
1540
1541                         print "</div>";
1542
1543                         print "<div align='center'>
1544                                 <input type=\"submit\" class=\"button\" 
1545                                 onclick=\"return feedEditSave()\" value=\"Save\">
1546                                 <input type='submit' class='button'                     
1547                                 onclick=\"return feedEditCancel()\" value=\"Cancel\"></div>";
1548                         return;
1549                 }
1550
1551                 if ($subop == "editSave") {
1552
1553                         $feed_title = db_escape_string(trim($_POST["title"]));
1554                         $feed_link = db_escape_string(trim($_POST["feed_url"]));
1555                         $upd_intl = db_escape_string($_POST["update_interval"]);
1556                         $purge_intl = db_escape_string($_POST["purge_interval"]);
1557                         $feed_id = db_escape_string($_POST["id"]);
1558                         $cat_id = db_escape_string($_POST["cat_id"]);
1559                         $auth_login = db_escape_string(trim($_POST["auth_login"]));
1560                         $auth_pass = db_escape_string(trim($_POST["auth_pass"]));
1561                         $parent_feed = db_escape_string($_POST["parent_feed"]);
1562                         $private = checkbox_to_sql_bool(db_escape_string($_POST["private"]));
1563                         $rtl_content = checkbox_to_sql_bool(db_escape_string($_POST["rtl_content"]));
1564
1565                         if ($cat_id && $cat_id != 0) {
1566                                 $category_qpart = "cat_id = '$cat_id'";
1567                         } else {
1568                                 $category_qpart = 'cat_id = NULL';
1569                         }
1570
1571                         if ($parent_feed && $parent_feed != 0) {
1572                                 $parent_qpart = "parent_feed = '$parent_feed'";
1573                         } else {
1574                                 $parent_qpart = 'parent_feed = NULL';
1575                         }
1576
1577                         $result = db_query($link, "UPDATE ttrss_feeds SET 
1578                                 $category_qpart,
1579                                 $parent_qpart,
1580                                 title = '$feed_title', feed_url = '$feed_link',
1581                                 update_interval = '$upd_intl',
1582                                 purge_interval = '$purge_intl',
1583                                 auth_login = '$auth_login',
1584                                 auth_pass = '$auth_pass',
1585                                 private = $private,
1586                                 rtl_content = $rtl_content
1587                                 WHERE id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]);
1588                 }
1589
1590                 if ($subop == "saveCat") {
1591                         $cat_title = db_escape_string(trim($_GET["title"]));
1592                         $cat_id = db_escape_string($_GET["id"]);
1593
1594                         $result = db_query($link, "UPDATE ttrss_feed_categories SET
1595                                 title = '$cat_title' WHERE id = '$cat_id' AND owner_uid = ".$_SESSION["uid"]);
1596
1597                 }
1598
1599                 if ($subop == "remove") {
1600
1601                         if (!WEB_DEMO_MODE) {
1602
1603                                 $ids = split(",", db_escape_string($_GET["ids"]));
1604
1605                                 foreach ($ids as $id) {
1606                                         db_query($link, "DELETE FROM ttrss_feeds 
1607                                                 WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
1608
1609                                         $icons_dir = ICONS_DIR;
1610                                         
1611                                         if (file_exists($icons_dir . "/$id.ico")) {
1612                                                 unlink($icons_dir . "/$id.ico");
1613                                         }
1614                                 }
1615                         }
1616                 }
1617
1618                 if ($subop == "add") {
1619                 
1620                         if (!WEB_DEMO_MODE) {
1621
1622                                 $feed_url = db_escape_string(trim($_GET["feed_url"]));
1623                                 $cat_id = db_escape_string($_GET["cat_id"]);
1624
1625                                 if (subscribe_to_feed($link, $feed_url, $cat_id)) {
1626                                         print "Added feed.";
1627                                 } else {
1628                                         print "<div class=\"warning\">
1629                                                 Feed <b>$feed_url</b> already exists in the database.
1630                                         </div>";
1631                                 }
1632                         }
1633                 }
1634
1635                 if ($subop == "addCat") {
1636
1637                         if (!WEB_DEMO_MODE) {
1638
1639                                 $feed_cat = db_escape_string(trim($_GET["cat"]));
1640
1641                                 $result = db_query($link,
1642                                         "SELECT id FROM ttrss_feed_categories
1643                                         WHERE title = '$feed_cat' AND owner_uid = ".$_SESSION["uid"]);
1644
1645                                 if (db_num_rows($result) == 0) {
1646                                         
1647                                         $result = db_query($link,
1648                                                 "INSERT INTO ttrss_feed_categories (owner_uid,title) 
1649                                                 VALUES ('".$_SESSION["uid"]."', '$feed_cat')");
1650
1651                                 } else {
1652
1653                                         print "<div class=\"warning\">
1654                                                 Category <b>$feed_cat</b> already exists in the database.
1655                                         </div>";
1656                                 }
1657
1658
1659                         }
1660                 }
1661
1662                 if ($subop == "removeCats") {
1663
1664                         if (!WEB_DEMO_MODE) {
1665
1666                                 $ids = split(",", db_escape_string($_GET["ids"]));
1667
1668                                 foreach ($ids as $id) {
1669
1670                                         db_query($link, "BEGIN");
1671
1672                                         $result = db_query($link, 
1673                                                 "SELECT count(id) as num_feeds FROM ttrss_feeds 
1674                                                         WHERE cat_id = '$id'");
1675
1676                                         $num_feeds = db_fetch_result($result, 0, "num_feeds");
1677
1678                                         if ($num_feeds == 0) {
1679                                                 db_query($link, "DELETE FROM ttrss_feed_categories
1680                                                         WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
1681                                         } else {
1682
1683                                                 print "<div class=\"warning\">
1684                                                         Unable to delete non empty feed categories.</div>";
1685                                                         
1686                                         }
1687
1688                                         db_query($link, "COMMIT");
1689                                 }
1690                         }
1691                 }
1692
1693                 if ($subop == "categorize") {
1694
1695                         if (!WEB_DEMO_MODE) {
1696
1697                                 $ids = split(",", db_escape_string($_GET["ids"]));
1698
1699                                 $cat_id = db_escape_string($_GET["cat_id"]);
1700
1701                                 if ($cat_id == 0) {
1702                                         $cat_id_qpart = 'NULL';
1703                                 } else {
1704                                         $cat_id_qpart = "'$cat_id'";
1705                                 }
1706
1707                                 db_query($link, "BEGIN");
1708
1709                                 foreach ($ids as $id) {
1710                                 
1711                                         db_query($link, "UPDATE ttrss_feeds SET cat_id = $cat_id_qpart
1712                                                 WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
1713                                 }
1714
1715                                 db_query($link, "COMMIT");
1716                         }
1717
1718                 }
1719
1720                 if ($quiet) return;
1721
1722 //              print "<h3>Edit Feeds</h3>";
1723
1724                 $result = db_query($link, "SELECT id,title,feed_url,last_error 
1725                         FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ".$_SESSION["uid"]);
1726
1727                 if (db_num_rows($result) > 0) {
1728                 
1729                         print "<div class=\"warning\">";
1730                         
1731 //                      print"<img class=\"closeButton\" 
1732 //                              onclick=\"javascript:hideParentElement(this);\" src=\"images/close.png\">";
1733         
1734                         print "<a href=\"javascript:showBlockElement('feedUpdateErrors')\">
1735                                 <b>Some feeds have update errors (click for details)</b></a>";
1736
1737                         print "<ul id=\"feedUpdateErrors\" class=\"nomarks\">";
1738                                                 
1739                         while ($line = db_fetch_assoc($result)) {
1740                                 print "<li>" . $line["title"] . " (" . $line["feed_url"] . "): " . 
1741                                         $line["last_error"];
1742                         }
1743
1744                         print "</ul>";
1745                         print "</div>";
1746
1747                 }
1748
1749                 $feed_search = db_escape_string($_GET["search"]);
1750
1751                 if (array_key_exists("search", $_GET)) {
1752                         $_SESSION["prefs_feed_search"] = $feed_search;
1753                 } else {
1754                         $feed_search = $_SESSION["prefs_feed_search"];
1755                 }
1756
1757                 print "<table width='100%' class=\"prefGenericAddBox\" 
1758                         cellspacing='0' cellpadding='0'><tr>
1759                         <td>
1760                                 <input id=\"fadd_link\" 
1761                                         onkeyup=\"toggleSubmitNotEmpty(this, 'fadd_submit_btn')\"
1762                                         size=\"40\">
1763                                 <input type=\"submit\" class=\"button\"
1764                                         disabled=\"true\" id=\"fadd_submit_btn\"
1765                                         onclick=\"addFeed()\" value=\"Subscribe\">";
1766
1767                 if (ENABLE_FEED_BROWSER && !SINGLE_USER_MODE) {
1768                         print " <input type=\"submit\" class=\"button\"
1769                                 onclick=\"javascript:browseFeeds()\" value=\"Top 25\">";
1770                 }
1771                 
1772                 print "</td><td align='right'>
1773                                 <input id=\"feed_search\" size=\"20\"  
1774                                         onchange=\"javascript:updateFeedList()\" value=\"$feed_search\">
1775                                 <input type=\"submit\" class=\"button\" 
1776                                 onclick=\"javascript:updateFeedList()\" value=\"Search\">
1777                         </td>                   
1778                         </tr></table>";
1779
1780                 $feeds_sort = db_escape_string($_GET["sort"]);
1781
1782                 if (!$feeds_sort || $feeds_sort == "undefined") {
1783                         $feeds_sort = $_SESSION["pref_sort_feeds"];                     
1784                         if (!$feeds_sort) $feeds_sort = "title";
1785                 }
1786
1787                 $_SESSION["pref_sort_feeds"] = $feeds_sort;
1788
1789                 if ($feed_search) {
1790                         $search_qpart = "(UPPER(F1.title) LIKE UPPER('%$feed_search%') OR
1791                                 UPPER(F1.feed_url) LIKE UPPER('%$feed_search%')) AND";
1792                 } else {
1793                         $search_qpart = "";
1794                 }
1795
1796                 $result = db_query($link, "SELECT 
1797                                 F1.id,
1798                                 F1.title,
1799                                 F1.feed_url,
1800                                 substring(F1.last_updated,1,16) AS last_updated,
1801                                 F1.parent_feed,
1802                                 F1.update_interval,
1803                                 F1.purge_interval,
1804                                 F1.cat_id,
1805                                 F2.title AS parent_title,
1806                                 C1.title AS category                            
1807                         FROM 
1808                                 ttrss_feeds AS F1 
1809                                 LEFT JOIN ttrss_feeds AS F2
1810                                         ON (F1.parent_feed = F2.id)
1811                                 LEFT JOIN ttrss_feed_categories AS C1
1812                                         ON (F1.cat_id = C1.id)
1813                         WHERE 
1814                                 $search_qpart F1.owner_uid = '".$_SESSION["uid"]."'                     
1815                         ORDER by category,$feeds_sort,title");
1816
1817                 if (db_num_rows($result) != 0) {
1818
1819 //                      print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
1820
1821                         print "<p><table width=\"100%\" cellspacing=\"0\" 
1822                                 class=\"prefFeedList\" id=\"prefFeedList\">";
1823                         print "<tr><td class=\"selectPrompt\" colspan=\"8\">
1824                                 Select: 
1825                                         <a href=\"javascript:selectPrefRows('feed', true)\">All</a>,
1826                                         <a href=\"javascript:selectPrefRows('feed', false)\">None</a>
1827                                 </td</tr>";
1828
1829                         if (!get_pref($link, 'ENABLE_FEED_CATS')) {
1830                                 print "<tr class=\"title\">
1831                                         <td width='5%' align='center'>&nbsp;</td>
1832                                         <td width='40%'><a href=\"javascript:updateFeedList('title')\">Title</a></td>
1833                                         <td width='45%'><a href=\"javascript:updateFeedList('feed_url')\">Feed</a></td>
1834                                         <td width='15%' align='right'><a href=\"javascript:updateFeedList('last_updated')\">Updated</a></td>";
1835                         }
1836                         
1837                         $lnum = 0;
1838
1839                         $cur_cat_id = -1;
1840                         
1841                         while ($line = db_fetch_assoc($result)) {
1842         
1843                                 $feed_id = $line["id"];
1844                                 $cat_id = $line["cat_id"];
1845
1846                                 $edit_title = htmlspecialchars(db_unescape_string($line["title"]));
1847                                 $edit_link = htmlspecialchars(db_unescape_string($line["feed_url"]));
1848                                 $edit_cat = htmlspecialchars(db_unescape_string($line["category"]));
1849
1850                                 if (!$edit_cat) $edit_cat = "Uncategorized";
1851
1852                                 $last_updated = $line["last_updated"];
1853
1854                                 if (get_pref($link, 'HEADLINES_SMART_DATE')) {
1855                                         $last_updated = smart_date_time(strtotime($last_updated));
1856                                 } else {
1857                                         $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
1858                                         $last_updated = date($short_date, strtotime($last_updated));
1859                                 }
1860
1861                                 if (get_pref($link, 'ENABLE_FEED_CATS') && $cur_cat_id != $cat_id) {
1862                                         $lnum = 0;
1863                                 
1864                                         print "<tr><td colspan=\"6\" class=\"feedEditCat\">$edit_cat</td></tr>";
1865
1866                                         print "<tr class=\"title\">
1867                                                 <td width='5%'>&nbsp;</td>";
1868
1869                                         if (get_pref($link, 'ENABLE_FEED_ICONS')) {
1870                                                 print "<td width='3%'>&nbsp;</td>";
1871                                         }
1872
1873                                         print "<td width='40%'><a href=\"javascript:updateFeedList('title')\">Title</a></td>
1874                                                 <td width='45%'><a href=\"javascript:updateFeedList('feed_url')\">Feed</a></td>
1875                                                 <td width='15%' align='right'><a href=\"javascript:updateFeedList('last_updated')\">Updated</a></td>";
1876
1877                                         $cur_cat_id = $cat_id;
1878                                 }
1879
1880                                 $class = ($lnum % 2) ? "even" : "odd";
1881                                 $this_row_id = "id=\"FEEDR-$feed_id\"";
1882
1883                                 print "<tr class=\"$class\" $this_row_id>";
1884         
1885                                 $icon_file = ICONS_DIR . "/$feed_id.ico";
1886         
1887                                 if (file_exists($icon_file) && filesize($icon_file) > 0) {
1888                                                 $feed_icon = "<img class=\"tinyFeedIcon\"       src=\"" . ICONS_URL . "/$feed_id.ico\">";
1889                                 } else {
1890                                         $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
1891                                 }
1892                                 
1893                                 print "<td class='feedSelect'><input onclick='toggleSelectPrefRow(this, \"feed\");' 
1894                                 type=\"checkbox\" id=\"FRCHK-".$line["id"]."\"></td>";
1895
1896                                 if (get_pref($link, 'ENABLE_FEED_ICONS')) {
1897                                         print "<td class='feedIcon'>$feed_icon</td>";           
1898                                 }
1899
1900                                 $edit_title = truncate_string($edit_title, 40);
1901                                 $edit_link = truncate_string($edit_link, 60);
1902
1903                                 $parent_title = $line["parent_title"];
1904                                 if ($parent_title) {
1905                                         $parent_title = "<span class='groupPrompt'>(linked to 
1906                                                 $parent_title)</span>";
1907                                 }
1908
1909                                 print "<td><a href=\"javascript:editFeed($feed_id);\">" . 
1910                                         "$edit_title $parent_title" . "</a></td>";              
1911                                         
1912                                 print "<td><a href=\"javascript:editFeed($feed_id);\">" . 
1913                                         $edit_link . "</a></td>";               
1914
1915                                 print "<td align='right'><a href=\"javascript:editFeed($feed_id);\">" . 
1916                                         "$last_updated</a></td>";
1917
1918                                 print "</tr>";
1919         
1920                                 ++$lnum;
1921                         }
1922         
1923                         print "</table>";
1924
1925                         print "<p><span id=\"feedOpToolbar\">";
1926         
1927                         if ($subop == "edit") {
1928                                 print "Edit feed:&nbsp;
1929                                         <input type=\"submit\" class=\"button\" 
1930                                                 onclick=\"javascript:feedEditCancel()\" value=\"Cancel\">
1931                                         <input type=\"submit\" class=\"button\" 
1932                                                 onclick=\"javascript:feedEditSave()\" value=\"Save\">";
1933                         } else {
1934         
1935                                 print "
1936                                         Selection:&nbsp;
1937                                 <input type=\"submit\" class=\"button\" disabled=\"true\"
1938                                         onclick=\"javascript:editSelectedFeed()\" value=\"Edit\">
1939                                 <input type=\"submit\" class=\"button\" disabled=\"true\"
1940                                         onclick=\"javascript:removeSelectedFeeds()\" value=\"Unsubscribe\">";
1941
1942                                 if (get_pref($link, 'ENABLE_FEED_CATS')) {
1943
1944                                         print "&nbsp;|&nbsp;";                          
1945
1946                                         print_feed_cat_select($link, "sfeed_set_fcat", "", "disabled");
1947
1948                                         print " <input type=\"submit\" class=\"button\" disabled=\"true\"
1949                                         onclick=\"javascript:categorizeSelectedFeeds()\" value=\"Recategorize\">";
1950
1951                                 }
1952                                 
1953                                 print "</span>
1954                                         &nbsp;All feeds: <input type=\"submit\" 
1955                                                         class=\"button\" onclick=\"gotoExportOpml()\" 
1956                                                         value=\"Export OPML\">";                        
1957                                 }
1958                 } else {
1959
1960                         print "<p>No feeds defined.</p>";
1961
1962                 }
1963
1964                 if (get_pref($link, 'ENABLE_FEED_CATS')) {
1965
1966                         print "<h3>Edit Categories</h3>";
1967
1968                         print "<div class=\"prefGenericAddBox\">
1969                                 <input id=\"fadd_cat\" 
1970                                         onkeyup=\"toggleSubmitNotEmpty(this, 'catadd_submit_btn')\"
1971                                         size=\"40\">&nbsp;
1972                                 <input 
1973                                         type=\"submit\" class=\"button\" disabled=\"true\" id=\"catadd_submit_btn\"
1974                                         onclick=\"javascript:addFeedCat()\" value=\"Create category\"></div>";
1975         
1976                         $result = db_query($link, "SELECT title,id FROM ttrss_feed_categories
1977                                 WHERE owner_uid = ".$_SESSION["uid"]."
1978                                 ORDER BY title");
1979
1980                         if (db_num_rows($result) != 0) {
1981         
1982                                 print "<form id=\"feed_cat_edit_form\">";
1983                                 
1984                                 print "<p><table width=\"100%\" class=\"prefFeedCatList\" 
1985                                         cellspacing=\"0\" id=\"prefFeedCatList\">";
1986
1987                                 print "<tr><td class=\"selectPrompt\" colspan=\"8\">
1988                                 Select: 
1989                                         <a href=\"javascript:selectPrefRows('fcat', true)\">All</a>,
1990                                         <a href=\"javascript:selectPrefRows('fcat', false)\">None</a>
1991                                 </td</tr>";
1992
1993                                 print "<tr class=\"title\">
1994                                                         <td width=\"5%\">&nbsp;</td><td width=\"80%\">Title</td>
1995                                                 </tr>";
1996                                                 
1997                                 $lnum = 0;
1998                                 
1999                                 while ($line = db_fetch_assoc($result)) {
2000                 
2001                                         $class = ($lnum % 2) ? "even" : "odd";
2002                 
2003                                         $cat_id = $line["id"];
2004                 
2005                                         $edit_cat_id = $_GET["id"];
2006                 
2007                                         if ($subop == "editCat" && $cat_id != $edit_cat_id) {
2008                                                         $class .= "Grayed";
2009                                                         $this_row_id = "";
2010                                         } else {
2011                                                 $this_row_id = "id=\"FCATR-$cat_id\"";
2012                                         }
2013                 
2014                                         print "<tr class=\"$class\" $this_row_id>";
2015                 
2016                                         $edit_title = htmlspecialchars(db_unescape_string($line["title"]));
2017                 
2018                                         if (!$edit_cat_id || $subop != "editCat") {
2019                 
2020                                                 print "<td align='center'><input onclick='toggleSelectPrefRow(this, \"fcat\");' 
2021                                                         type=\"checkbox\" id=\"FCCHK-".$line["id"]."\"></td>";
2022                 
2023                                                 print "<td><a href=\"javascript:editFeedCat($cat_id);\">" . 
2024                                                         $edit_title . "</a></td>";              
2025                 
2026                                         } else if ($cat_id != $edit_cat_id) {
2027                 
2028                                                 print "<td align='center'><input disabled=\"true\" type=\"checkbox\" 
2029                                                         id=\"FRCHK-".$line["id"]."\"></td>";
2030                 
2031                                                 print "<td>$edit_title</td>";           
2032                 
2033                                         } else {
2034                 
2035                                                 print "<td align='center'><input disabled=\"true\" type=\"checkbox\" checked>";
2036                                                 
2037                                                 print "<input type=\"hidden\" name=\"id\" value=\"$cat_id\">";
2038                                                 print "<input type=\"hidden\" name=\"op\" value=\"pref-feeds\">";
2039                                                 print "<input type=\"hidden\" name=\"subop\" value=\"saveCat\">";
2040                                         
2041                                                 print "</td>";
2042                 
2043                                                 print "<td><input name=\"title\" class=\"iedit\" value=\"$edit_title\"></td>";
2044                                                 
2045                                         }
2046                                         
2047                                         print "</tr>";
2048                 
2049                                         ++$lnum;
2050                                 }
2051         
2052                                 print "</table>";
2053
2054                                 print "</form>";
2055         
2056                                 print "<p id=\"catOpToolbar\">";
2057         
2058                                 if ($subop == "editCat") {
2059                                         print "Edit category:&nbsp;
2060                                                 <input type=\"submit\" class=\"button\"
2061                                                         onclick=\"javascript:feedCatEditSave()\" value=\"Save\">
2062                                                 <input type=\"submit\" class=\"button\"
2063                                                         onclick=\"javascript:feedCatEditCancel()\" value=\"Cancel\">";
2064                                         } else {
2065                 
2066                                         print "
2067                                                 Selection:&nbsp;
2068                                         <input type=\"submit\" class=\"button\" disabled=\"true\"
2069                                                 onclick=\"javascript:editSelectedFeedCat()\" value=\"Edit\">
2070                                         <input type=\"submit\" class=\"button\" disabled=\"true\"
2071                                                 onclick=\"javascript:removeSelectedFeedCats()\" value=\"Remove\">";
2072         
2073                                 }
2074         
2075                         } else {
2076                                 print "<p>No feed categories defined.</p>";
2077                         }
2078                 }
2079
2080                 print "<h3>Import OPML</h3>
2081                 <form   enctype=\"multipart/form-data\" method=\"POST\" action=\"opml.php\">
2082                         File: <input id=\"opml_file\" name=\"opml_file\" type=\"file\">&nbsp;
2083                         <input class=\"button\" name=\"op\" onclick=\"return validateOpmlImport();\"
2084                                 type=\"submit\" value=\"Import\">
2085                         </form>";
2086
2087         }
2088
2089         if ($op == "pref-filters") {
2090
2091                 $subop = $_GET["subop"];
2092                 $quiet = $_GET["quiet"];
2093
2094                 if ($subop == "editSave") {
2095
2096                         $reg_exp = db_escape_string(trim($_GET["reg_exp"]));
2097                         $filter_type = db_escape_string(trim($_GET["filter_type"]));
2098                         $filter_id = db_escape_string($_GET["id"]);
2099                         $feed_id = db_escape_string($_GET["feed_id"]);
2100                         $action_id = db_escape_string($_GET["action_id"]); 
2101
2102                         if (!$feed_id) {
2103                                 $feed_id = 'NULL';
2104                         } else {
2105                                 $feed_id = sprintf("'%s'", db_escape_string($feed_id));
2106                         }
2107                         
2108                         $result = db_query($link, "UPDATE ttrss_filters SET 
2109                                         reg_exp = '$reg_exp', 
2110                                         feed_id = $feed_id,
2111                                         action_id = '$action_id',
2112                                         filter_type = '$filter_type'
2113                                 WHERE id = '$filter_id'");
2114                 }
2115
2116                 if ($subop == "remove") {
2117
2118                         if (!WEB_DEMO_MODE) {
2119
2120                                 $ids = split(",", db_escape_string($_GET["ids"]));
2121
2122                                 foreach ($ids as $id) {
2123                                         db_query($link, "DELETE FROM ttrss_filters WHERE id = '$id'");
2124                                         
2125                                 }
2126                         }
2127                 }
2128
2129                 if ($subop == "add") {
2130                 
2131                         if (!WEB_DEMO_MODE) {
2132
2133                                 $regexp = db_escape_string(trim($_GET["reg_exp"]));
2134                                 $match_id = db_escape_string(trim($_GET["match_id"]));
2135                                 $feed_id = db_escape_string($_GET["feed_id"]);
2136                                 $action_id = db_escape_string($_GET["action_id"]); 
2137
2138                                 if (!$feed_id) {
2139                                         $feed_id = 'NULL';
2140                                 } else {
2141                                         $feed_id = sprintf("'%s'", db_escape_string($feed_id));
2142                                 }
2143
2144                                 $result = db_query($link,
2145                                         "INSERT INTO ttrss_filters (reg_exp,filter_type,owner_uid,feed_id,
2146                                                 action_id) 
2147                                         VALUES 
2148                                                 ('$regexp', '$match_id','".$_SESSION["uid"]."', 
2149                                                         $feed_id, '$action_id')");
2150                         } 
2151                 }
2152
2153                 if ($quiet) return;
2154
2155 //              print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
2156
2157                 $result = db_query($link, "SELECT id,description 
2158                         FROM ttrss_filter_types ORDER BY description");
2159
2160                 $filter_types = array();
2161
2162                 while ($line = db_fetch_assoc($result)) {
2163                         //array_push($filter_types, $line["description"]);
2164                         $filter_types[$line["id"]] = $line["description"];
2165                 }
2166
2167                 print "<input type=\"submit\" 
2168                         class=\"button\" 
2169                         onclick=\"javascript:displayDlg('quickAddFilter', false)\" 
2170                         value=\"Create filter\">"; 
2171
2172                 $result = db_query($link, "SELECT 
2173                                 ttrss_filters.id AS id,reg_exp,
2174                                 ttrss_filter_types.name AS filter_type_name,
2175                                 ttrss_filter_types.description AS filter_type_descr,
2176                                 feed_id,
2177                                 ttrss_filter_actions.description AS action_description,
2178                                 ttrss_feeds.title AS feed_title
2179                         FROM 
2180                                 ttrss_filter_types,ttrss_filter_actions,ttrss_filters LEFT JOIN
2181                                         ttrss_feeds ON (ttrss_filters.feed_id = ttrss_feeds.id)
2182                         WHERE
2183                                 filter_type = ttrss_filter_types.id AND
2184                                 ttrss_filter_actions.id = action_id AND
2185                                 ttrss_filters.owner_uid = ".$_SESSION["uid"]."
2186                         ORDER by reg_exp");
2187
2188                 if (db_num_rows($result) != 0) {
2189
2190                         print "<form id=\"filter_edit_form\">";                 
2191
2192                         print "<p><table width=\"100%\" cellspacing=\"0\" class=\"prefFilterList\" 
2193                                 id=\"prefFilterList\">";
2194
2195                         print "<tr><td class=\"selectPrompt\" colspan=\"8\">
2196                                 Select: 
2197                                         <a href=\"javascript:selectPrefRows('filter', true)\">All</a>,
2198                                         <a href=\"javascript:selectPrefRows('filter', false)\">None</a>
2199                                 </td</tr>";
2200
2201                         print "<tr class=\"title\">
2202                                                 <td align='center' width=\"5%\">&nbsp;</td>
2203                                                 <td width=\"20%\">Filter expression</td>
2204                                                 <td width=\"20%\">Feed</td>
2205                                                 <td width=\"15%\">Match</td>
2206                                                 <td width=\"15%\">Action</td>";
2207
2208                         $lnum = 0;
2209                         
2210                         while ($line = db_fetch_assoc($result)) {
2211         
2212                                 $class = ($lnum % 2) ? "even" : "odd";
2213         
2214                                 $filter_id = $line["id"];
2215                                 $edit_filter_id = $_GET["id"];
2216         
2217                                 if ($subop == "edit" && $filter_id != $edit_filter_id) {
2218                                         $class .= "Grayed";
2219                                         $this_row_id = "";
2220                                 } else {
2221                                         $this_row_id = "id=\"FILRR-$filter_id\"";
2222                                 }
2223         
2224                                 print "<tr class=\"$class\" $this_row_id>";
2225         
2226                                 $line["regexp"] = htmlspecialchars($line["reg_exp"]);
2227         
2228                                 if (!$line["feed_title"]) $line["feed_title"] = "All feeds";
2229         
2230                                 if (!$edit_filter_id || $subop != "edit") {
2231
2232                                         print "<td align='center'><input onclick='toggleSelectPrefRow(this, \"filter\");' 
2233                                         type=\"checkbox\" id=\"FICHK-".$line["id"]."\"></td>";
2234         
2235                                         print "<td><a href=\"javascript:editFilter($filter_id);\">" . 
2236                                                 $line["reg_exp"] . "</td>";             
2237         
2238                                         print "<td><a href=\"javascript:editFilter($filter_id);\">" . 
2239                                                 $line["feed_title"] . "</td>";                  
2240         
2241                                         print "<td><a href=\"javascript:editFilter($filter_id);\">" . 
2242                                                 $line["filter_type_descr"] . "</td>";           
2243                 
2244                                         print "<td><a href=\"javascript:editFilter($filter_id);\">" . 
2245                                                 $line["action_description"] . "</td>";                  
2246         
2247                                 } else if ($filter_id != $edit_filter_id) {
2248         
2249                                         if (!$line["description"]) $line["description"] = "[No description]";
2250         
2251                                         print "<td align='center'><input disabled=\"true\" type=\"checkbox\" 
2252                                                 id=\"FICHK-".$line["id"]."\"></td>";
2253         
2254                                         print "<td>".$line["reg_exp"]."</td>";          
2255                                         print "<td>".$line["feed_title"]."</td>";
2256                                         print "<td>".$line["filter_type_descr"]."</td>";
2257                                         print "<td>".$line["action_description"]."</td>";               
2258
2259                                 } else {
2260         
2261                                         print "<td align='center'><input disabled=\"true\" type=\"checkbox\" checked>";
2262                                         
2263                                         print "<input type=\"hidden\" name=\"id\" value=\"$filter_id\">";
2264                                         print "<input type=\"hidden\" name=\"op\" value=\"pref-filters\">";
2265                                         print "<input type=\"hidden\" name=\"subop\" value=\"editSave\">";
2266
2267                                         print "</td>";
2268         
2269                                         print "<td><input class=\"iedit\" name=\"reg_exp\" value=\"".$line["reg_exp"].
2270                                                 "\"></td>";
2271         
2272                                         print "<td>";   
2273                                         print_feed_select($link, "feed_id", $line["feed_id"], "class=\"iedit\"");
2274                                         print "</td>";
2275                                         
2276                                         print "<td>";
2277                                         print_select_hash("filter_type", $line["filter_type"], $filter_types,   
2278                                                 "class=\"iedit\"");
2279                                         print "</td>";
2280
2281                                         print "<td>";
2282                                         print "<select name=\"action_id\" class=\"iedit\">";
2283         
2284                                         $tmp_result = db_query($link, "SELECT id,description FROM ttrss_filter_actions
2285                                                 ORDER BY description");
2286
2287                                         while ($tmp_line = db_fetch_assoc($tmp_result)) {
2288                                                 if ($tmp_line["description"] == $line["action_description"]) {
2289                                                         $is_selected = "selected";
2290                                                 } else {
2291                                                         $is_selected = "";
2292                                                 }
2293                                                 printf("<option $is_selected value='%d'>%s</option>", 
2294                                                         $tmp_line["id"], $tmp_line["description"]);
2295                                         }
2296         
2297                                         print "</select></td>";
2298
2299                                         print "</td>";
2300                                 }
2301                                 
2302                                 print "</tr>";
2303         
2304                                 ++$lnum;
2305                         }
2306         
2307                         if ($lnum == 0) {
2308                                 print "<tr><td colspan=\"4\" align=\"center\">No filters defined.</td></tr>";
2309                         }
2310         
2311                         print "</table>";
2312
2313                         print "</form>";
2314         
2315                         print "<p id=\"filterOpToolbar\">";
2316         
2317                         if ($subop == "edit") {
2318                                 print "Edit filter:
2319                                         <input type=\"submit\" class=\"button\" 
2320                                                 onclick=\"javascript:filterEditSave()\" value=\"Save\">
2321                                         <input type=\"submit\" class=\"button\" 
2322                                                 onclick=\"javascript:filterEditCancel()\" value=\"Cancel\">";
2323                                                 
2324                         } else {
2325         
2326                                 print "
2327                                         Selection:
2328                                 <input type=\"submit\" class=\"button\" disabled=\"true\"
2329                                         onclick=\"javascript:editSelectedFilter()\" value=\"Edit\">
2330                                 <input type=\"submit\" class=\"button\" disabled=\"true\"
2331                                         onclick=\"javascript:removeSelectedFilters()\" value=\"Remove\">";
2332                         }                       
2333
2334                 } else {
2335
2336                         print "<p>No filters defined.</p>";
2337
2338                 }
2339         }
2340
2341         // We need to accept raw SQL data in label queries, so not everything is escaped
2342         // here, this is by design. If you don't like the whole idea, disable labels
2343         // altogether with GLOBAL_ENABLE_LABELS = false
2344
2345         if ($op == "pref-labels") {
2346
2347                 if (!GLOBAL_ENABLE_LABELS) { 
2348                         return; 
2349                 }
2350
2351                 $subop = $_GET["subop"];
2352
2353                 if ($subop == "test") {
2354
2355                         $expr = trim($_GET["expr"]);
2356                         $descr = trim($_GET["descr"]);
2357
2358                         print "<div id=\"infoBoxTitle\">Test label: $descr</div>";
2359
2360                         print "<div class='infoBoxContents'>";
2361                 
2362 #                       print "<h1>Label &laquo;$descr&raquo;</h1>";
2363
2364 //                      print "<p><b>Expression</b>: $expr</p>";
2365
2366                         $result = db_query($link, 
2367                                 "SELECT count(id) AS num_matches
2368                                         FROM ttrss_entries,ttrss_user_entries
2369                                         WHERE ($expr) AND 
2370                                                 ttrss_user_entries.ref_id = ttrss_entries.id AND
2371                                                 owner_uid = " . $_SESSION["uid"]);
2372
2373                         $num_matches = db_fetch_result($result, 0, "num_matches");;
2374                         
2375                         if ($num_matches > 0) { 
2376
2377                                 print "<p>Query returned <b>$num_matches</b> matches, showing first 15:</p>";
2378
2379                                 $result = db_query($link, 
2380                                         "SELECT title, 
2381                                                 (SELECT title FROM ttrss_feeds WHERE id = feed_id) AS feed_title
2382                                         FROM ttrss_entries,ttrss_user_entries
2383                                                         WHERE ($expr) AND 
2384                                                         ttrss_user_entries.ref_id = ttrss_entries.id
2385                                                         AND owner_uid = " . $_SESSION["uid"] . " 
2386                                                         ORDER BY date_entered DESC LIMIT 15");
2387
2388                                 print "<ul class=\"filterTestResults\">";
2389
2390                                 $row_class = "even";
2391                                 
2392                                 while ($line = db_fetch_assoc($result)) {
2393                                         $row_class = toggleEvenOdd($row_class);
2394                                         
2395                                         print "<li class=\"$row_class\">".$line["title"].
2396                                                 " <span class=\"insensitive\">(".$line["feed_title"].")</span></li>";
2397                                 }
2398                                 print "</ul>";
2399
2400                         } else {
2401                                 print "<p>Query didn't return any matches.</p>";
2402                         }
2403
2404                         print "</div>";
2405
2406                         print "<div align='center'>
2407                                 <input type='submit' class='button'                     
2408                                 onclick=\"closeInfoBox()\" value=\"Close this window\"></div>";
2409                         return;
2410                 }
2411
2412                 if ($subop == "editSave") {
2413
2414                         $sql_exp = trim($_GET["sql_exp"]);
2415                         $descr = db_escape_string(trim($_GET["description"]));
2416                         $label_id = db_escape_string($_GET["id"]);
2417                         
2418                         $result = db_query($link, "UPDATE ttrss_labels SET 
2419                                 sql_exp = '$sql_exp', 
2420                                 description = '$descr'
2421                                 WHERE id = '$label_id'");
2422                 }
2423
2424                 if ($subop == "remove") {
2425
2426                         if (!WEB_DEMO_MODE) {
2427
2428                                 $ids = split(",", db_escape_string($_GET["ids"]));
2429
2430                                 foreach ($ids as $id) {
2431                                         db_query($link, "DELETE FROM ttrss_labels WHERE id = '$id'");
2432                                         
2433                                 }
2434                         }
2435                 }
2436
2437                 if ($subop == "add") {
2438                 
2439                         if (!WEB_DEMO_MODE) {
2440
2441                                 // no escaping is done here on purpose
2442                                 $exp = trim($_GET["exp"]);
2443                                         
2444                                 $result = db_query($link,
2445                                         "INSERT INTO ttrss_labels (sql_exp,description,owner_uid) 
2446                                                 VALUES ('$exp', '$exp', '".$_SESSION["uid"]."')");
2447                         } 
2448                 }
2449
2450                 print "<div class=\"prefGenericAddBox\">
2451                         <input size=\"40\"                      
2452                                 onkeyup=\"toggleSubmitNotEmpty(this, 'label_create_btn')\"
2453                                 id=\"ladd_expr\">&nbsp;";
2454                         
2455                 print"<input type=\"submit\" class=\"button\" 
2456                         disabled=\"true\" id=\"label_create_btn\"
2457                         onclick=\"javascript:addLabel()\" value=\"Create label\"></div>";
2458
2459                 $result = db_query($link, "SELECT 
2460                                 id,sql_exp,description
2461                         FROM 
2462                                 ttrss_labels 
2463                         WHERE 
2464                                 owner_uid = ".$_SESSION["uid"]."
2465                         ORDER by description");
2466
2467 //              print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
2468
2469                 if (db_num_rows($result) != 0) {
2470
2471                         print "<form id=\"label_edit_form\">";
2472
2473                         print "<p><table width=\"100%\" cellspacing=\"0\" 
2474                                 class=\"prefLabelList\" id=\"prefLabelList\">";
2475
2476                         print "<tr><td class=\"selectPrompt\" colspan=\"8\">
2477                                 Select: 
2478                                         <a href=\"javascript:selectPrefRows('label', true)\">All</a>,
2479                                         <a href=\"javascript:selectPrefRows('label', false)\">None</a>
2480                                 </td</tr>";
2481
2482                         print "<tr class=\"title\">
2483                                                 <td width=\"5%\">&nbsp;</td>
2484                                                 <td width=\"40%\">SQL expression
2485                                                 <a class=\"helpLink\" href=\"javascript:displayHelpInfobox(1)\">(?)</a>
2486                                                 </td>
2487                                                 <td width=\"40%\">Caption</td></tr>";
2488                         
2489                         $lnum = 0;
2490                         
2491                         while ($line = db_fetch_assoc($result)) {
2492         
2493                                 $class = ($lnum % 2) ? "even" : "odd";
2494         
2495                                 $label_id = $line["id"];
2496                                 $edit_label_id = $_GET["id"];
2497         
2498                                 if ($subop == "edit" && $label_id != $edit_label_id) {
2499                                         $class .= "Grayed";
2500                                         $this_row_id = "";
2501                                 } else {
2502                                         $this_row_id = "id=\"LILRR-$label_id\"";
2503                                 }
2504         
2505                                 print "<tr class=\"$class\" $this_row_id>";
2506         
2507                                 $line["sql_exp"] = htmlspecialchars($line["sql_exp"]);
2508                                 $line["description"] = htmlspecialchars($line["description"]);
2509         
2510                                 if (!$edit_label_id || $subop != "edit") {
2511         
2512                                         if (!$line["description"]) $line["description"] = "[No caption]";
2513         
2514                                         print "<td align='center'><input onclick='toggleSelectPrefRow(this, \"label\");' 
2515                                         type=\"checkbox\" id=\"LICHK-".$line["id"]."\"></td>";
2516         
2517                                         print "<td><a href=\"javascript:editLabel($label_id);\">" . 
2518                                                 $line["sql_exp"] . "</td>";             
2519                                                 
2520                                         print "<td><a href=\"javascript:editLabel($label_id);\">" . 
2521                                                 $line["description"] . "</td>";                 
2522         
2523                                 } else if ($label_id != $edit_label_id) {
2524         
2525                                         if (!$line["description"]) $line["description"] = "[No description]";
2526         
2527                                         print "<td align='center'><input disabled=\"true\" type=\"checkbox\" 
2528                                                 id=\"LICHK-".$line["id"]."\"></td>";
2529         
2530                                         print "<td>".$line["sql_exp"]."</td>";          
2531                                         print "<td>".$line["description"]."</td>";              
2532         
2533                                 } else {
2534         
2535                                         print "<td align='center'><input disabled=\"true\" type=\"checkbox\" checked>";
2536
2537                                         print "<input type=\"hidden\" name=\"id\" value=\"$label_id\">";
2538                                         print "<input type=\"hidden\" name=\"op\" value=\"pref-labels\">";
2539                                         print "<input type=\"hidden\" name=\"subop\" value=\"editSave\">";
2540                                         
2541                                         print "</td>";
2542         
2543                                         print "<td><input class=\"iedit\" name=\"sql_exp\" value=\"".$line["sql_exp"].
2544                                                 "\"></td>";
2545         
2546                                         print "<td><input class=\"iedit\" name=\"description\" value=\"".$line["description"].
2547                                                 "\"></td>";                                                     
2548                                 }
2549                                         
2550                                 
2551                                 print "</tr>";
2552         
2553                                 ++$lnum;
2554                         }
2555         
2556                         if ($lnum == 0) {
2557                                 print "<tr><td colspan=\"4\" align=\"center\">No labels defined.</td></tr>";
2558                         }
2559         
2560                         print "</table>";
2561
2562                         print "</form>";
2563         
2564                         print "<p id=\"labelOpToolbar\">";
2565         
2566                         if ($subop == "edit") {
2567                                 print "Edit label:
2568                                         <input type=\"submit\" class=\"button\" 
2569                                                 onclick=\"javascript:labelTest()\" value=\"Test\">
2570                                         <input type=\"submit\" class=\"button\" 
2571                                                 onclick=\"javascript:labelEditSave()\" value=\"Save\">
2572                                         <input type=\"submit\" class=\"button\" 
2573                                                 onclick=\"javascript:labelEditCancel()\" value=\"Cancel\">";
2574                                                 
2575                         } else {        
2576                                 print "
2577                                         Selection:
2578                                 <input type=\"submit\" class=\"button\" disabled=\"true\"
2579                                         onclick=\"javascript:editSelectedLabel()\" value=\"Edit\">
2580                                 <input type=\"submit\" class=\"button\" disabled=\"true\"
2581                                         onclick=\"javascript:removeSelectedLabels()\" value=\"Remove\">";
2582                         }
2583                 } else {
2584                         print "<p>No labels defined.</p>";
2585                 }
2586         }
2587
2588         if ($op == "error") {
2589                 print "<div width=\"100%\" align='center'>";
2590                 $msg = $_GET["msg"];
2591                 print $msg;
2592                 print "</div>";
2593         }
2594
2595         if ($op == "help") {
2596                 if (!$_GET["noheaders"]) {
2597                         print "<html><head>
2598                                 <title>Tiny Tiny RSS : Help</title>
2599                                 <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">
2600                                 <script type=\"text/javascript\" src=\"prototype.js\"></script>
2601                                 <script type=\"text/javascript\" src=\"functions.js?$script_dt_add\"></script>
2602                                 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
2603                                 </head><body>";
2604                 }
2605
2606                 $tid = sprintf("%d", $_GET["tid"]);
2607
2608                 print "<div id=\"infoBoxTitle\">Help</div>";
2609
2610                 print "<div class='infoBoxContents'>";
2611
2612                 if (file_exists("help/$tid.php")) {
2613                         include("help/$tid.php");
2614                 } else {
2615                         print "<p>Help topic not found.</p>";
2616                 }
2617
2618                 print "</div>";
2619
2620                 print "<div align='center'>
2621                         <input type='submit' class='button'                     
2622                         onclick=\"closeInfoBox()\" value=\"Close this window\"></div>";
2623
2624                 if (!$_GET["noheaders"]) { 
2625                         print "</body></html>";
2626                 }
2627
2628         }
2629
2630         if ($op == "dlg") {
2631                 $id = $_GET["id"];
2632                 $param = $_GET["param"];
2633
2634                 if ($id == "quickAddFeed") {
2635
2636                         print "<div id=\"infoBoxTitle\">Subscribe to feed</div>";
2637                         print "<div class=\"infoBoxContents\">";
2638
2639                         print "<form id='feed_add_form'>";
2640
2641                         print "<input type=\"hidden\" name=\"op\" value=\"pref-feeds\">";
2642                         print "<input type=\"hidden\" name=\"quiet\" value=\"1\">";
2643                         print "<input type=\"hidden\" name=\"subop\" value=\"add\">"; 
2644
2645                         print "<table width='100%'>
2646                         <tr><td>Feed URL:</td><td>
2647                                 <input class=\"iedit\" onblur=\"javascript:enableHotkeys()\" 
2648                                         onkeyup=\"toggleSubmitNotEmpty(this, 'fadd_submit_btn')\"
2649                                         onfocus=\"javascript:disableHotkeys()\" name=\"feed_url\"></td></tr>";
2650                 
2651                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
2652                                 print "<tr><td>Category:</td><td>";
2653                                 print_feed_cat_select($link, "cat_id");                 
2654                                 print "</td></tr>";
2655                         }
2656
2657                         print "</table>";
2658                         print "</form>";
2659
2660                         print "<div align='right'>
2661                                 <input class=\"button\"
2662                                         id=\"fadd_submit_btn\" disabled=\"true\"
2663                                         type=\"submit\" onclick=\"javascript:qafAdd()\" value=\"Subscribe\">
2664                                 <input class=\"button\"
2665                                         type=\"submit\" onclick=\"javascript:closeInfoBox()\" 
2666                                         value=\"Cancel\"></div>";
2667
2668                 }
2669
2670                 if ($id == "search") {
2671
2672                         print "<div id=\"infoBoxTitle\">Search</div>";
2673                         print "<div class=\"infoBoxContents\">";
2674
2675                         print "<form id='search_form'>";
2676
2677                         $active_feed_id = db_escape_string($_GET["param"]);
2678
2679                         print "<table width='100%'><tr><td>Search:</td><td>";
2680                         
2681                         print "<input name=\"query\" class=\"iedit\" 
2682                                 onkeypress=\"return filterCR(event)\"
2683                                 onkeyup=\"toggleSubmitNotEmpty(this, 'search_submit_btn')\"
2684                                 value=\"\">
2685                         </td></tr>";
2686                         
2687                         print "<tr><td>Where:</td><td>";
2688                         
2689                         print "<select name=\"search_mode\">
2690                                 <option value=\"all_feeds\">All feeds</option>";
2691                         
2692                         $feed_title = getFeedTitle($link, $active_feed_id);
2693                         $feed_cat_title = getFeedCatTitle($link, $active_feed_id);
2694                         
2695                         if ($active_feed_id) {                          
2696                                 print "<option selected value=\"this_feed\">This feed ($feed_title)</option>";
2697                         } else {
2698                                 print "<option disabled>This feed</option>";
2699                         }
2700
2701                         if (get_pref($link, 'ENABLE_FEED_CATS') && $active_feed_id && $active_feed_id > 0) {
2702                                 print "<option value=\"this_cat\">This category ($feed_cat_title)</option>";
2703                         } else {
2704                                 print "<option disabled>This category</option>";
2705                         }
2706
2707                         print "</select></td></tr>"; 
2708
2709                         print "<tr><td>Match on:</td><td>";
2710
2711                         $search_fields = array(
2712                                 "title" => "Title",
2713                                 "content" => "Content",
2714                                 "both" => "Title or content");
2715
2716                         print_select_hash("match_on", 3, $search_fields); 
2717                                 
2718                         print "</td></tr></table>";
2719
2720                         print "</form>";
2721
2722                         print "<div align=\"right\">
2723                         <input type=\"submit\" 
2724                                 class=\"button\" onclick=\"javascript:search()\" 
2725                                 id=\"search_submit_btn\" disabled=\"true\"
2726                                 value=\"Search\">
2727                         <input class=\"button\"
2728                                 type=\"submit\" onclick=\"javascript:searchCancel()\" 
2729                                 value=\"Cancel\"></div>";
2730
2731                         print "</div>";
2732
2733                 }
2734
2735                 if ($id == "quickAddFilter") {
2736
2737                         print "<div id=\"infoBoxTitle\">Create filter</div>";
2738                         print "<div class=\"infoBoxContents\">";
2739
2740                         print "<form id=\"filter_add_form\">";
2741
2742                         print "<input type=\"hidden\" name=\"op\" value=\"pref-filters\">";
2743                         print "<input type=\"hidden\" name=\"quiet\" value=\"1\">";
2744                         print "<input type=\"hidden\" name=\"subop\" value=\"add\">"; 
2745
2746 //                      print "<div class=\"notice\"><b>Note:</b> filter will only apply to new articles.</div>";
2747                         
2748                         $result = db_query($link, "SELECT id,description 
2749                                 FROM ttrss_filter_types ORDER BY description");
2750         
2751                         $filter_types = array();
2752         
2753                         while ($line = db_fetch_assoc($result)) {
2754                                 //array_push($filter_types, $line["description"]);
2755                                 $filter_types[$line["id"]] = $line["description"];
2756                         }
2757
2758                         print "<table width='100%'>";
2759
2760                         print "<tr><td>Match:</td>
2761                                 <td><input onkeypress=\"return filterCR(event)\"
2762                                          onkeyup=\"toggleSubmitNotEmpty(this, 'infobox_submit')\"
2763                                         name=\"reg_exp\" size=\"30\">&nbsp;";
2764                         
2765                         print_select_hash("match_id", 1, $filter_types);        
2766         
2767                         print "</td></tr>";
2768                         print "<tr><td>Feed:</td><td>";
2769
2770                         print_feed_select($link, "feed_id");
2771                         
2772                         print "</td></tr>";
2773         
2774                         print "<tr><td>Action:</td>";
2775         
2776                         print "<td><select name=\"action_id\">";
2777         
2778                         $result = db_query($link, "SELECT id,description FROM ttrss_filter_actions 
2779                                 ORDER BY name");
2780
2781                         while ($line = db_fetch_assoc($result)) {
2782                                 printf("<option value='%d'>%s</option>", $line["id"], $line["description"]);
2783                         }
2784         
2785                         print "</select>";
2786
2787                         print "</td></tr></table>";
2788
2789                         print "</form>";
2790
2791                         print "<div align='right'>";
2792
2793                         print "<input type=\"submit\" 
2794                                 id=\"infobox_submit\"
2795                                 class=\"button\" onclick=\"qaddFilter()\" 
2796                                 disabled=\"true\" value=\"Create\"> ";
2797
2798                         print "<input class=\"button\"
2799                                 type=\"submit\" onclick=\"closeInfoBox()\" 
2800                                 value=\"Cancel\">";
2801
2802                         print "</div>";
2803
2804 //                      print "</td></tr></table>"; 
2805
2806                 }
2807
2808                 print "</div>";
2809
2810         }
2811
2812         // update feeds of all users, may be used anonymously
2813         if ($op == "globalUpdateFeeds") {
2814
2815                 $result = db_query($link, "SELECT id FROM ttrss_users");
2816
2817                 while ($line = db_fetch_assoc($result)) {
2818                         $user_id = $line["id"];
2819 //                      print "<!-- updating feeds of uid $user_id -->";
2820                         update_all_feeds($link, false, $user_id);
2821                 }
2822
2823                 print "<rpc-reply>
2824                         <message msg=\"All feeds updated\"/>
2825                 </rpc-reply>";
2826
2827         }
2828
2829         if ($op == "pref-prefs") {
2830
2831                 $subop = $_REQUEST["subop"];
2832
2833                 if ($subop == "Save configuration") {
2834
2835                         if (WEB_DEMO_MODE) {
2836                                 header("Location: prefs.php");
2837                                 return;
2838                         }
2839
2840                         $_SESSION["prefs_op_result"] = "save-config";
2841
2842                         $_SESSION["prefs_cache"] = false;
2843
2844                         foreach (array_keys($_POST) as $pref_name) {
2845                         
2846                                 $pref_name = db_escape_string($pref_name);
2847                                 $value = db_escape_string($_POST[$pref_name]);
2848
2849                                 $result = db_query($link, "SELECT type_name 
2850                                         FROM ttrss_prefs,ttrss_prefs_types 
2851                                         WHERE pref_name = '$pref_name' AND type_id = ttrss_prefs_types.id");
2852
2853                                 if (db_num_rows($result) > 0) {
2854
2855                                         $type_name = db_fetch_result($result, 0, "type_name");
2856
2857 //                                      print "$pref_name : $type_name : $value<br>";
2858
2859                                         if ($type_name == "bool") {
2860                                                 if ($value == "1") {
2861                                                         $value = "true";
2862                                                 } else {
2863                                                         $value = "false";
2864                                                 }
2865                                         } else if ($type_name == "integer") {
2866                                                 $value = sprintf("%d", $value);
2867                                         }
2868
2869 //                                      print "$pref_name : $type_name : $value<br>";
2870
2871                                         db_query($link, "UPDATE ttrss_user_prefs SET value = '$value' 
2872                                                 WHERE pref_name = '$pref_name' AND owner_uid = ".$_SESSION["uid"]);
2873
2874                                 }
2875
2876                                 header("Location: prefs.php");
2877
2878                         }
2879
2880                 } else if ($subop == "getHelp") {
2881
2882                         $pref_name = db_escape_string($_GET["pn"]);
2883
2884                         $result = db_query($link, "SELECT help_text FROM ttrss_prefs
2885                                 WHERE pref_name = '$pref_name'");
2886
2887                         if (db_num_rows($result) > 0) {
2888                                 $help_text = db_fetch_result($result, 0, "help_text");
2889                                 print $help_text;
2890                         } else {
2891                                 print "Unknown option: $pref_name";
2892                         }
2893
2894                 } else if ($subop == "Change e-mail") {
2895
2896                         if (WEB_DEMO_MODE) {
2897                                 header("Location: prefs.php");
2898                                 return;
2899                         }
2900
2901                         $email = db_escape_string($_GET["email"]);
2902                         $active_uid = $_SESSION["uid"];
2903
2904                         if ($email) {
2905                                 db_query($link, "UPDATE ttrss_users SET email = '$email' 
2906                                                 WHERE id = '$active_uid'");                             
2907                         }
2908
2909                         header("Location: prefs.php");
2910
2911                 } else if ($subop == "Change password") {
2912
2913                         if (WEB_DEMO_MODE) {
2914                                 header("Location: prefs.php");
2915                                 return;
2916                         }
2917
2918                         $old_pw = $_POST["OLD_PASSWORD"];
2919                         $new_pw = $_POST["OLD_PASSWORD"];
2920
2921                         $old_pw_hash = 'SHA1:' . sha1($_POST["OLD_PASSWORD"]);
2922                         $new_pw_hash = 'SHA1:' . sha1($_POST["NEW_PASSWORD"]);
2923
2924                         $active_uid = $_SESSION["uid"];
2925
2926                         if ($old_pw && $new_pw) {
2927
2928                                 $login = db_escape_string($_SERVER['PHP_AUTH_USER']);
2929
2930                                 $result = db_query($link, "SELECT id FROM ttrss_users WHERE 
2931                                         id = '$active_uid' AND (pwd_hash = '$old_pw' OR 
2932                                                 pwd_hash = '$old_pw_hash')");
2933
2934                                 if (db_num_rows($result) == 1) {
2935                                         db_query($link, "UPDATE ttrss_users SET pwd_hash = '$new_pw_hash' 
2936                                                 WHERE id = '$active_uid'");                             
2937
2938                                         $_SESSION["pwd_change_result"] = "ok";
2939                                 } else {
2940                                         $_SESSION["pwd_change_result"] = "failed";                                      
2941                                 }
2942                         }
2943
2944                         header("Location: prefs.php");
2945
2946                 } else if ($subop == "Reset to defaults") {
2947
2948                         if (WEB_DEMO_MODE) {
2949                                 header("Location: prefs.php");
2950                                 return;
2951                         }
2952
2953                         $_SESSION["prefs_op_result"] = "reset-to-defaults";
2954
2955                         if (DB_TYPE == "pgsql") {
2956                                 db_query($link,"UPDATE ttrss_user_prefs 
2957                                         SET value = ttrss_prefs.def_value 
2958                                         WHERE owner_uid = '".$_SESSION["uid"]."' AND
2959                                         ttrss_prefs.pref_name = ttrss_user_prefs.pref_name");
2960                         } else {
2961                                 db_query($link, "DELETE FROM ttrss_user_prefs 
2962                                         WHERE owner_uid = ".$_SESSION["uid"]);
2963                                 initialize_user_prefs($link, $_SESSION["uid"]);
2964                         }
2965
2966                         header("Location: prefs.php");
2967
2968                 } else if ($subop == "Change theme") {
2969
2970                         $theme = db_escape_string($_POST["theme"]);
2971
2972                         if ($theme == "Default") {
2973                                 $theme_qpart = 'NULL';
2974                         } else {
2975                                 $theme_qpart = "'$theme'";
2976                         }
2977
2978                         $result = db_query($link, "SELECT id,theme_path FROM ttrss_themes
2979                                 WHERE theme_name = '$theme'");
2980
2981                         if (db_num_rows($result) == 1) {
2982                                 $theme_id = db_fetch_result($result, 0, "id");
2983                                 $theme_path = db_fetch_result($result, 0, "theme_path");
2984                         } else {
2985                                 $theme_id = "NULL";
2986                                 $theme_path = "";
2987                         }
2988
2989                         db_query($link, "UPDATE ttrss_users SET
2990                                 theme_id = $theme_id WHERE id = " . $_SESSION["uid"]);
2991
2992                         $_SESSION["theme"] = $theme_path;
2993
2994                         header("Location: prefs.php");
2995
2996                 } else {
2997
2998                         if (!SINGLE_USER_MODE) {
2999
3000                                 $result = db_query($link, "SELECT id,email FROM ttrss_users
3001                                         WHERE id = ".$_SESSION["uid"]." AND (pwd_hash = 'password' OR
3002                                                 pwd_hash = 'SHA1:".sha1("password")."')");
3003
3004                                 if (db_num_rows($result) != 0) {
3005                                         print "<div class=\"warning\"> 
3006                                                 Your password is at default value, please change it.
3007                                         </div>";
3008                                 }
3009
3010                                 if ($_SESSION["pwd_change_result"] == "failed") {
3011                                         print "<div class=\"warning\"> 
3012                                                         There was an error while changing your password.
3013                                                 </div>";
3014                                 }
3015
3016                                 if ($_SESSION["pwd_change_result"] == "ok") {
3017                                         print "<div class=\"notice\"> 
3018                                                         Password changed successfully.
3019                                                 </div>";
3020                                 }
3021
3022                                 $_SESSION["pwd_change_result"] = "";
3023
3024                                 if ($_SESSION["prefs_op_result"] == "reset-to-defaults") {
3025                                         print "<div class=\"notice\"> 
3026                                                         Your configuration was reset to defaults.
3027                                                 </div>";
3028                                 }
3029
3030                                 if ($_SESSION["prefs_op_result"] == "save-config") {
3031                                         print "<div class=\"notice\"> 
3032                                                         Your configuration was saved successfully.
3033                                                 </div>";
3034                                 }
3035
3036                                 $_SESSION["prefs_op_result"] = "";
3037
3038                                 print "<form action=\"backend.php\" method=\"GET\">";
3039         
3040                                 print "<table width=\"100%\" class=\"prefPrefsList\">";
3041                                 print "<tr><td colspan='3'><h3>Personal data</h3></tr></td>";
3042
3043                                 $result = db_query($link, "SELECT email FROM ttrss_users
3044                                         WHERE id = ".$_SESSION["uid"]);
3045                                         
3046                                 $email = db_fetch_result($result, 0, "email");
3047         
3048                                 print "<tr><td width=\"40%\">E-mail</td>";
3049                                 print "<td><input class=\"editbox\" name=\"email\" 
3050                                         value=\"$email\"></td></tr>";
3051         
3052                                 print "</table>";
3053         
3054                                 print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
3055         
3056                                 print "<p><input class=\"button\" type=\"submit\" 
3057                                         value=\"Change e-mail\" name=\"subop\">";
3058
3059                                 print "</form>";
3060
3061                                 print "<form action=\"backend.php\" method=\"POST\" name=\"changePassForm\">";
3062         
3063                                 print "<table width=\"100%\" class=\"prefPrefsList\">";
3064                                 print "<tr><td colspan='3'><h3>Authentication</h3></tr></td>";
3065         
3066                                 print "<tr><td width=\"40%\">Old password</td>";
3067                                 print "<td><input class=\"editbox\" type=\"password\"
3068                                         name=\"OLD_PASSWORD\"></td></tr>";
3069         
3070                                 print "<tr><td width=\"40%\">New password</td>";
3071                                 
3072                                 print "<td><input class=\"editbox\" type=\"password\"
3073                                         name=\"NEW_PASSWORD\"></td></tr>";
3074         
3075                                 print "</table>";
3076         
3077                                 print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
3078         
3079                                 print "<p><input class=\"button\" type=\"submit\" 
3080                                         onclick=\"return validateNewPassword(this.form)\"
3081                                         value=\"Change password\" name=\"subop\">";
3082         
3083                                 print "</form>";
3084
3085                         }
3086
3087                         $result = db_query($link, "SELECT
3088                                 theme_id FROM ttrss_users WHERE id = " . $_SESSION["uid"]);
3089
3090                         $user_theme_id = db_fetch_result($result, 0, "theme_id");
3091
3092                         $result = db_query($link, "SELECT
3093                                 id,theme_name FROM ttrss_themes ORDER BY theme_name");
3094
3095                         if (db_num_rows($result) > 0) {
3096
3097                                 print "<form action=\"backend.php\" method=\"POST\">";
3098                                 print "<table width=\"100%\" class=\"prefPrefsList\">";
3099                                 print "<tr><td colspan='3'><h3>Themes</h3></tr></td>";
3100                                 print "<tr><td width=\"40%\">Select theme</td>";
3101                                 print "<td><select name=\"theme\">";
3102                                 print "<option>Default</option>";
3103                                 print "<option disabled>--------</option>";                             
3104                                 
3105                                 while ($line = db_fetch_assoc($result)) {       
3106                                         if ($line["id"] == $user_theme_id) {
3107                                                 $selected = "selected";
3108                                         } else {
3109                                                 $selected = "";
3110                                         }
3111                                         print "<option $selected>" . $line["theme_name"] . "</option>";
3112                                 }
3113                                 print "</select></td></tr>";
3114                                 print "</table>";
3115                                 print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
3116                                 print "<p><input class=\"button\" type=\"submit\" 
3117                                         value=\"Change theme\" name=\"subop\">";
3118                                 print "</form>";
3119                         }
3120
3121                         $result = db_query($link, "SELECT 
3122                                 ttrss_user_prefs.pref_name,short_desc,help_text,value,type_name,
3123                                 section_name,def_value
3124                                 FROM ttrss_prefs,ttrss_prefs_types,ttrss_prefs_sections,ttrss_user_prefs
3125                                 WHERE type_id = ttrss_prefs_types.id AND 
3126                                         section_id = ttrss_prefs_sections.id AND
3127                                         ttrss_user_prefs.pref_name = ttrss_prefs.pref_name AND
3128                                         owner_uid = ".$_SESSION["uid"]."
3129                                 ORDER BY section_id,short_desc");
3130
3131                         print "<form action=\"backend.php\" method=\"POST\">";
3132
3133                         $lnum = 0;
3134
3135                         $active_section = "";
3136         
3137                         while ($line = db_fetch_assoc($result)) {
3138
3139                                 if ($active_section != $line["section_name"]) {
3140
3141                                         if ($active_section != "") {
3142                                                 print "</table>";
3143                                         }
3144
3145                                         print "<p><table width=\"100%\" class=\"prefPrefsList\">";
3146                                 
3147                                         $active_section = $line["section_name"];                                
3148                                         
3149                                         print "<tr><td colspan=\"3\"><h3>$active_section</h3></td></tr>";
3150 //                                      print "<tr class=\"title\">
3151 //                                              <td width=\"25%\">Option</td><td>Value</td></tr>";
3152
3153                                         $lnum = 0;
3154                                 }
3155
3156 //                              $class = ($lnum % 2) ? "even" : "odd";
3157
3158                                 print "<tr>";
3159
3160                                 $type_name = $line["type_name"];
3161                                 $pref_name = $line["pref_name"];
3162                                 $value = $line["value"];
3163                                 $def_value = $line["def_value"];
3164                                 $help_text = $line["help_text"];
3165
3166                                 print "<td width=\"40%\" id=\"$pref_name\">" . $line["short_desc"];
3167
3168                                 if ($help_text) print "<div class=\"prefHelp\">$help_text</div>";
3169                                 
3170                                 print "</td>";
3171
3172                                 print "<td>";
3173
3174                                 if ($type_name == "bool") {
3175 //                                      print_select($pref_name, $value, array("true", "false"));
3176
3177                                         if ($value == "true") {
3178                                                 $value = "Yes";
3179                                         } else {
3180                                                 $value = "No";
3181                                         }
3182
3183                                         print_radio($pref_name, $value, array("Yes", "No"));
3184                         
3185                                 } else {
3186                                         print "<input class=\"editbox\" name=\"$pref_name\" value=\"$value\">";
3187                                 }
3188
3189                                 print "</td>";
3190
3191                                 print "</tr>";
3192
3193                                 $lnum++;
3194                         }
3195
3196                         print "</table>";
3197
3198                         print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
3199
3200                         print "<p><input class=\"button\" type=\"submit\" 
3201                                 name=\"subop\" value=\"Save configuration\">";
3202                                 
3203                         print "&nbsp;<input class=\"button\" type=\"submit\" 
3204                                 name=\"subop\" onclick=\"return validatePrefsReset()\" 
3205                                 value=\"Reset to defaults\"></p>";
3206
3207                         print "</form>";
3208
3209                 }
3210
3211         }
3212
3213         if ($op == "pref-users") {
3214
3215                 $subop = $_GET["subop"];
3216
3217                 if ($subop == "edit") {
3218
3219                         $id = db_escape_string($_GET["id"]);
3220
3221                         print "<div id=\"infoBoxTitle\">User editor</div>";
3222                         
3223                         print "<div class=\"infoBoxContents\">";
3224
3225                         print "<form id=\"user_edit_form\">";
3226
3227                         print "<input type=\"hidden\" name=\"id\" value=\"$id\">";
3228                         print "<input type=\"hidden\" name=\"op\" value=\"pref-users\">";
3229                         print "<input type=\"hidden\" name=\"subop\" value=\"editSave\">";
3230
3231                         $result = db_query($link, "SELECT * FROM ttrss_users WHERE id = '$id'");
3232
3233                         $login = db_fetch_result($result, 0, "login");
3234                         $access_level = db_fetch_result($result, 0, "access_level");
3235                         $email = db_fetch_result($result, 0, "email");
3236
3237                         print "<table width='100%'>";
3238                         print "<tr><td>Login:</td><td>
3239                                 <input class=\"iedit\" name=\"login\" value=\"$login\"></td></tr>";
3240
3241                         print "<tr><td>Change password:</td><td>
3242                                 <input class=\"iedit\" name=\"password\"></td></tr>";
3243
3244                         print "<tr><td>E-mail:</td><td>
3245                                 <input class=\"iedit\" name=\"email\" value=\"$email\"></td></tr>";
3246
3247                         $sel_disabled = ($id == $_SESSION["uid"]) ? "disabled" : "";
3248                                 
3249                         print "<tr><td>Access level:</td><td>";
3250                         print_select_hash("access_level", $access_level, $access_level_names, 
3251                                 $sel_disabled);
3252                         print "</td></tr>";
3253
3254                         print "</table>";
3255
3256                         print "</form>";
3257                         
3258                         print "<div align='right'>
3259                                 <input class=\"button\"
3260                                         type=\"submit\" onclick=\"javascript:userEditSave()\" value=\"Save\">
3261                                 <input class=\"button\"
3262                                         type=\"submit\" onclick=\"javascript:userEditCancel()\" 
3263                                         value=\"Cancel\"></div>";
3264
3265                         print "</div>";
3266
3267                         return;
3268                 }
3269
3270                 if ($subop == "editSave") {
3271         
3272                         if (!WEB_DEMO_MODE && $_SESSION["access_level"] >= 10) {
3273
3274                                 $login = db_escape_string(trim($_GET["login"]));
3275                                 $uid = db_escape_string($_GET["id"]);
3276                                 $access_level = sprintf("%d", $_GET["access_level"]);
3277                                 $email = db_escape_string(trim($_GET["email"]));
3278                                 $password = db_escape_string(trim($_GET["password"]));
3279
3280                                 if ($password) {
3281                                         $pwd_hash = 'SHA1:' . sha1($password);
3282                                         $pass_query_part = "pwd_hash = '$pwd_hash', ";                                  
3283                                         print "<div class='notice'>Changed password for user <b>$login</b>.</div>";
3284                                 } else {
3285                                         $pass_query_part = "";
3286                                 }
3287
3288                                 db_query($link, "UPDATE ttrss_users SET $pass_query_part login = '$login', 
3289                                         access_level = '$access_level', email = '$email' WHERE id = '$uid'");
3290
3291                         }
3292                 } else if ($subop == "remove") {
3293
3294                         if (!WEB_DEMO_MODE && $_SESSION["access_level"] >= 10) {
3295
3296                                 $ids = split(",", db_escape_string($_GET["ids"]));
3297
3298                                 foreach ($ids as $id) {
3299                                         db_query($link, "DELETE FROM ttrss_users WHERE id = '$id' AND id != " . $_SESSION["uid"]);
3300                                         
3301                                 }
3302                         }
3303                 } else if ($subop == "add") {
3304                 
3305                         if (!WEB_DEMO_MODE && $_SESSION["access_level"] >= 10) {
3306
3307                                 $login = db_escape_string(trim($_GET["login"]));
3308                                 $tmp_user_pwd = make_password(8);
3309                                 $pwd_hash = 'SHA1:' . sha1($tmp_user_pwd);
3310
3311                                 $result = db_query($link, "SELECT id FROM ttrss_users WHERE 
3312                                         login = '$login'");
3313
3314                                 if (db_num_rows($result) == 0) {
3315
3316                                         db_query($link, "INSERT INTO ttrss_users 
3317                                                 (login,pwd_hash,access_level,last_login)
3318                                                 VALUES ('$login', '$pwd_hash', 0, NOW())");
3319         
3320         
3321                                         $result = db_query($link, "SELECT id FROM ttrss_users WHERE 
3322                                                 login = '$login' AND pwd_hash = '$pwd_hash'");
3323         
3324                                         if (db_num_rows($result) == 1) {
3325         
3326                                                 $new_uid = db_fetch_result($result, 0, "id");
3327         
3328                                                 print "<div class=\"notice\">Added user <b>".$_GET["login"].
3329                                                         "</b> with password <b>$tmp_user_pwd</b>.</div>";
3330         
3331                                                 initialize_user($link, $new_uid);
3332         
3333                                         } else {
3334                                         
3335                                                 print "<div class=\"warning\">Could not create user <b>".
3336                                                         $_GET["login"]."</b></div>";
3337         
3338                                         }
3339                                 } else {
3340                                         print "<div class=\"warning\">User <b>".
3341                                                 $_GET["login"]."</b> already exists.</div>";
3342                                 }
3343                         } 
3344                 } else if ($subop == "resetPass") {
3345
3346                         if (!WEB_DEMO_MODE && $_SESSION["access_level"] >= 10) {
3347
3348                                 $uid = db_escape_string($_GET["id"]);
3349
3350                                 $result = db_query($link, "SELECT login,email 
3351                                         FROM ttrss_users WHERE id = '$uid'");
3352
3353                                 $login = db_fetch_result($result, 0, "login");
3354                                 $email = db_fetch_result($result, 0, "email");
3355                                 $tmp_user_pwd = make_password(8);
3356                                 $pwd_hash = 'SHA1:' . sha1($tmp_user_pwd);
3357
3358                                 db_query($link, "UPDATE ttrss_users SET pwd_hash = '$pwd_hash'
3359                                         WHERE id = '$uid'");
3360
3361                                 print "<div class=\"notice\">Changed password of 
3362                                         user <b>$login</b> to <b>$tmp_user_pwd</b>.";
3363
3364                                 if (MAIL_RESET_PASS && $email) {
3365                                         print " Notifying <b>$email</b>.";
3366
3367                                         mail("$login <$email>", "Password reset notification",
3368                                                 "Hi, $login.\n".
3369                                                 "\n".
3370                                                 "Your password for this TT-RSS installation was reset by".
3371                                                         " an administrator.\n".
3372                                                 "\n".
3373                                                 "Your new password is $tmp_user_pwd, please remember".
3374                                                         " it for later reference.\n".
3375                                                 "\n".
3376                                                 "Sincerely, TT-RSS Mail Daemon.", "From: " . MAIL_FROM);
3377                                 }
3378                                         
3379                                 print "</div>";                         
3380
3381                         }
3382                 }
3383
3384                 print "<div class=\"prefGenericAddBox\">
3385                         <input id=\"uadd_box\"                  
3386                                 onkeyup=\"toggleSubmitNotEmpty(this, 'user_add_btn')\"
3387                                 size=\"40\">&nbsp;";
3388                         
3389                 print"<input type=\"submit\" class=\"button\" 
3390                         id=\"user_add_btn\" disabled=\"true\"
3391                         onclick=\"javascript:addUser()\" value=\"Create user\"></div>";
3392
3393                 $result = db_query($link, "SELECT 
3394                                 id,login,access_level,email,
3395                                 SUBSTRING(last_login,1,16) as last_login
3396                         FROM 
3397                                 ttrss_users
3398                         ORDER by login");
3399
3400 //              print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
3401
3402                 print "<p><table width=\"100%\" cellspacing=\"0\" 
3403                         class=\"prefUserList\" id=\"prefUserList\">";
3404
3405                 print "<tr><td class=\"selectPrompt\" colspan=\"8\">
3406                                 Select: 
3407                                         <a href=\"javascript:selectPrefRows('user', true)\">All</a>,
3408                                         <a href=\"javascript:selectPrefRows('user', false)\">None</a>
3409                                 </td</tr>";
3410
3411                 print "<tr class=\"title\">
3412                                         <td align='center' width=\"5%\">&nbsp;</td>
3413                                         <td width='40%'>Login</td>
3414                                         <td width='40%'>Access Level</td>
3415                                         <td width='30%'>Last login</td></tr>";
3416                 
3417                 $lnum = 0;
3418                 
3419                 while ($line = db_fetch_assoc($result)) {
3420
3421                         $class = ($lnum % 2) ? "even" : "odd";
3422
3423                         $uid = $line["id"];
3424                         $edit_uid = $_GET["id"];
3425
3426                         if ($subop == "edit" && $uid != $edit_uid) {
3427                                 $class .= "Grayed";
3428                                 $this_row_id = "";
3429                         } else {
3430                                 $this_row_id = "id=\"UMRR-$uid\"";
3431                         }               
3432                         
3433                         print "<tr class=\"$class\" $this_row_id>";
3434
3435                         $line["login"] = htmlspecialchars($line["login"]);
3436
3437                         $line["last_login"] = date(get_pref($link, 'SHORT_DATE_FORMAT'),
3438                                 strtotime($line["last_login"]));
3439
3440                         $access_level_names = array(0 => "User", 10 => "Administrator");
3441
3442 //                      if (!$edit_uid || $subop != "edit") {
3443
3444                                 print "<td align='center'><input onclick='toggleSelectPrefRow(this, \"user\");' 
3445                                 type=\"checkbox\" id=\"UMCHK-$uid\"></td>";
3446
3447                                 print "<td><a href=\"javascript:editUser($uid);\">" . 
3448                                         $line["login"] . "</td>";               
3449
3450                                 if (!$line["email"]) $line["email"] = "&nbsp;";
3451
3452                                 print "<td><a href=\"javascript:editUser($uid);\">" . 
3453                                         $access_level_names[$line["access_level"]] . "</td>";                   
3454
3455 /*                      } else if ($uid != $edit_uid) {
3456
3457                                 if (!$line["email"]) $line["email"] = "&nbsp;";
3458
3459                                 print "<td align='center'><input disabled=\"true\" type=\"checkbox\" 
3460                                         id=\"UMCHK-".$line["id"]."\"></td>";
3461
3462                                 print "<td>".$line["login"]."</td>";            
3463                                 print "<td>".$line["email"]."</td>";            
3464                                 print "<td>".$access_level_names[$line["access_level"]]."</td>";
3465
3466                         } else {
3467
3468                                 print "<td align='center'>
3469                                         <input disabled=\"true\" type=\"checkbox\" checked></td>";
3470
3471                                 print "<td><input id=\"iedit_ulogin\" value=\"".$line["login"].
3472                                         "\"></td>";
3473
3474                                 print "<td><input id=\"iedit_email\" value=\"".$line["email"].
3475                                         "\"></td>";
3476
3477                                 print "<td>";
3478                                 print "<select id=\"iedit_ulevel\">";
3479                                 foreach (array_keys($access_level_names) as $al) {
3480                                         if ($al == $line["access_level"]) {
3481                                                 $selected = "selected";
3482                                         } else {
3483                                                 $selected = "";
3484                                         }                                       
3485                                         print "<option $selected id=\"$al\">" . 
3486                                                 $access_level_names[$al] . "</option>";
3487                                 }
3488                                 print "</select>";
3489                                 print "</td>";
3490
3491                         } */
3492                                 
3493                         print "<td>".$line["last_login"]."</td>";               
3494                 
3495                         print "</tr>";
3496
3497                         ++$lnum;
3498                 }
3499
3500                 print "</table>";
3501
3502                 print "<p id='userOpToolbar'>";
3503
3504 /*              if ($subop == "edit") {
3505                         print "Edit user:
3506                                 <input type=\"submit\" class=\"button\" 
3507                                         onclick=\"javascript:userEditSave()\" value=\"Save\">
3508                                 <input type=\"submit\" class=\"button\" 
3509                                         onclick=\"javascript:userEditCancel()\" value=\"Cancel\">";
3510                                         
3511                 } else { */
3512
3513                         print "
3514                                 Selection:
3515                         <input type=\"submit\" class=\"button\" disabled=\"true\"
3516                                 onclick=\"javascript:selectedUserDetails()\" value=\"User details\">
3517                         <input type=\"submit\" class=\"button\" disabled=\"true\"
3518                                 onclick=\"javascript:editSelectedUser()\" value=\"Edit\">
3519                         <input type=\"submit\" class=\"button\" disabled=\"true\"
3520                                 onclick=\"javascript:removeSelectedUsers()\" value=\"Remove\">
3521                         <input type=\"submit\" class=\"button\" disabled=\"true\"
3522                                 onclick=\"javascript:resetSelectedUserPass()\" value=\"Reset password\">";
3523
3524 //              }
3525         }
3526
3527         if ($op == "user-details") {
3528
3529                 if (WEB_DEMO_MODE || $_SESSION["access_level"] < 10) {
3530                         return;
3531                 }
3532                           
3533 /*              print "<html><head>
3534                         <title>Tiny Tiny RSS : User Details</title>
3535                         <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">
3536                         <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
3537                         </head><body>"; */
3538
3539                 $uid = sprintf("%d", $_GET["id"]);
3540
3541                 print "<div id=\"infoBoxTitle\">User details</div>";
3542
3543                 print "<div class='infoBoxContents'>";
3544
3545                 $result = db_query($link, "SELECT login,
3546                         SUBSTRING(last_login,1,16) AS last_login,
3547                         access_level,
3548                         (SELECT COUNT(int_id) FROM ttrss_user_entries 
3549                                 WHERE owner_uid = id) AS stored_articles
3550                         FROM ttrss_users 
3551                         WHERE id = '$uid'");
3552                         
3553                 if (db_num_rows($result) == 0) {
3554                         print "<h1>User not found</h1>";
3555                         return;
3556                 }
3557                 
3558 #               print "<h1>User Details</h1>";
3559
3560                 $login = db_fetch_result($result, 0, "login");
3561
3562 #               print "<h1>$login</h1>";
3563
3564                 print "<table width='100%'>";
3565
3566                 $last_login = date(get_pref($link, 'LONG_DATE_FORMAT'),
3567                         strtotime(db_fetch_result($result, 0, "last_login")));
3568                 $access_level = db_fetch_result($result, 0, "access_level");
3569                 $stored_articles = db_fetch_result($result, 0, "stored_articles");
3570
3571 #               print "<tr><td>Username</td><td>$login</td></tr>";
3572 #               print "<tr><td>Access level</td><td>$access_level</td></tr>";
3573                 print "<tr><td>Last logged in</td><td>$last_login</td></tr>";
3574                 print "<tr><td>Stored articles</td><td>$stored_articles</td></tr>";
3575
3576                 $result = db_query($link, "SELECT COUNT(id) as num_feeds FROM ttrss_feeds
3577                         WHERE owner_uid = '$uid'");
3578
3579                 $num_feeds = db_fetch_result($result, 0, "num_feeds");
3580
3581                 print "<tr><td>Subscribed feeds count</td><td>$num_feeds</td></tr>";
3582
3583 /*              $result = db_query($link, "SELECT 
3584                         SUM(LENGTH(content)+LENGTH(title)+LENGTH(link)+LENGTH(guid)) AS db_size 
3585                         FROM ttrss_user_entries,ttrss_entries 
3586                                 WHERE owner_uid = '$uid' AND ref_id = id");
3587
3588                 $db_size = round(db_fetch_result($result, 0, "db_size") / 1024);
3589
3590                 print "<tr><td>Approx. used DB size</td><td>$db_size KBytes</td></tr>";  */
3591
3592                 print "</table>";
3593
3594                 print "<h1>Subscribed feeds</h1>";
3595
3596                 $result = db_query($link, "SELECT id,title,site_url FROM ttrss_feeds
3597                         WHERE owner_uid = '$uid' ORDER BY title");
3598
3599                 print "<ul class=\"userFeedList\">";
3600
3601                 $row_class = "odd";
3602
3603                 while ($line = db_fetch_assoc($result)) {
3604
3605                         $icon_file = ICONS_URL."/".$line["id"].".ico";
3606
3607                         if (file_exists($icon_file) && filesize($icon_file) > 0) {
3608                                 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"$icon_file\">";
3609                         } else {
3610                                 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
3611                         }
3612
3613                         print "<li class=\"$row_class\">$feed_icon&nbsp;<a href=\"".$line["site_url"]."\">".$line["title"]."</a></li>";
3614
3615                         $row_class = toggleEvenOdd($row_class);
3616
3617                 }
3618
3619                 if (db_num_rows($result) < $num_feeds) {
3620                          // FIXME - add link to show ALL subscribed feeds here somewhere
3621                         print "<li><img 
3622                                 class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">&nbsp;...</li>";
3623                 }
3624                 
3625                 print "</ul>";
3626
3627                 print "</div>";
3628
3629                 print "<div align='center'>
3630                         <input type='submit' class='button'                     
3631                         onclick=\"closeInfoBox()\" value=\"Close this window\"></div>";
3632
3633 //              print "</body></html>"; 
3634
3635         }
3636
3637         if ($op == "pref-feed-browser") {
3638
3639                 if (!ENABLE_FEED_BROWSER) {
3640                         print "Feed browser is administratively disabled.";
3641                         return;
3642                 }
3643
3644                 $subop = $_REQUEST["subop"];
3645
3646                 if ($subop == "details") {
3647                         $id = db_escape_string($_GET["id"]);
3648
3649                         print "<div class=\"browserFeedInfo\">";
3650                         print "<b>Feed information:</b>";
3651                         print "<div class=\"detailsPart\">";
3652
3653                         $result = db_query($link, "SELECT 
3654                                         feed_url,site_url,
3655                                         SUBSTRING(last_updated,1,19) AS last_updated
3656                                 FROM ttrss_feeds WHERE id = '$id'");
3657
3658                         $feed_url = db_fetch_result($result, 0, "feed_url");
3659                         $site_url = db_fetch_result($result, 0, "site_url");
3660                         $last_updated = db_fetch_result($result, 0, "last_updated");
3661
3662                         if (get_pref($link, 'HEADLINES_SMART_DATE')) {
3663                                 $last_updated = smart_date_time(strtotime($last_updated));
3664                         } else {
3665                                 $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
3666                                 $last_updated = date($short_date, strtotime($last_updated));
3667                         }
3668
3669                         print "Site: <a href='$site_url'>$site_url</a> ".
3670                                 "(<a href='$feed_url'>feed</a>), ".
3671                                 "Last updated: $last_updated";
3672
3673                         print "</div>";
3674
3675                         $result = db_query($link, "SELECT 
3676                                         ttrss_entries.title,
3677                                         content,
3678                                         substring(date_entered,1,19) as date_entered,
3679                                         substring(updated,1,19) as updated
3680                                 FROM ttrss_entries,ttrss_user_entries
3681                                 WHERE   ttrss_entries.id = ref_id AND feed_id = '$id' 
3682                                 ORDER BY updated DESC LIMIT 5");
3683
3684                         if (db_num_rows($result) > 0) {
3685                                 
3686                                 print "<b>Last headlines:</b><br>";
3687                                 
3688                                 print "<div class=\"detailsPart\">";
3689                                 print "<ul class=\"compact\">";
3690                                 while ($line = db_fetch_assoc($result)) {
3691
3692                                         if (get_pref($link, 'HEADLINES_SMART_DATE')) {
3693                                                 $entry_dt = smart_date_time(strtotime($line["updated"]));
3694                                         } else {
3695                                                 $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
3696                                                 $entry_dt = date($short_date, strtotime($line["updated"]));
3697                                         }                               
3698                 
3699                                         print "<li>" . $line["title"] . 
3700                                                 "&nbsp;<span class=\"insensitive\">($entry_dt)</span></li>";    
3701                                 }               
3702                                 print "</ul></div>";
3703                         }
3704
3705                         print "</div>";
3706                                 
3707                         return;
3708                 }
3709
3710                 print "<p>This panel shows feeds subscribed by other users of this system, just in case you are interested in some of them too.</p>";
3711
3712                 $limit = db_escape_string($_GET["limit"]);
3713
3714                 if (!$limit) $limit = 25;
3715
3716                 $result = db_query($link, "SELECT feed_url,count(id) AS subscribers 
3717                         FROM ttrss_feeds 
3718                         WHERE auth_login = '' AND auth_pass = '' AND private = false
3719                         GROUP BY feed_url ORDER BY subscribers DESC LIMIT $limit");
3720
3721                 print "<div style=\"float : right\">
3722                         Top <select id=\"feedBrowserLimit\">";
3723
3724                 foreach (array(25, 50, 100) as $l) {
3725                         $issel = ($l == $limit) ? "selected" : "";
3726                         print "<option $issel>$l</option>";
3727                 }
3728                         
3729                 print "</select>
3730                         <input type=\"submit\" class=\"button\"
3731                                 onclick=\"updateBigFeedBrowser()\" value=\"Show\">
3732                 </div>";
3733
3734                 print "<p id=\"fbrOpToolbar\">Selection: 
3735                         <input type='submit' class='button' onclick=\"feedBrowserSubscribe()\" 
3736                         disabled=\"true\" value=\"Subscribe\">";
3737
3738                 print "<ul class='nomarks' id='browseBigFeedList'>";
3739
3740                 $feedctr = 0;
3741                 
3742                 while ($line = db_fetch_assoc($result)) {
3743                         $feed_url = $line["feed_url"];
3744                         $subscribers = $line["subscribers"];
3745
3746                         $sub_result = db_query($link, "SELECT id
3747                                 FROM ttrss_feeds WHERE feed_url = '$feed_url' AND owner_uid =" . 
3748                                 $_SESSION["uid"]);
3749
3750                         if (db_num_rows($sub_result) > 0) {
3751                                 continue; // already subscribed
3752                         }
3753                 
3754                         $det_result = db_query($link, "SELECT site_url,title,id 
3755                                 FROM ttrss_feeds WHERE feed_url = '$feed_url' LIMIT 1");
3756
3757                         $details = db_fetch_assoc($det_result);
3758                 
3759                         $icon_file = ICONS_DIR . "/" . $details["id"] . ".ico";
3760
3761                         if (file_exists($icon_file) && filesize($icon_file) > 0) {
3762                                         $feed_icon = "<img class=\"tinyFeedIcon\"       src=\"" . ICONS_URL . 
3763                                                 "/".$details["id"].".ico\">";
3764                         } else {
3765                                 $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
3766                         }
3767
3768                         $check_box = "<input onclick='toggleSelectFBListRow(this)' class='feedBrowseCB' 
3769                                 type=\"checkbox\" id=\"FBCHK-" . $details["id"] . "\">";
3770
3771                         $class = ($feedctr % 2) ? "even" : "odd";
3772
3773                         print "<li class='$class' id=\"FBROW-".$details["id"]."\">$check_box".
3774                                 "$feed_icon ";
3775                                 
3776                         print "<a href=\"javascript:browserToggleExpand('".$details["id"]."')\">" . 
3777                                 $details["title"] ."</a>&nbsp;" .
3778                                 "<span class='subscribers'>($subscribers)</span>";
3779                         
3780                         print "<div class=\"browserDetails\" id=\"BRDET-" . $details["id"] . "\">";
3781                         print "</div>";
3782                                 
3783                         print "</li>";
3784
3785                                 ++$feedctr;
3786                 }
3787
3788                 if ($feedctr == 0) {
3789                         print "<li>No feeds found to subscribe.</li>";
3790                 }
3791
3792                 print "</ul>";
3793
3794                 print "</div>";
3795
3796         }
3797
3798         function check_configuration_variables() {
3799                 if (!defined('SESSION_EXPIRE_TIME')) {
3800                         return "config: SESSION_EXPIRE_TIME is undefined";
3801                 }
3802
3803                 if (SESSION_EXPIRE_TIME < 60) {
3804                         return "config: SESSION_EXPIRE_TIME is too low (less than 60)";
3805                 }
3806
3807                 if (SESSION_EXPIRE_TIME < SESSION_COOKIE_LIFETIME_REMEMBER) {
3808                         return "config: SESSION_EXPIRE_TIME should be greater or equal to" .
3809                                 "SESSION_COOKIE_LIFETIME_REMEMBER";
3810                 }
3811
3812                 if (defined('DISABLE_SESSIONS')) {
3813                         return "config: you have enabled DISABLE_SESSIONS. Please disable this option.";
3814                 }
3815
3816                 if (DATABASE_BACKED_SESSIONS && SINGLE_USER_MODE) {
3817                         return "config: DATABASE_BACKED_SESSIONS is incompatible with SINGLE_USER_MODE";
3818                 }
3819
3820                 return false;
3821         }
3822
3823         db_close($link);
3824 ?>
3825
3826 <!-- <?= sprintf("Backend execution time: %.4f seconds", getmicrotime() - $script_started) ?> -->
3827