]> git.wh0rd.org Git - tt-rss.git/blob - modules/pref-feeds.php
c460572747b9415adce9f5bf6246a18253275005
[tt-rss.git] / modules / pref-feeds.php
1 <?php
2
3         function module_pref_feeds($link) {
4
5                 global $update_intervals;
6                 global $purge_intervals;
7
8                 $subop = $_REQUEST["subop"];
9                 $quiet = $_REQUEST["quiet"];
10
11                 if ($subop == "massSubscribe") {
12                         $ids = split(",", db_escape_string($_GET["ids"]));
13
14                         $subscribed = array();
15
16                         foreach ($ids as $id) {
17                                 $result = db_query($link, "SELECT feed_url,title FROM ttrss_feeds
18                                         WHERE id = '$id'");
19
20                                 $feed_url = db_escape_string(db_fetch_result($result, 0, "feed_url"));
21                                 $title = db_escape_string(db_fetch_result($result, 0, "title"));
22
23                                 $title_orig = db_fetch_result($result, 0, "title");
24
25                                 $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE
26                                         feed_url = '$feed_url' AND owner_uid = " . $_SESSION["uid"]);
27
28                                 if (db_num_rows($result) == 0) {                        
29                                         $result = db_query($link,
30                                                 "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id) 
31                                                 VALUES ('".$_SESSION["uid"]."', '$feed_url', '$title', NULL)");
32
33                                         array_push($subscribed, $title_orig);
34                                 }
35                         }
36
37                         if (count($subscribed) > 0) {
38                                 print "<div class=\"notice\">";
39                                 print "<b>Subscribed to feeds:</b>";
40                                 print "<ul class=\"nomarks\">";
41                                 foreach ($subscribed as $title) {
42                                         print "<li>$title</li>";
43                                 }
44                                 print "</ul>";
45                                 print "</div>";
46                         }
47                 }               
48
49                 if ($subop == "browse") {
50
51                         if (!ENABLE_FEED_BROWSER) {
52                                 print "Feed browser is administratively disabled.";
53                                 return;
54                         }
55
56                         print "<div id=\"infoBoxTitle\">Other feeds: Top 25</div>";
57                         
58                         print "<div class=\"infoBoxContents\">";
59
60                         print "<p>Showing top 25 registered feeds, sorted by popularity:</p>";
61
62 #                       $result = db_query($link, "SELECT feed_url,count(id) AS subscribers 
63 #                               FROM ttrss_feeds 
64 #                               WHERE auth_login = '' AND auth_pass = '' AND private = false
65 #                               GROUP BY feed_url ORDER BY subscribers DESC LIMIT 25");
66
67                         $owner_uid = $_SESSION["uid"];
68
69                         $result = db_query($link, "SELECT feed_url,COUNT(id) AS subscribers
70                                 FROM ttrss_feeds WHERE (SELECT COUNT(id) = 0 FROM ttrss_feeds AS tf 
71                                         WHERE tf.feed_url = ttrss_feeds.feed_url 
72                                                 AND owner_uid = '$owner_uid') GROUP BY feed_url 
73                                                         ORDER BY subscribers DESC LIMIT 25");
74
75                         print "<ul class='browseFeedList' id='browseFeedList'>";
76
77                         $feedctr = 0;
78                         
79                         while ($line = db_fetch_assoc($result)) {
80                                 $feed_url = $line["feed_url"];
81                                 $subscribers = $line["subscribers"];
82
83                                 $det_result = db_query($link, "SELECT site_url,title,id 
84                                         FROM ttrss_feeds WHERE feed_url = '$feed_url' LIMIT 1");
85
86                                 $details = db_fetch_assoc($det_result);
87                         
88                                 $icon_file = ICONS_DIR . "/" . $details["id"] . ".ico";
89
90                                 if (file_exists($icon_file) && filesize($icon_file) > 0) {
91                                                 $feed_icon = "<img class=\"tinyFeedIcon\"       src=\"" . ICONS_URL . 
92                                                         "/".$details["id"].".ico\">";
93                                 } else {
94                                         $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
95                                 }
96
97                                 $check_box = "<input onclick='toggleSelectListRow(this)' class='feedBrowseCB' 
98                                         type=\"checkbox\" id=\"FBCHK-" . $details["id"] . "\">";
99
100                                 $class = ($feedctr % 2) ? "even" : "odd";
101
102                                 print "<li class='$class' id=\"FBROW-".$details["id"]."\">$check_box".
103                                         "$feed_icon " . db_unescape_string($details["title"]) . 
104                                         "&nbsp;<span class='subscribers'>($subscribers)</span></li>";
105
106                                         ++$feedctr;
107                         }
108
109                         if ($feedctr == 0) {
110                                 print "<li>No feeds found to subscribe.</li>";
111                         }
112
113                         print "</ul>";
114
115                         print "<div align='center'>
116                                 <input type=\"submit\" class=\"button\" 
117                                 onclick=\"feedBrowserSubscribe()\" value=\"Subscribe\">
118                                 <input type='submit' class='button'                     
119                                 onclick=\"closeInfoBox()\" value=\"Cancel\"></div>";
120
121                         print "</div>";
122                         return;
123                 }
124
125                 if ($subop == "editfeed") {
126                         $feed_id = db_escape_string($_REQUEST["id"]);
127
128                         $result = db_query($link, 
129                                 "SELECT * FROM ttrss_feeds WHERE id = '$feed_id' AND
130                                         owner_uid = " . $_SESSION["uid"]);
131
132                         $title = htmlspecialchars(db_unescape_string(db_fetch_result($result,
133                                 0, "title")));
134
135                         $icon_file = ICONS_DIR . "/$feed_id.ico";
136         
137                         if (file_exists($icon_file) && filesize($icon_file) > 0) {
138                                         $feed_icon = "<img width=\"16\" height=\"16\"
139                                                 src=\"" . ICONS_URL . "/$feed_id.ico\">";
140                         } else {
141                                 $feed_icon = "";
142                         }
143
144                         print "<div id=\"infoBoxTitle\">Feed editor</div>";
145
146                         print "<div class=\"infoBoxContents\">";
147
148                         print "<form id=\"edit_feed_form\">";   
149
150                         print "<input type=\"hidden\" name=\"id\" value=\"$feed_id\">";
151                         print "<input type=\"hidden\" name=\"op\" value=\"pref-feeds\">";
152                         print "<input type=\"hidden\" name=\"subop\" value=\"editSave\">";
153
154                         print "<table width='100%'>";
155
156                         print "<tr><td>Title:</td>";
157                         print "<td><input class=\"iedit\" onkeypress=\"return filterCR(event, feedEditSave)\"
158                                 name=\"title\" value=\"$title\"></td></tr>";
159
160                         $feed_url = db_fetch_result($result, 0, "feed_url");
161                         $feed_url = htmlspecialchars(db_unescape_string(db_fetch_result($result,
162                                 0, "feed_url")));
163                                 
164                         print "<tr><td>Feed URL:</td>";
165                         print "<td><input class=\"iedit\" onkeypress=\"return filterCR(event, feedEditSave)\"
166                                 name=\"feed_url\" value=\"$feed_url\"></td></tr>";
167
168                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
169
170                                 $cat_id = db_fetch_result($result, 0, "cat_id");
171
172                                 print "<tr><td>Category:</td>";
173                                 print "<td>";
174
175                                 $parent_feed = db_fetch_result($result, 0, "parent_feed");
176
177                                 if (sprintf("%d", $parent_feed) > 0) {
178                                         $disabled = "disabled";
179                                 } else {
180                                         $disabled = "";
181                                 }
182
183                                 print_feed_cat_select($link, "cat_id", $cat_id, "class=\"iedit\" $disabled");
184
185                                 print "</td>";
186                                 print "</td></tr>";
187         
188                         }
189
190                         $update_interval = db_fetch_result($result, 0, "update_interval");
191
192                         print "<tr><td>Update Interval:</td>";
193
194                         print "<td>";
195
196                         print_select_hash("update_interval", $update_interval, $update_intervals,
197                                 "class=\"iedit\"");
198
199                         print "</td>";
200
201                         print "<tr><td>Link to:</td><td>";
202
203                         $tmp_result = db_query($link, "SELECT COUNT(id) AS count
204                                 FROM ttrss_feeds WHERE parent_feed = '$feed_id'");
205
206                         $linked_count = db_fetch_result($tmp_result, 0, "count");
207
208                         $parent_feed = db_fetch_result($result, 0, "parent_feed");
209
210                         if ($linked_count > 0) {
211                                 $disabled = "disabled";
212                         } else {
213                                 $disabled = "";
214                         }
215
216                         print "<select class=\"iedit\" $disabled name=\"parent_feed\">";
217                         
218                         print "<option value=\"0\">Not linked</option>";
219
220                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
221                                 if ($cat_id) {
222                                         $cat_qpart = "AND cat_id = '$cat_id'";
223                                 } else {
224                                         $cat_qpart = "AND cat_id IS NULL";
225                                 }
226                         }
227
228                         $tmp_result = db_query($link, "SELECT id,title FROM ttrss_feeds
229                                 WHERE id != '$feed_id' AND owner_uid = ".$_SESSION["uid"]." AND
230                                         (SELECT COUNT(id) FROM ttrss_feeds AS T2 WHERE T2.id = ttrss_feeds.parent_feed) = 0
231                                         $cat_qpart ORDER BY title");
232
233                                 if (db_num_rows($tmp_result) > 0) {
234                                         print "<option disabled>--------</option>";
235                                 }
236
237                                 while ($tmp_line = db_fetch_assoc($tmp_result)) {
238                                         if ($tmp_line["id"] == $parent_feed) {
239                                                 $is_selected = "selected";
240                                         } else {
241                                                 $is_selected = "";
242                                         }
243                                         printf("<option $is_selected value='%d'>%s</option>", 
244                                                 $tmp_line["id"], $tmp_line["title"]);
245                                 }
246
247                         print "</select>";
248                         print "</td></tr>";
249
250                         $purge_interval = db_fetch_result($result, 0, "purge_interval");
251
252                         print "<tr><td>Article purging:</td>";
253
254                         print "<td>";
255
256                         print_select_hash("purge_interval", $purge_interval, $purge_intervals, 
257                                 "class=\"iedit\"");
258                         
259                         print "</td>";
260
261                         $auth_login = escape_for_form(db_fetch_result($result, 0, "auth_login"));
262
263                         print "<tr><td>Login:</td>";
264                         print "<td><input class=\"iedit\" onkeypress=\"return filterCR(event, feedEditSave)\"
265                                 name=\"auth_login\" value=\"$auth_login\"></td></tr>";
266
267                         $auth_pass = escape_for_form(db_fetch_result($result, 0, "auth_pass"));
268
269                         print "<tr><td>Password:</td>";
270                         print "<td><input class=\"iedit\" type=\"password\" name=\"auth_pass\" 
271                                 onkeypress=\"return filterCR(event, feedEditSave)\"
272                                 value=\"$auth_pass\"></td></tr>";
273
274                         $private = sql_bool_to_bool(db_fetch_result($result, 0, "private"));
275
276                         if ($private) {
277                                 $checked = "checked";
278                         } else {
279                                 $checked = "";
280                         }
281
282                         print "<tr><td valign='top'>Options:</td>";
283                         print "<td><input type=\"checkbox\" name=\"private\" id=\"private\" 
284                                 $checked><label for=\"private\">Hide from \"Other Feeds\"</label>";
285
286                         $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content"));
287
288                         if ($rtl_content) {
289                                 $checked = "checked";
290                         } else {
291                                 $checked = "";
292                         }
293
294                         print "<br><input type=\"checkbox\" id=\"rtl_content\" name=\"rtl_content\"
295                                 $checked><label for=\"rtl_content\">Right-to-left content</label>";
296
297                         $hidden = sql_bool_to_bool(db_fetch_result($result, 0, "hidden"));
298
299                         if ($hidden) {
300                                 $checked = "checked";
301                         } else {
302                                 $checked = "";
303                         }
304
305                         print "<br><input type=\"checkbox\" id=\"hidden\" name=\"hidden\"
306                                 $checked><label for=\"hidden\">Hide from my feed list</label>";
307
308                         $include_in_digest = sql_bool_to_bool(db_fetch_result($result, 0, "include_in_digest"));
309
310                         if ($include_in_digest) {
311                                 $checked = "checked";
312                         } else {
313                                 $checked = "";
314                         }
315
316                         print "<br><input type=\"checkbox\" id=\"include_in_digest\" 
317                                 name=\"include_in_digest\"
318                                 $checked><label for=\"include_in_digest\">Include in e-mail digest</label>";
319
320                         print "</td></tr>";
321
322                         print "</table>";
323
324                         print "</form>";
325
326                         print "<div align='right'>
327                                 <input type=\"submit\" class=\"button\" 
328                                 onclick=\"return feedEditSave()\" value=\"Save\">
329                                 <input type='submit' class='button'                     
330                                 onclick=\"return feedEditCancel()\" value=\"Cancel\"></div>";
331
332                         print "</div>";
333
334                         return;
335                 }
336
337                 if ($subop == "editSave") {
338
339                         $feed_title = db_escape_string(trim($_POST["title"]));
340                         $feed_link = db_escape_string(trim($_POST["feed_url"]));
341                         $upd_intl = db_escape_string($_POST["update_interval"]);
342                         $purge_intl = db_escape_string($_POST["purge_interval"]);
343                         $feed_id = db_escape_string($_POST["id"]);
344                         $cat_id = db_escape_string($_POST["cat_id"]);
345                         $auth_login = db_escape_string(trim($_POST["auth_login"]));
346                         $auth_pass = db_escape_string(trim($_POST["auth_pass"]));
347                         $parent_feed = db_escape_string($_POST["parent_feed"]);
348                         $private = checkbox_to_sql_bool(db_escape_string($_POST["private"]));
349                         $rtl_content = checkbox_to_sql_bool(db_escape_string($_POST["rtl_content"]));
350                         $hidden = checkbox_to_sql_bool(db_escape_string($_POST["hidden"]));
351                         $include_in_digest = checkbox_to_sql_bool(
352                                 db_escape_string($_POST["include_in_digest"]));
353
354                         if (get_pref($link, 'ENABLE_FEED_CATS')) {                      
355                                 if ($cat_id && $cat_id != 0) {
356                                         $category_qpart = "cat_id = '$cat_id',";
357                                         $category_qpart_nocomma = "cat_id = '$cat_id'";
358                                 } else {
359                                         $category_qpart = 'cat_id = NULL,';
360                                         $category_qpart_nocomma = 'cat_id = NULL';
361                                 }
362                         } else {
363                                 $category_qpart = "";
364                                 $category_qpart_nocomma = "";
365                         }
366
367                         if ($parent_feed && $parent_feed != 0) {
368                                 $parent_qpart = "parent_feed = '$parent_feed'";
369                         } else {
370                                 $parent_qpart = 'parent_feed = NULL';
371                         }
372
373                         $result = db_query($link, "UPDATE ttrss_feeds SET 
374                                 $category_qpart $parent_qpart,
375                                 title = '$feed_title', feed_url = '$feed_link',
376                                 update_interval = '$upd_intl',
377                                 purge_interval = '$purge_intl',
378                                 auth_login = '$auth_login',
379                                 auth_pass = '$auth_pass',
380                                 private = $private,
381                                 rtl_content = $rtl_content,
382                                 hidden = $hidden,
383                                 include_in_digest = $include_in_digest
384                                 WHERE id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]);
385
386                         if (get_pref($link, 'ENABLE_FEED_CATS')) {
387                                 # update linked feed categories
388                                 $result = db_query($link, "UPDATE ttrss_feeds SET
389                                         $category_qpart_nocomma WHERE parent_feed = '$feed_id' AND
390                                         owner_uid = " . $_SESSION["uid"]);
391                         }
392                 }
393
394                 if ($subop == "saveCat") {
395                         $cat_title = db_escape_string(trim($_GET["title"]));
396                         $cat_id = db_escape_string($_GET["id"]);
397
398                         $result = db_query($link, "UPDATE ttrss_feed_categories SET
399                                 title = '$cat_title' WHERE id = '$cat_id' AND owner_uid = ".$_SESSION["uid"]);
400
401                 }
402
403                 if ($subop == "remove") {
404
405                         if (!WEB_DEMO_MODE) {
406
407                                 $ids = split(",", db_escape_string($_GET["ids"]));
408
409                                 foreach ($ids as $id) {
410
411                                         if ($id > 0) {
412
413                                                 db_query($link, "DELETE FROM ttrss_feeds 
414                                                         WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
415
416                                                 $icons_dir = ICONS_DIR;
417                                         
418                                                 if (file_exists($icons_dir . "/$id.ico")) {
419                                                         unlink($icons_dir . "/$id.ico");
420                                                 }
421                                         } else if ($id < -10) {
422
423                                                 $label_id = -$id - 11;
424
425                                                 db_query($link, "DELETE FROM ttrss_labels
426                                                         WHERE   id = '$label_id' AND owner_uid = " . $_SESSION["uid"]);
427                                         }
428                                 }
429                         }
430                 }
431
432                 if ($subop == "add") {
433                 
434                         if (!WEB_DEMO_MODE) {
435
436                                 $feed_url = db_escape_string(trim($_GET["feed_url"]));
437                                 $cat_id = db_escape_string($_GET["cat_id"]);
438
439                                 if (subscribe_to_feed($link, $feed_url, $cat_id)) {
440                                         print "Added feed.";
441                                 } else {
442                                         print "<div class=\"warning\">
443                                                 Feed <b>$feed_url</b> already exists in the database.
444                                         </div>";
445                                 }
446                         }
447                 }
448
449                 if ($subop == "addCat") {
450
451                         if (!WEB_DEMO_MODE) {
452
453                                 $feed_cat = db_escape_string(trim($_GET["cat"]));
454
455                                 $result = db_query($link,
456                                         "SELECT id FROM ttrss_feed_categories
457                                         WHERE title = '$feed_cat' AND owner_uid = ".$_SESSION["uid"]);
458
459                                 if (db_num_rows($result) == 0) {
460                                         
461                                         $result = db_query($link,
462                                                 "INSERT INTO ttrss_feed_categories (owner_uid,title) 
463                                                 VALUES ('".$_SESSION["uid"]."', '$feed_cat')");
464
465                                 } else {
466
467                                         print "<div class=\"warning\">
468                                                 Category <b>$feed_cat</b> already exists in the database.
469                                         </div>";
470                                 }
471
472
473                         }
474                 }
475
476                 if ($subop == "removeCats") {
477
478                         if (!WEB_DEMO_MODE) {
479
480                                 $ids = split(",", db_escape_string($_GET["ids"]));
481
482                                 foreach ($ids as $id) {
483
484                                         db_query($link, "BEGIN");
485
486                                         $result = db_query($link, 
487                                                 "SELECT count(id) as num_feeds FROM ttrss_feeds 
488                                                         WHERE cat_id = '$id'");
489
490                                         $num_feeds = db_fetch_result($result, 0, "num_feeds");
491
492                                         if ($num_feeds == 0) {
493                                                 db_query($link, "DELETE FROM ttrss_feed_categories
494                                                         WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
495                                         } else {
496
497                                                 print "<div class=\"warning\">
498                                                         Unable to delete non empty feed categories.</div>";
499                                                         
500                                         }
501
502                                         db_query($link, "COMMIT");
503                                 }
504                         }
505                 }
506
507                 if ($subop == "categorize") {
508
509                         if (!WEB_DEMO_MODE) {
510
511                                 $ids = split(",", db_escape_string($_GET["ids"]));
512
513                                 $cat_id = db_escape_string($_GET["cat_id"]);
514
515                                 if ($cat_id == 0) {
516                                         $cat_id_qpart = 'NULL';
517                                 } else {
518                                         $cat_id_qpart = "'$cat_id'";
519                                 }
520
521                                 db_query($link, "BEGIN");
522
523                                 foreach ($ids as $id) {
524                                 
525                                         db_query($link, "UPDATE ttrss_feeds SET cat_id = $cat_id_qpart
526                                                 WHERE id = '$id' AND parent_feed IS NULL
527                                                 AND owner_uid = " . $_SESSION["uid"]);
528
529                                         # update linked feed categories
530                                         db_query($link, "UPDATE ttrss_feeds SET
531                                                 cat_id = $cat_id_qpart WHERE parent_feed = '$id' AND 
532                                                 owner_uid = " . $_SESSION["uid"]);
533
534                                 }
535
536                                 db_query($link, "COMMIT");
537                         }
538
539                 }
540
541                 if ($quiet) return;
542
543 //              print "<h3>Edit Feeds</h3>";
544
545                 $result = db_query($link, "SELECT id,title,feed_url,last_error
546                         FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ".$_SESSION["uid"]);
547
548                 if (db_num_rows($result) > 0) {
549                 
550                         print "<div class=\"warning\">";
551                         
552 //                      print"<img class=\"closeButton\" 
553 //                              onclick=\"javascript:hideParentElement(this);\" src=\"images/close.png\">";
554         
555                         print "<a href=\"javascript:showBlockElement('feedUpdateErrors')\">
556                                 <b>Some feeds have update errors (click for details)</b></a>";
557
558                         print "<ul id=\"feedUpdateErrors\" class=\"nomarks\">";
559                                                 
560                         while ($line = db_fetch_assoc($result)) {
561                                 print "<li>" . $line["title"] . " (" . $line["feed_url"] . "): " . 
562                                         $line["last_error"];
563                         }
564
565                         print "</ul>";
566                         print "</div>";
567
568                 }
569
570                 $feed_search = db_escape_string($_GET["search"]);
571
572                 if (array_key_exists("search", $_GET)) {
573                         $_SESSION["prefs_feed_search"] = $feed_search;
574                 } else {
575                         $feed_search = $_SESSION["prefs_feed_search"];
576                 }
577
578                 print "<div class=\"feedEditSearch\">
579                         <input id=\"feed_search\" size=\"20\"  
580                                 onchange=\"javascript:updateFeedList()\" value=\"$feed_search\">
581                         <input type=\"submit\" class=\"button\" 
582                                 onclick=\"javascript:updateFeedList()\" value=\"Search\">
583                         </div>";
584
585                 print "<div class=\"prefGenericAddBox\">
586                         <input id=\"fadd_link\" 
587                                 onkeyup=\"toggleSubmitNotEmpty(this, 'fadd_submit_btn')\"
588                                 size=\"40\">
589                         <input type=\"submit\" class=\"button\"
590                                 disabled=\"true\" id=\"fadd_submit_btn\"
591                                 onclick=\"addFeed()\" value=\"Subscribe\">";
592
593                 if (ENABLE_FEED_BROWSER && !SINGLE_USER_MODE) {
594                         print " <input type=\"submit\" class=\"button\"
595                                 onclick=\"javascript:browseFeeds()\" value=\"Top 25\">";
596                 }
597
598                 print "</div>";
599
600                 $feeds_sort = db_escape_string($_GET["sort"]);
601
602                 if (!$feeds_sort || $feeds_sort == "undefined") {
603                         $feeds_sort = $_SESSION["pref_sort_feeds"];                     
604                         if (!$feeds_sort) $feeds_sort = "title";
605                 }
606
607                 $_SESSION["pref_sort_feeds"] = $feeds_sort;
608
609                 if ($feed_search) {
610                         $search_qpart = "(UPPER(F1.title) LIKE UPPER('%$feed_search%') OR
611                                 UPPER(F1.feed_url) LIKE UPPER('%$feed_search%')) AND";
612                 } else {
613                         $search_qpart = "";
614                 }
615
616                 if (get_pref($link, 'ENABLE_FEED_CATS')) {
617                         $order_by_qpart = "category,$feeds_sort,title";
618                 } else {
619                         $order_by_qpart = "$feeds_sort,title";
620                 }
621
622                 $result = db_query($link, "SELECT 
623                                 F1.id,
624                                 F1.title,
625                                 F1.feed_url,
626                                 substring(F1.last_updated,1,16) AS last_updated,
627                                 F1.parent_feed,
628                                 F1.update_interval,
629                                 F1.purge_interval,
630                                 F1.cat_id,
631                                 F2.title AS parent_title,
632                                 C1.title AS category,
633                                 F1.hidden,
634                                 F1.include_in_digest,
635                                 (SELECT SUBSTRING(MAX(updated),1,16) FROM ttrss_user_entries, 
636                                         ttrss_entries WHERE ref_id = ttrss_entries.id 
637                                         AND feed_id = F1.id) AS last_article
638                         FROM 
639                                 ttrss_feeds AS F1 
640                                 LEFT JOIN ttrss_feeds AS F2
641                                         ON (F1.parent_feed = F2.id)
642                                 LEFT JOIN ttrss_feed_categories AS C1
643                                         ON (F1.cat_id = C1.id)
644                         WHERE 
645                                 $search_qpart F1.owner_uid = '".$_SESSION["uid"]."'                     
646                         ORDER by $order_by_qpart");
647
648                 if (db_num_rows($result) != 0) {
649
650 //                      print "<div id=\"infoBoxShadow\"><div id=\"infoBox\">PLACEHOLDER</div></div>";
651
652                         print "<p><table width=\"100%\" cellspacing=\"0\" 
653                                 class=\"prefFeedList\" id=\"prefFeedList\">";
654                         print "<tr><td class=\"selectPrompt\" colspan=\"8\">
655                                 Select: 
656                                         <a href=\"javascript:selectPrefRows('feed', true)\">All</a>,
657                                         <a href=\"javascript:selectPrefRows('feed', false)\">None</a>
658                                 </td</tr>";
659
660                         if (!get_pref($link, 'ENABLE_FEED_CATS')) {
661                                 print "<tr class=\"title\">
662                                         <td width='5%' align='center'>&nbsp;</td>";
663
664                                 if (get_pref($link, 'ENABLE_FEED_ICONS')) {
665                                         print "<td width='3%'>&nbsp;</td>";
666                                 }
667
668                                 print "
669                                         <td width='35%'><a href=\"javascript:updateFeedList('title')\">Title</a></td>
670                                         <td width='35%'><a href=\"javascript:updateFeedList('feed_url')\">Feed</a></td>
671                                         <td width='15%'><a href=\"javascript:updateFeedList('last_article')\">Last&nbsp;Article</a></td>
672                                         <td width='15%' align='right'><a href=\"javascript:updateFeedList('last_updated')\">Updated</a></td>";
673                         }
674                         
675                         $lnum = 0;
676
677                         $cur_cat_id = -1;
678                         
679                         while ($line = db_fetch_assoc($result)) {
680         
681                                 $feed_id = $line["id"];
682                                 $cat_id = $line["cat_id"];
683
684                                 $edit_title = htmlspecialchars(db_unescape_string($line["title"]));
685                                 $edit_link = htmlspecialchars(db_unescape_string($line["feed_url"]));
686                                 $edit_cat = htmlspecialchars(db_unescape_string($line["category"]));
687
688                                 $hidden = sql_bool_to_bool($line["hidden"]);
689
690                                 if (!$edit_cat) $edit_cat = "Uncategorized";
691
692                                 $last_updated = $line["last_updated"];
693
694                                 if (get_pref($link, 'HEADLINES_SMART_DATE')) {
695                                         $last_updated = smart_date_time(strtotime($last_updated));
696                                 } else {
697                                         $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
698                                         $last_updated = date($short_date, strtotime($last_updated));
699                                 }
700
701                                 $last_article = $line["last_article"];
702
703                                 if (get_pref($link, 'HEADLINES_SMART_DATE')) {
704                                         $last_article = smart_date_time(strtotime($last_article));
705                                 } else {
706                                         $short_date = get_pref($link, 'SHORT_DATE_FORMAT');
707                                         $last_article = date($short_date, strtotime($last_article));
708                                 }
709
710                                 if (get_pref($link, 'ENABLE_FEED_CATS') && $cur_cat_id != $cat_id) {
711                                         $lnum = 0;
712                                 
713                                         print "<tr><td colspan=\"6\" class=\"feedEditCat\">$edit_cat</td></tr>";
714
715                                         print "<tr class=\"title\">
716                                                 <td width='5%'>&nbsp;</td>";
717
718                                         if (get_pref($link, 'ENABLE_FEED_ICONS')) {
719                                                 print "<td width='3%'>&nbsp;</td>";
720                                         }
721
722                                         print "<td width='35%'><a href=\"javascript:updateFeedList('title')\">Title</a></td>
723                                                 <td width='35%'><a href=\"javascript:updateFeedList('feed_url')\">Feed</a></td>
724                                                 <td width='15%'><a href=\"javascript:updateFeedList('last_article')\">Last&nbsp;Article</a></td>
725                                                 <td width='15%' align='right'><a href=\"javascript:updateFeedList('last_updated')\">Updated</a></td>";
726
727                                         $cur_cat_id = $cat_id;
728                                 }
729
730                                 $class = ($lnum % 2) ? "even" : "odd";
731                                 $this_row_id = "id=\"FEEDR-$feed_id\"";
732
733                                 print "<tr class=\"$class\" $this_row_id>";
734         
735                                 $icon_file = ICONS_DIR . "/$feed_id.ico";
736         
737                                 if (file_exists($icon_file) && filesize($icon_file) > 0) {
738                                                 $feed_icon = "<img class=\"tinyFeedIcon\"       src=\"" . ICONS_URL . "/$feed_id.ico\">";
739                                 } else {
740                                         $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
741                                 }
742                                 
743                                 print "<td class='feedSelect'><input onclick='toggleSelectPrefRow(this, \"feed\");' 
744                                 type=\"checkbox\" id=\"FRCHK-".$line["id"]."\"></td>";
745
746                                 if (get_pref($link, 'ENABLE_FEED_ICONS')) {
747                                         print "<td class='feedIcon'>$feed_icon</td>";           
748                                 }
749
750                                 $edit_title = truncate_string($edit_title, 40);
751                                 $edit_link = truncate_string($edit_link, 60);
752
753                                 if ($hidden) {
754                                         $edit_title = "<span class=\"insensitive\">$edit_title (Hidden)</span>";
755                                         $edit_link = "<span class=\"insensitive\">$edit_link</span>";
756                                         $last_updated = "<span class=\"insensitive\">$last_updated</span>";
757                                         $last_article = "<span class=\"insensitive\">$last_article</span>";
758                                 }
759
760                                 $parent_title = $line["parent_title"];
761                                 if ($parent_title) {
762                                         $parent_title = "<span class='groupPrompt'>(linked to 
763                                                 $parent_title)</span>";
764                                 }
765
766                                 print "<td><a href=\"javascript:editFeed($feed_id);\">" . 
767                                         "$edit_title $parent_title" . "</a></td>";              
768                                         
769                                 print "<td><a href=\"javascript:editFeed($feed_id);\">" . 
770                                         $edit_link . "</a></td>";               
771
772                                 print "<td><a href=\"javascript:editFeed($feed_id);\">" . 
773                                         "$last_article</a></td>";
774
775                                 print "<td align='right'><a href=\"javascript:editFeed($feed_id);\">" . 
776                                         "$last_updated</a></td>";
777
778                                 print "</tr>";
779         
780                                 ++$lnum;
781                         }
782         
783                         print "</table>";
784
785                         print "<p><span id=\"feedOpToolbar\">";
786         
787                         if ($subop == "edit") {
788                                 print "Edit feed:&nbsp;
789                                         <input type=\"submit\" class=\"button\" 
790                                                 onclick=\"javascript:feedEditCancel()\" value=\"Cancel\">
791                                         <input type=\"submit\" class=\"button\" 
792                                                 onclick=\"javascript:feedEditSave()\" value=\"Save\">";
793                         } else {
794         
795                                 print "
796                                         Selection:&nbsp;
797                                 <input type=\"submit\" class=\"button\" disabled=\"true\"
798                                         onclick=\"javascript:editSelectedFeed()\" value=\"Edit\">
799                                 <input type=\"submit\" class=\"button\" disabled=\"true\"
800                                         onclick=\"javascript:removeSelectedFeeds()\" value=\"Unsubscribe\">";
801
802                                 if (get_pref($link, 'ENABLE_FEED_CATS')) {
803
804                                         print "&nbsp;|&nbsp;";                          
805
806                                         print_feed_cat_select($link, "sfeed_set_fcat", "", "disabled");
807
808                                         print " <input type=\"submit\" class=\"button\" disabled=\"true\"
809                                         onclick=\"javascript:categorizeSelectedFeeds()\" value=\"Recategorize\">";
810
811                                 }
812                                 
813                                 print "</span>
814                                         &nbsp;All feeds: <input type=\"submit\" 
815                                                         class=\"button\" onclick=\"gotoExportOpml()\" 
816                                                         value=\"Export OPML\">";                        
817                                 }
818                 } else {
819
820                         print "<p>No feeds defined.</p>";
821
822                 }
823
824                 if (get_pref($link, 'ENABLE_FEED_CATS')) {
825
826                         print "<h3>Edit Categories</h3>";
827
828                         print "<div class=\"prefGenericAddBox\">
829                                 <input id=\"fadd_cat\" 
830                                         onkeyup=\"toggleSubmitNotEmpty(this, 'catadd_submit_btn')\"
831                                         size=\"40\">&nbsp;
832                                 <input 
833                                         type=\"submit\" class=\"button\" disabled=\"true\" id=\"catadd_submit_btn\"
834                                         onclick=\"javascript:addFeedCat()\" value=\"Create category\"></div>";
835         
836                         $result = db_query($link, "SELECT title,id FROM ttrss_feed_categories
837                                 WHERE owner_uid = ".$_SESSION["uid"]."
838                                 ORDER BY title");
839
840                         if (db_num_rows($result) != 0) {
841         
842                                 print "<form id=\"feed_cat_edit_form\">";
843                                 
844                                 print "<p><table width=\"100%\" class=\"prefFeedCatList\" 
845                                         cellspacing=\"0\" id=\"prefFeedCatList\">";
846
847                                 print "<tr><td class=\"selectPrompt\" colspan=\"8\">
848                                 Select: 
849                                         <a href=\"javascript:selectPrefRows('fcat', true)\">All</a>,
850                                         <a href=\"javascript:selectPrefRows('fcat', false)\">None</a>
851                                 </td</tr>";
852
853                                 print "<tr class=\"title\">
854                                                         <td width=\"5%\">&nbsp;</td><td width=\"80%\">Title</td>
855                                                 </tr>";
856                                                 
857                                 $lnum = 0;
858                                 
859                                 while ($line = db_fetch_assoc($result)) {
860                 
861                                         $class = ($lnum % 2) ? "even" : "odd";
862                 
863                                         $cat_id = $line["id"];
864                 
865                                         $edit_cat_id = $_GET["id"];
866                 
867                                         if ($subop == "editCat" && $cat_id != $edit_cat_id) {
868                                                         $class .= "Grayed";
869                                                         $this_row_id = "";
870                                         } else {
871                                                 $this_row_id = "id=\"FCATR-$cat_id\"";
872                                         }
873                 
874                                         print "<tr class=\"$class\" $this_row_id>";
875                 
876                                         $edit_title = htmlspecialchars(db_unescape_string($line["title"]));
877                 
878                                         if (!$edit_cat_id || $subop != "editCat") {
879                 
880                                                 print "<td align='center'><input onclick='toggleSelectPrefRow(this, \"fcat\");' 
881                                                         type=\"checkbox\" id=\"FCCHK-".$line["id"]."\"></td>";
882                 
883                                                 print "<td><a href=\"javascript:editFeedCat($cat_id);\">" . 
884                                                         $edit_title . "</a></td>";              
885                 
886                                         } else if ($cat_id != $edit_cat_id) {
887                 
888                                                 print "<td align='center'><input disabled=\"true\" type=\"checkbox\" 
889                                                         id=\"FRCHK-".$line["id"]."\"></td>";
890                 
891                                                 print "<td>$edit_title</td>";           
892                 
893                                         } else {
894                 
895                                                 print "<td align='center'><input disabled=\"true\" type=\"checkbox\" checked>";
896                                                 
897                                                 print "<input type=\"hidden\" name=\"id\" value=\"$cat_id\">";
898                                                 print "<input type=\"hidden\" name=\"op\" value=\"pref-feeds\">";
899                                                 print "<input type=\"hidden\" name=\"subop\" value=\"saveCat\">";
900                                         
901                                                 print "</td>";
902                 
903                                                 print "<td><input onkeypress=\"return filterCR(event)\"
904                                                         name=\"title\" class=\"iedit\" value=\"$edit_title\"></td>";
905                                                 
906                                         }
907                                         
908                                         print "</tr>";
909                 
910                                         ++$lnum;
911                                 }
912         
913                                 print "</table>";
914
915                                 print "</form>";
916         
917                                 print "<p id=\"catOpToolbar\">";
918         
919                                 if ($subop == "editCat") {
920                                         print "Edit category:&nbsp;
921                                                 <input type=\"submit\" class=\"button\"
922                                                         onclick=\"return feedCatEditSave()\" value=\"Save\">
923                                                 <input type=\"submit\" class=\"button\"
924                                                         onclick=\"return feedCatEditCancel()\" value=\"Cancel\">";
925                                         } else {
926                 
927                                         print "
928                                                 Selection:&nbsp;
929                                         <input type=\"submit\" class=\"button\" disabled=\"true\"
930                                                 onclick=\"return editSelectedFeedCat()\" value=\"Edit\">
931                                         <input type=\"submit\" class=\"button\" disabled=\"true\"
932                                                 onclick=\"return removeSelectedFeedCats()\" value=\"Remove\">";
933         
934                                 }
935         
936                         } else {
937                                 print "<p>No feed categories defined.</p>";
938                         }
939                 }
940
941                 print "<h3>Import OPML</h3>
942                 <form   enctype=\"multipart/form-data\" method=\"POST\" action=\"opml.php\">
943                         File: <input id=\"opml_file\" name=\"opml_file\" type=\"file\">&nbsp;
944                         <input class=\"button\" name=\"op\" onclick=\"return validateOpmlImport();\"
945                                 type=\"submit\" value=\"Import\">
946                         </form>";
947         }
948 ?>