= 1) { list($cid) = rss_fetch_row($res); } else { $cid = ""; // is this a folder? $sql = "select c.id, c.parent from ". getTable('channels')." c " ." inner join " . getTable('folders') . " f on f.id = c.parent " ." where f.name like '$sqlid' and f.id > 0"; if (hidePrivate()) { $sql .=" and (c.mode & " . RSS_MODE_PRIVATE_STATE.")=0 "; } $sql .= " and (c.mode & " . RSS_MODE_DELETED_STATE.")=0 "; $res = rss_query( $sql ); if ( rss_num_rows ( $res ) > 0) { $cids = array(); while (list ($cid__,$fid__) = rss_fetch_row($res)) { $cids[] = $cid__; $fid = $fid__; } } else { // maybe it's a virtual folder? $sql = "select c.id, m.tid from ". getTable('channels')." c " ."inner join " . getTable('metatag') . " m on m.fid = c.id " ."inner join " . getTable('tag') . " t on t.id = m.tid " . "where m.ttype = 'channel' " . "and t.tag like '$sqlid'"; if (hidePrivate()) { $sql .=" and (c.mode & " . RSS_MODE_PRIVATE_STATE.")=0 "; } $sql .= " and (c.mode & " . RSS_MODE_DELETED_STATE.")=0 "; $res = rss_query( $sql ); if ( rss_num_rows ( $res ) > 0) { $cids = array(); while (list ($cid__,$vfid__) = rss_fetch_row($res)) { $cids[] = $cid__; $vfid = $vfid__; } } } } // date ? if ($cid != "" && array_key_exists('y',$_REQUEST) && $_REQUEST['y'] != "" && is_numeric($_REQUEST['y']) && array_key_exists('m',$_REQUEST) && $_REQUEST['m'] != "" && is_numeric($_REQUEST['m'])) { $y = (int) $_REQUEST['y']; if ($y < 1000) $y+=2000; $m = (int)$_REQUEST['m']; if ($m > 12) { $m = date("m"); } $d = (int)$_REQUEST['d']; if ($d > 31) { $d = date("d"); } } // lets see if theres an item id as well $iid = ""; if ($cid != "" && array_key_exists('iid',$_REQUEST) && $_REQUEST['iid'] != "") { $sqlid = preg_replace("/[_';]/","%",sanitize($_REQUEST['iid'],RSS_SANITIZER_SIMPLE_SQL|RSS_SANITIZER_NO_SPACES)); $sql = "select id from " .getTable("item") ." i where i.title like '$sqlid' and i.cid=$cid"; if ($m > 0 && $y > 0) { $sql .= " and month(coalesce(i.pubdate,i.added))= $m " ." and year(coalesce(i.pubdate, i.added))= $y "; if ($d > 0) { $sql .= " and dayofmonth(coalesce(i.pubdate,i.added))= $d "; } } if (hidePrivate()) { $sql .=" and (i.unread & " . RSS_MODE_PRIVATE_STATE.")=0 "; } $sql .=" and (i.unread & " . RSS_MODE_DELETED_STATE.")=0 "; $sql .=" order by i.added desc, i.id asc"; $res = rss_query( $sql ); if ( rss_num_rows ( $res ) >0) { list($iid) = rss_fetch_row($res); } } // no mod rewrite: ugly but effective } elseif (array_key_exists('channel',$_REQUEST) || array_key_exists('folder',$_REQUEST) || array_key_exists('vfolder',$_REQUEST)) { $cid= (array_key_exists('channel',$_REQUEST))?sanitize($_REQUEST['channel'],RSS_SANITIZER_NUMERIC):""; $iid= (array_key_exists('iid',$_REQUEST))?sanitize($_REQUEST['iid'],RSS_SANITIZER_NUMERIC):""; $fid= (array_key_exists('folder',$_REQUEST))?sanitize($_REQUEST['folder'],RSS_SANITIZER_NUMERIC):""; $vfid= (array_key_exists('vfolder',$_REQUEST))?sanitize($_REQUEST['vfolder'],RSS_SANITIZER_NUMERIC):""; $y= (array_key_exists('y',$_REQUEST))?sanitize($_REQUEST['y'],RSS_SANITIZER_NUMERIC):"0"; $m= (array_key_exists('m',$_REQUEST))?sanitize($_REQUEST['m'],RSS_SANITIZER_NUMERIC):"0"; $d= (array_key_exists('d',$_REQUEST))?sanitize($_REQUEST['d'],RSS_SANITIZER_NUMERIC):"0"; if ($fid) { $sql = "select c.id from ". getTable('channels')." c " ." where c.parent=$fid and c.parent > 0"; $sql .= " and (c.mode & " . RSS_MODE_DELETED_STATE.")=0 "; if (hidePrivate()) { $sql .=" and (c.mode & " . RSS_MODE_PRIVATE_STATE.")=0 "; } $res = rss_query( $sql ); if ( rss_num_rows ( $res ) > 0) { $cids = array(); while (list ($cid__) = rss_fetch_row($res)) { $cids[] = $cid__; } } } elseif ($vfid) { $sql = "select c.id, m.tid from ". getTable('channels')." c " ."inner join " . getTable('metatag') . " m on m.fid = c.id " ."inner join " . getTable('tag') . " t on t.id = m.tid " . "where m.ttype = 'channel'"; // $vfid can be numeric (t.id) or alphabetic (t.tag) if(is_numeric($vfid)) { $sql .= "and t.id = $vfid"; } else { $sql .= "and t.tag like '$vfid'"; } $sql .= " and (c.mode & " . RSS_MODE_DELETED_STATE.")=0 "; if (hidePrivate()) { $sql .=" and (c.mode & " . RSS_MODE_PRIVATE_STATE.")=0 "; } $res = rss_query( $sql ); if ( rss_num_rows ( $res ) > 0) { $cids = array(); while (list ($cid__,$vfid__) = rss_fetch_row($res)) { $cids[] = $cid__; $vfid = $vfid__; } } } elseif ($cid) { if (hidePrivate()) { $sql = "select id from ". getTable('channels')." where id=$cid "; $sql .=" and (mode & " . RSS_MODE_PRIVATE_STATE.")=0 "; list ($cid) = rss_fetch_row(rss_query($sql)); } } } elseif ( array_key_exists('y',$_REQUEST) && $_REQUEST['y'] != "" && is_numeric($_REQUEST['y']) && array_key_exists('m',$_REQUEST) && $_REQUEST['m'] != "" && is_numeric($_REQUEST['m']) && array_key_exists('d',$_REQUEST) && $_REQUEST['d'] != "" && is_numeric($_REQUEST['d']) ) { $y = (int) sanitize($_REQUEST['y'],RSS_SANITIZER_NUMERIC); if ($y < 1000) $y+=2000; $m = (int) sanitize($_REQUEST['m'],RSS_SANITIZER_NUMERIC); if ($m > 12) { $m = date("m"); } $d = (int) sanitize($_REQUEST['d'],RSS_SANITIZER_NUMERIC); if ($d > 31) { $d = date("d"); } $iid = $cid = null; } // If we have no channel-id something went terribly wrong. // Send a 404. if ( // channel id: ( // not set !isset($cid) || // ...or empty $cid == "" || // or not numeric while mod_rewrite is off ( !getConfig('rss.output.usemodrewrite') && !is_numeric($cid) ) ) && // folder id ( // not set !isset($cids) || // not an array of ids !is_array($cids) || // zero elements !count($cids) ) && // virtual folder id (!isset($vfid)) && // date? ($d == 0 && $m == 0 && $y == 0) ) { rss_404(); exit; } //echo ("cid=".(isset($cid)?"$cid":"") . " fid=" . (isset($fid)?"$fid":"")); if (isLoggedIn() && array_key_exists ('metaaction', $_REQUEST)) { if (array_key_exists('markreadids',$_POST)) { $IdsToMarkAsRead = explode(",",rss_real_escape_string($_POST['markreadids'])); //var_dump($IdsToMarkAsRead); } else { $IdsToMarkAsRead = array(); } switch ($_REQUEST['metaaction']) { case 'ACT_MARK_CHANNEL_READ': /** mark channel as read **/ $sql = "update " .getTable("item") ." set unread = unread & ".SET_MODE_READ_STATE." where cid=$cid"; if (hidePrivate()) { $sql .= " and (unread & " . RSS_MODE_PRIVATE_STATE.")=0"; } if (count($IdsToMarkAsRead)) { $sql .= " and id in (" . implode(',',$IdsToMarkAsRead) .")"; } rss_query($sql); rss_invalidate_cache(); /* Redirect! If this feed has more unread items, self-redirect */ $sql = "select count(*) from " .getTable("item") . " i " ." where (i.unread & " .RSS_MODE_UNREAD_STATE.")!=0" ." and i.cid=$cid" ." and (i.unread & " . RSS_MODE_DELETED_STATE.")=0 "; if (hidePrivate()) { $sql .=" and (i.unread & " . RSS_MODE_PRIVATE_STATE.")=0 "; } list($hasMoreUnreads) = rss_fetch_row(rss_query($sql)); //more unread items in this feed? if ($hasMoreUnreads) { $next_unread_id=$cid; } else { /* Find where we should redirect - The next feed in the list with unread items, or, failing that: - The first feed in the list with unread items, or, faling that: - The main page */ // 1: build a list of all feeds: $feeds = array(); $sql = "select c.id from " . getTable('channels') . " c " ."inner join " . getTable('folders') . " f on f.id = c.parent " . "where (c.mode & " . RSS_MODE_DELETED_STATE.")=0 "; if (hidePrivate()) { $sql .= " and (c.mode & " . RSS_MODE_PRIVATE_STATE.")=0 "; } if (getConfig('rss.config.absoluteordering')) { $sql .= " order by f.position asc, c.position asc"; } else { $sql .=" order by f.name asc, c.title asc"; } $res = rss_query($sql); while (list($cid__) = rss_fetch_row($res)) { $feeds[$cid__] = 0; } // 2: Get the unread count for each feed: $sql = "select cid, count(*) from " .getTable('item') ." where (unread & ".RSS_MODE_UNREAD_STATE.")!=0 " ." and (unread & " .RSS_MODE_DELETED_STATE.")=0 "; if (hidePrivate()) { $sql .= " and (i.unread & " . RSS_MODE_PRIVATE_STATE.")=0 "; } $sql .= " group by cid"; $res = rss_query($sql); while (list($cid__,$uc__) = rss_fetch_row($res)) { // this makes sure only the feeds that were gathered in the // last query are put into this array.. fixes #305 if(array_key_exists($cid__, $feeds)) { $feeds[$cid__] = $uc__; } } // 3: iterate over the feeds and see where we should redirect. $found = false; $first_unread_id = $next_unread_id = 0; foreach($feeds as $cid__ => $cnt) { // reached the feed we're coming from? if ($cid == $cid__) { $found = true; } // if not yet, get a hold of the first in the list with unread items if ($cnt && !$first_unread_id) { $first_unread_id = $cid__; } // passed the previous feed? We got a winner! if ($cnt && $found) { $next_unread_id = $cid__; break; } } // found none after the previous feed, but there is on on top if (!$next_unread_id && $first_unread_id) { $next_unread_id = $first_unread_id; } } //redirect if (!$next_unread_id) { rss_redirect(); } else { $cid = $next_unread_id; } break; // folder case 'ACT_MARK_FOLDER_READ': $fid = sanitize($_REQUEST['folder'],RSS_SANITIZER_NUMERIC); $rs = rss_query("select id from " .getTable('channels') . " where parent=$fid"); $cids_ = array(); while(list($cid_) = rss_fetch_row($rs)) { $cids_[]=$cid_; } $sql = "update " .getTable('item') . " set unread = unread & ".SET_MODE_READ_STATE . " where cid in (" .implode(',', $cids_) . ") "; unset($cids_); if (count($IdsToMarkAsRead)) { $sql .= " and id in (" . implode(',',$IdsToMarkAsRead) .")"; } //die($sql); rss_query($sql); rss_invalidate_cache(); $next_fid = $first_fid = 0; $found = false; $res = rss_query( " select id from " .getTable('folders') ." f order by " .(getConfig('rss.config.absoluteordering')?" f.position asc":"f.name asc") ); while (list($fid__) = rss_fetch_row($res)) { if($fid__ == $fid) { $found = true; } if( $found || !$first_fid ) { $sql = "select count(*) from " . getTable('item') ." i " ."inner join " . getTable('channels') ." c on c.id = i.cid " ." where (i.unread & " .RSS_MODE_UNREAD_STATE.")!=0 and c.parent = $fid__"; if (hidePrivate()) { $sql .= " and (i.unread & " . RSS_MODE_PRIVATE_STATE.")=0"; } list($c) = rss_fetch_row(rss_query($sql)); //echo "$fid__ -> $c\n"; if ($c > 0) { if (!$first_fid) $first_fid = $fid__; if ($found) { $next_fid = $fid__; break; } } } } if( !$next_fid && $first_fid ) $next_fid = $first_fid; if ( $next_fid ) { $fid = $next_fid; $sql = "select id from " . getTable('channels') ." where parent=$fid"; $res = rss_query($sql); $cids = array(); while ( list($cid__) = rss_fetch_row($res)) { $cids[] = $cid__; } } else { rss_redirect(); } break; // virtual folder - code extremely similar to __('Mark These Items as Read') case 'ACT_MARK_VFOLDER_READ': $vfid = sanitize($_REQUEST['vfolder'],RSS_SANITIZER_NUMERIC); $rs = rss_query( "select fid from " .getTable('metatag') . "m " ." where m.ttype = 'channel' and m.tid = $vfid"); $fids_ = array(); while(list($fid_) = rss_fetch_row($rs)) { $fids_[]=$fid_; } $sql = "update " .getTable('item') . " set unread = unread & ".SET_MODE_READ_STATE . " where cid in (" .implode(',',$fids_). ")"; if (count($IdsToMarkAsRead)) { $sql .= " and id in (" . implode(',',$IdsToMarkAsRead) .")"; } rss_query($sql); rss_invalidate_cache(); // find next virtual folder to redirect to $next_vfid = $first_vfid = 0; $found = false; $res = rss_query("select distinct m.tid from " .getTable('metatag') ." m " . "inner join " . getTable('tag') ."t on t.id = m.tid order by t.tag asc"); while (list($tid__) = rss_fetch_row($res)) { if ($tid__ == $vfid) { $found = true; } if( $found || !$first_vfid ) { // check for unread items in next virtual folder $sql = "select count(distinct(i.id)) as cnt from " .getTable('metatag') ." left join " .getTable('item') . "i on (i.cid=fid) " ."where tid = $tid__ and ttype = 'channel' " ." and (i.unread & ".RSS_MODE_UNREAD_STATE.")!=0 " ."and (i.unread & ".RSS_MODE_DELETED_STATE.")=0"; if (hidePrivate()) { $sql .= " and (i.unread & " . RSS_MODE_PRIVATE_STATE.")=0"; } list($c) = rss_fetch_row(rss_query($sql)); if ($c > 0) { if (!$first_vfid) $first_vfid = $tid__; if ($found) { $next_vfid = $tid__; break; } } } } if( !$next_vfid && $first_vfid ) $next_vfid = $first_vfid; if($next_vfid) { $vfid = $next_vfid; $sql = "select distinct(fid) from " . getTable('metatag') . " where tid = $vfid"; $res = rss_query($sql); $cids = array(); while(list($cid__) = rss_fetch_row($res)) { $cids[] = $cid__; } } else { rss_redirect(); } break; } if( array_key_exists ('redirectto', $_REQUEST)) { header("Location: " . $_REQUEST['redirectto']); exit(); } } //echo ("cid=".(isset($cid)?"$cid":"") . " fid=" . (isset($fid)?"$fid":"")); assert( (isset($cid) && is_numeric($cid)) || (isset($fid) && isset($cids) && is_array($cids) && count($cids)) || (isset($vfid) && isset($cids) && is_array($cids) && count($cids)) || (!isset($cid) && ($y || $m)) ); $itemFound = true; if ($iid != "" && !is_numeric($iid)) { //item was deleted $itemFound = false; $iid = ""; } // make sure the variables passed to makeName are initialized if (!isset($fid)) { $fid=null; } if (!isset($vfid)) { $vfid=null; } if (!isset($cids)) { $cids=null; } //precompute the navigation hints, which will be passed to the header as s $links = NULL; if (($cid || $fid || $vfid || ($y && $m && $d)) && ($nv = makeNav($cid,$iid,$y,$m,$d,$fid,$vfid,$cids)) != null) { list($prev,$succ, $up) = $nv; $links =array(); if ($prev != null) { $links['prev'] = array('title' => $prev['lbl'], 'href' => $prev['url']); } if ($succ != null) { $links['next'] = array( 'title' => $succ['lbl'], 'href' => $succ['url']); } if ($up != null) { $links['up'] = array( 'title' => $up['lbl'], 'href' => $up['url'] ); } } if ($iid == "") { $cidfid = array(); // "channel / folder mode" $prepend = false; if ($cid) { $res = rss_query("select title,icon from " . getTable("channels") ." where id = $cid"); list($title,$icon) = rss_fetch_row($res); if (isset($y) && $y > 0 && $m > 0 && $d == 0) { $dtitle = (" " . TITLE_SEP ." " . rss_locale_date('%B %Y',mktime(0,0,0,$m,1,$y),false)); $prepend=true; } elseif (isset($y) && $y > 0 && $m > 0 && $d > 0) { $prepend=true; $dtitle = (" " . TITLE_SEP ." " . rss_locale_date('%B %e, %Y',mktime(0,0,0,$m,$d,$y),false)); } else { $dtitle =""; } $cidfid ['cid']=$cid; $cidfid ['fid']=null; } elseif($fid) { list($title) = rss_fetch_row( rss_query("select name from " . getTable('folders') . " where id = $fid") ); $dtitle =""; $cidfid ['cid']=null; $cidfid ['fid']=$fid; } elseif($vfid) { list($title) = rss_fetch_row(rss_query("select tag from " . getTable('tag') . " where id = $vfid")); $dtitle = ""; $cidfid ['cid']=null; $cidfid ['fid']=null; } elseif($y && $m && $d) { $dtitle = ( rss_locale_date('%B %e, %Y',mktime(0,0,0,$m,$d,$y),false)); $cidfid ['cid']=null; $cidfid ['fid']=null; $title =""; } else { $dtitle =""; $title = ""; $cidfid ['cid']=null; $cidfid ['fid']=null; } if ($links) { foreach ($links as $rel => $val) { if (($lbl = $links[$rel]['title']) != "" && $prepend) { $links[$rel]['title'] = htmlentities( $title,ENT_COMPAT,"UTF-8" ) . " " . TITLE_SEP ." " . $lbl; } elseif (($lbl = $links[$rel]['title']) != "" && !$prepend) { $links[$rel]['title'] = htmlentities( $lbl, ENT_COMPAT,"UTF-8" ); } elseif ($title) { $links[$rel]['title'] = htmlentities( $title,ENT_COMPAT,"UTF-8" ); } } } //rss_header( rss_htmlspecialchars( $title ) . $dtitle,0,$cidfid,"", HDR_NONE, $links); $GLOBALS['rss'] -> header = new Header( rss_htmlspecialchars( $title ) . $dtitle,0,$cidfid,"", HDR_NONE, $links); } else { // "item mode" $res = rss_query ("select c.title, c.icon, i.title from " . getTable("channels") ." c " ."inner join " . getTable("item") ." i on i.cid = c.id where c.id = $cid and i.id=$iid" ." and (i.unread & " . RSS_MODE_DELETED_STATE.")=0 " ); list($title,$icon,$ititle) = rss_fetch_row($res); $GLOBALS['rss'] -> header = new Header( rss_htmlspecialchars($title) . " " . TITLE_SEP ." " . rss_htmlspecialchars($ititle), 0,null,"", HDR_NONE, $links ); } $GLOBALS['rss'] -> feedList = new FeedList($cid); if (array_key_exists('dbg',$_GET)) { require_once('cls/debugfeed.php'); $dbg = new DebugFeed($cid); $GLOBALS['rss'] -> appendContentObject($dbg); } else { if ($cid && !(isset($cids) && is_array($cids) && count($cids))) { $cids = array($cid); } if(!isset($vfid)) $vfid = null; doItems($cids,$fid,$vfid,$title,$iid,$y,$m,$d,(isset($nv)?$nv:null),$show_what,$show_private); } $GLOBALS['rss'] -> renderWithTemplate('index.php','items'); function doItems($cids,$fid,$vfid,$title,$iid,$y,$m,$d,$nv,$show_what,$show_private) { $do_show=$show_what; //should we honour unread-only? if ($show_what == SHOW_UNREAD_ONLY) { // permalink will always be printed if ($iid != "") { $do_show = SHOW_READ_AND_UNREAD; } else { // archives, folders, channels $sql = "select count(*) from " . getTable('item') . " where" ." (unread & " . RSS_MODE_UNREAD_STATE .")=0" ." and (unread & " . RSS_MODE_DELETED_STATE.")=0 "; //archive? if ($m > 0 && $y > 0) { $sql .= " and month(coalesce(pubdate,added))= $m " ." and year(coalesce(pubdate, added))= $y "; if ($d > 0) { $sql .= " and dayofmonth(coalesce(pubdate,added))= $d "; } } if ($cids && count($cids)) { $sql .= " and cid in (".implode(',',$cids).")"; } list($unreadCount) = rss_fetch_row(rss_query($sql)); if ($unreadCount == 0) { $do_show = SHOW_READ_AND_UNREAD; } } } $items = new PaginatedItemList(); $severalFeeds = (($fid != null) || ($vfid != null)); if ($severalFeeds && !getConfig('rss.config.feedgrouping')) { $sqlWhere = "("; foreach ($cids as $cid) { $sqlWhere .= " i.cid = $cid or "; } $sqlWhere .= " 1=0) "; $hint = ITEM_SORT_HINT_MIXED; if ($do_show == SHOW_UNREAD_ONLY) { $sqlWhere .= " and (i.unread & " . RSS_MODE_UNREAD_STATE.")!=0 "; $hint = ITEM_SORT_HINT_UNREAD; } // how many items should we display in a folder view? // default to numitemsonpage. $cnt = getConfig('rss.output.frontpage.numitems'); // if that is set to zero, use itemsinchannelview times the number of feeds in the folder if ($cnt == 0) { $cnt = count($cids) * getConfig('rss.output.itemsinchannelview'); } // should that be zero too, go for a fixed value if ($cnt == 0) { // arbitrary! $cnt = 50; } $items -> populate($sqlWhere, "", 0, $cnt, $hint); } else { if (!isset($cids)) { $cids = array(-1); } foreach ($cids as $cid) { $hint = ITEM_SORT_HINT_MIXED; if ($cid > -1) { $sqlWhere = "i.cid = $cid"; if ($do_show == SHOW_UNREAD_ONLY) { $sqlWhere .= " and (i.unread & " . RSS_MODE_UNREAD_STATE.")!=0 "; $hint = ITEM_SORT_HINT_UNREAD; } } else { $sqlWhere = " 1 = 1 "; } if ($iid != "") { $sqlWhere .= " and i.id=$iid"; } if ($m > 0 && $y > 0) { $sqlWhere .= " and month(coalesce(i.pubdate,i.added))= $m " ." and year(coalesce(i.pubdate, i.added))= $y "; if ($d > 0) { $sqlWhere .= " and dayofmonth(coalesce(i.pubdate,i.added))= $d "; } } if ( $m==0 && $y==0 ) { $sqlLimit = getConfig('rss.output.itemsinchannelview'); } else { $sqlLimit = RSS_DB_MAX_QUERY_RESULTS; } /* $sqlOrder = " order by i.unread & ".RSS_MODE_UNREAD_STATE." desc"; if(getConfig("rss.config.datedesc")){ $sqlOrder .= ", ts desc, i.id asc"; } else { $sqlOrder .= ", ts asc, i.id asc"; } */ $sqlOrder = ""; $items -> populate($sqlWhere,$sqlOrder,0, $sqlLimit, $hint, true); } } if ($items -> unreadCount && $iid == "") { $items -> preRender[] = array("showViewForm",array($show_what,$show_private)); if (!$severalFeeds) { $items -> preRender[] = array("markReadForm",$cid); $title .= " " .sprintf(__('(%d unread)'), "ucnt","",$items -> unreadCount); } else { if(!$vfid) { list($fid) = rss_fetch_row(rss_query('select parent from ' .getTable('channels') . 'where id = ' .$cids[0])); $title .= " " .sprintf(__('(%d unread)'), "ucnt","",$items -> unreadCount); $items -> preRender[] = array("markFolderReadForm",$fid); } else { list($fid) = $vfid; $title .= " " .sprintf(__('(%d unread)'), "ucnt","",$items -> unreadCount); $items -> preRender[] = array("markVirtualFolderReadForm",$vfid); } } } $items -> setTitle($title); if ($severalFeeds) { $items -> setRenderOptions(IL_NO_COLLAPSE | IL_FOLDER_VIEW); } elseif ($cid && $cid > -1) { $items -> setRenderOptions(IL_CHANNEL_VIEW); } else { $items -> setRenderOptions(IL_NO_COLLAPSE | IL_FOLDER_VIEW); } $items -> setRenderOptions(IL_TITLE_NO_ESCAPE); if ($nv != null) { list($prev,$succ,$up) = $nv; $readMoreNav = ""; if($prev != null) { $lbl = $prev['lbl']; if (function_exists('mb_strlen') && function_exists('mb_substr') && mb_strlen($lbl) > 40) { $lbl = mb_substr($lbl,0,37) . "..."; } elseif (strlen($lbl) > 40) { $lbl = substr($lbl,0,37) . "..."; } $readMoreNav .= "".ACT_NAV_PREV_PREFIX ."$lbl\n"; } if($succ != null) { $lbl = $succ['lbl']; if (function_exists('mb_strlen') && function_exists('mb_substr') && mb_strlen($lbl) > 40) { $lbl = mb_substr($lbl,0,37) . "..."; } elseif (strlen($lbl) > 40) { $lbl = substr($lbl,0,37) . "..."; } $readMoreNav .= "$lbl".ACT_NAV_SUCC_POSTFIX."\n"; } if ($readMoreNav != "") { $items->afterList = "
$readMoreNav" . "
\n
\n"; } } $GLOBALS['rss'] -> appendContentObject($items); } /** * This function will return an array for the previous, next and up * navigation elements, based on the current location * * @return: array ( ('prev'|'next'|'up')* => array ( 'y' => year of the prev,next,up item 'm' => month of the prev,next,up item 'd' => day of the prev,next,up item 'cnt' => count of the prev,next,up items for this date 'ts' => unix timestamp of the above 'url' => precomputed uri for the link 'lbl' => precomupted label to be used in the links ) ) */ function makeNav($cid,$iid,$y,$m,$d,$fid,$vfid,$cids) { //echo "X-info: $cid,$iid,$y,$m,$d,$fid,$vfid,$cids"; $currentView = null; $prev = $succ = $up = null; if (isset($_REQUEST['channel'])) { $escaped_title = rss_uri($_REQUEST['channel']); //preg_replace("/[^A-Za-z0-9\.]/","_",$_REQUEST['channel']); } else { $escaped_title = null; } // where are we anyway? if ($y > 0 && $m > 0 && $d > 0) { if ($iid != "") { $currentView = 'item'; } else { $currentView = 'day'; } } elseif ($y > 0 && $m > 0 && $d == 0) { $currentView = 'month'; } elseif ($cids) { if ($fid) { $currentView = "folder"; } elseif ($vfid) { $currentView = "cat"; } } elseif ($cid) { $currentView = "feed"; } if ($currentView) { switch ($currentView) { case 'month': case 'day': if ($currentView == 'day') { $ts_p = mktime(23,59,59,$m,$d-1,$y); $ts_s = mktime(0,0,0,$m,$d,$y); } elseif($currentView == 'month') { $ts_p = mktime(0,0,0,$m+1,0,$y); $ts_s = mktime(0,0,0,$m,1,$y); } $sql_succ = " select " ." max(UNIX_TIMESTAMP( coalesce(i.pubdate, i.added))) as ts_, " ." year( coalesce(i.pubdate, i.added)) as y_, " ." month( coalesce(i.pubdate, i.added)) as m_, " .(($currentView == 'day')?" dayofmonth( coalesce(i.pubdate, i.added)) as d_, ":"") ." count(*) as cnt_ " ." from " . getTable("item") . "i where " ." UNIX_TIMESTAMP(coalesce(i.pubdate, i.added)) > $ts_s "; if ($cid) { $sql_succ .= " and cid=$cid "; } if (hidePrivate()) { $sql_succ .=" and (i.unread & " . RSS_MODE_PRIVATE_STATE.")=0 "; } $sql_succ .= " group by y_,m_" .(($currentView == 'day')?",d_ ":"") ." order by ts_ asc limit 4"; $sql_prev = " select " ." max(UNIX_TIMESTAMP( coalesce(i.pubdate, i.added))) as ts_, " ." year( coalesce(i.pubdate, i.added)) as y_, " ." month( coalesce(i.pubdate, i.added)) as m_, " .(($currentView == 'day')?" dayofmonth( coalesce(i.pubdate, i.added)) as d_, ":"") ." count(*) as cnt_ " ." from " . getTable("item") ." i where " ." UNIX_TIMESTAMP(coalesce(i.pubdate, i.added)) < $ts_p "; if ($cid) { $sql_prev .= " and cid=$cid "; } if (hidePrivate()) { $sql_prev .=" and (i.unread & " . RSS_MODE_PRIVATE_STATE.")=0 "; } $sql_prev .= " group by y_,m_" .(($currentView == 'day')?",d_ ":"") ." order by ts_ desc limit 4"; //echo "\n"; $res_prev = rss_query($sql_prev); $res_succ = rss_query($sql_succ); $mCount = (12 * $y + $m); // next while ($succ == null && $row=rss_fetch_assoc($res_succ)) { if ($currentView == 'day') { if (mktime(0,0,0,$row['m_'],$row['d_'],$row['y_']) > $ts_s) { $succ = array( 'y' => $row['y_'], 'm' => $row['m_'], 'd' => $row['d_'], 'cnt' => $row['cnt_'], 'ts' => $row['ts_'], 'url' => makeArchiveUrl($row['ts_'],$escaped_title,$cid,($currentView == 'day')), 'lbl' => rss_locale_date('%B %e',$row['ts_']) . " (".$row['cnt_']." " . ($row['cnt_'] > 1? __('items'):__('item')) .")" ); } } elseif($currentView == 'month') { if (($row['m_'] + 12 * $row['y_']) > $mCount) { $succ = array( 'y' => $row['y_'], 'm' => $row['m_'], 'cnt' => $row['cnt_'], 'ts' => $row['ts_'], 'url' => makeArchiveUrl($row['ts_'],$escaped_title,$cid,($currentView == 'day')), 'lbl' => rss_locale_date('%B %Y',$row['ts_']) . " (".$row['cnt_']." " . ($row['cnt_'] > 1? __('items'):ITEM) .")" ); } } } // prev while ($prev == null && $row=rss_fetch_assoc($res_prev)) { if ($currentView == 'day') { if (mktime(0,0,0,$row['m_'],$row['d_'],$row['y_']) < $ts_p) { $prev = array( 'y' => $row['y_'], 'm' => $row['m_'], 'd' => $row['d_'], 'cnt' => $row['cnt_'], 'ts' => $row['ts_'], 'url' => makeArchiveUrl($row['ts_'],$escaped_title,$cid,($currentView == 'day')), 'lbl' => rss_locale_date('%B %e',$row['ts_']) . " (".$row['cnt_']." " . ($row['cnt_'] > 1? __('items'):__('item')) .")" ); } } elseif($currentView == 'month') { if (($row['m_'] + 12 * $row['y_']) < $mCount) { $prev = array( 'y' => $row['y_'], 'm' => $row['m_'], 'cnt' => $row['cnt_'], 'ts' => $row['ts_'], 'url' => makeArchiveUrl($row['ts_'],$escaped_title,$cid,($currentView == 'day')), 'lbl' => rss_locale_date('%B %Y',$row['ts_']) . " (".$row['cnt_']." ". ($row['cnt_'] > 1? __('items'):__('item')) .")" ); } } } // up if ($currentView == 'day') { $ts = mktime(0,0,0,$m,10,$y); $up = array( 'y' => $y, 'm' => $m, 'url' => makeArchiveUrl($ts,$escaped_title,$cid,false), 'lbl' => rss_locale_date('%B %Y',$ts) ); } elseif ($currentView == 'month') { $up = array( 'url' => getPath(). ( getConfig('rss.output.usemodrewrite') ? $escaped_title :"feed.php?channel=$cid") , 'lbl' => $escaped_title, 'lbl' => ''); } break; case 'item': $sql = " select i.title, i.id, " ." UNIX_TIMESTAMP( coalesce(i.pubdate, i.added)) as ts_, " ." year( coalesce(i.pubdate, i.added)) as y_, " ." month( coalesce(i.pubdate, i.added)) as m_, " ." dayofmonth( coalesce(i.pubdate, i.added)) as d_ " ." from " .getTable("item") . " i " ." where i.cid = $cid "; if (hidePrivate()) { $sql .= " and (i.unread & " . RSS_MODE_PRIVATE_STATE.")=0 "; } if(getConfig('rss.config.datedesc.unread')) { $sql .= " order by ts_ desc, i.id asc"; } else { $sql .= " order by ts_ asc, i.id asc"; } $rs = rss_query($sql); $found = false; $stop = false; $prev__ = null; $fCounter = 0; while (!$stop && list($title_,$iid_,$ts_,$y_,$m_,$d_) = rss_fetch_row($rs)) { if ($iid_ == $iid) { //this is the "current" item, get a hold on the previous one $found = true; if ($prev__) { list($ptitle_,$piid_,$pts_,$py_,$pm_,$pd_) = $prev__; $succ = array( 'y' => $py_, 'm' => $pm_, 'cnt' => 0, 'ts' => $pts_, 'url' => makeArchiveUrl($pts_,$escaped_title,$cid,true) . (getConfig('rss.output.usemodrewrite') ? rss_uri($ptitle_): "&iid=$piid_"), 'lbl' => htmlentities( $ptitle_,ENT_COMPAT,"UTF-8" ) ); } } if ($found) { // okay, this is the next item, then. $fCounter++; if ($fCounter == 2) { $prev = array( 'y' => $y_, 'm' => $m_, 'cnt' => 0, 'ts' => $ts_, 'url' => makeArchiveUrl($ts_,$escaped_title,$cid,true) . (getConfig('rss.output.usemodrewrite') ? rss_uri($title_) : "&iid=$iid_"), 'lbl' => htmlentities($title_,ENT_COMPAT,"UTF-8") ); $stop = true; } } $prev__ = array($title_,$iid_,$ts_,$y_,$m_,$d_); } // up $ts = mktime(0,0,0,$m,$d,$y); $up = array( 'y' => $y, 'm' => $m, 'd' => $d, 'url' => makeArchiveUrl($ts,$escaped_title,$cid,true), 'lbl' => rss_locale_date('%B %e',$ts) ); break; case 'feed': $sql = "select " ." c.id, c.title " ." from " . getTable("channels") ." c " ." inner join " . getTable("folders") ." d " ." on d.id = c.parent "; $sql .= " where (c.mode & " . RSS_MODE_DELETED_STATE.")=0 "; if (hidePrivate()) { $sql .=" and (c.mode & " . RSS_MODE_PRIVATE_STATE.")=0 "; } if (getConfig('rss.config.absoluteordering')) { $sql .=" order by d.position asc, c.position asc"; } else { $sql .=" order by d.name asc, c.title asc"; } $res = rss_query($sql); $pcid = $ptitile = null; $cidname=array(); $cids=array(); while (list ($cid_,$title_)=rss_fetch_row($res)) { $cids[]=$cid_; $cidname[]=array($cid_,$title_); } $key = array_search($cid,$cids); if ($key !== NULL && $key !== FALSE) { //echo "$key " .count($cidname); if ($key+1 < count($cidname)) { list($cid_,$title_) = $cidname[$key+1]; $succ = array( 'url' => getPath(). ( getConfig('rss.output.usemodrewrite') ? rss_uri($title_) ."/" :"feed.php?channel=$cid_") , 'lbl' => htmlentities( $title_,ENT_COMPAT,"UTF-8" ) ); } if ($key > 0) { list($cid_,$title_) = $cidname[$key-1]; $prev = array( 'url' => getPath(). ( getConfig('rss.output.usemodrewrite') ? rss_uri($title_) ."/" :"feed.php?channel=$cid_") , 'lbl' => htmlentities( $title_,ENT_COMPAT,"UTF-8" ) ); } } break; case 'cat': $res = rss_query(" select t.tag,t.id from " .getTable('metatag') ." m " ."inner join " . getTable('tag') . "t on t.id = m.tid " ." where m.ttype = 'channel' " ." order by t.tag asc"); $pp = null; $nn = null; $found = false; $stop = false; while (!$stop && list($tt_,$tid_) = rss_fetch_row($res)) { if ($vfid == $tid_) { $found = true; } if (!$found) { $pp = array('id' => $tid_, 'title' => $tt_); } elseif ($vfid != $tid_) { $nn = array('id' => $tid_ , 'title' => $tt_); $stop = true; } } if ($pp) { $vftitle_ = $pp['title']; $vfid_ = $pp['id']; $prev = array( 'url' => getPath(). ( getConfig('rss.output.usemodrewrite') ? rss_uri($vftitle_) ."/" :"feed.php?vfolder=$vfid_") , 'lbl' => htmlentities( $vftitle_,ENT_COMPAT,"UTF-8" ) ); } if ($nn) { $vftitle_ = $nn['title']; $vfid_ = $nn['id']; $succ = array( 'url' => getPath(). ( getConfig('rss.output.usemodrewrite') ? rss_uri($vftitle_) ."/" :"feed.php?vfolder=$vfid_") , 'lbl' => htmlentities( $vftitle_,ENT_COMPAT,"UTF-8" ) ); } break; case 'folder': $sql = "select f.id, f.name, count(*) from " . getTable('channels') . " c " ."inner join " . getTable('folders') . " f on f.id = c.parent " ." where f.name != '' "; if (hidePrivate()) { $sql .= " and (c.mode & ".RSS_MODE_PRIVATE_STATE.")=0"; } $sql .= " group by f.id, f.name, f.position, c.position, c.title"; if (getConfig('rss.config.absoluteordering')) { $sql .= " order by f.position asc, c.position asc"; } else { $sql .= " order by f.name, c.title asc"; } $res = rss_query($sql); $pp = null; $nn = null; $found = false; $stop = false; while (!$stop && list($fid_, $fn_,$fc_) = rss_fetch_row($res)) { if ($fc_ == 0) { continue; } if ($fid == $fid_) { $found = true; } if (!$found) { $pp = array('id' => $fid_, 'title' => $fn_); } elseif ($fid != $fid_) { $nn = array('id' => $fid_ , 'title' => $fn_); $stop = true; } } if ($pp) { $ftitle__ = $pp['title']; $fid__ = $pp['id']; $prev = array( 'url' => getPath(). ( getConfig('rss.output.usemodrewrite') ? rss_uri($ftitle__) ."/" :"feed.php?folder=$fid__") , 'lbl' => htmlentities( $ftitle__,ENT_COMPAT,"UTF-8" ) ); } if ($nn) { $ftitle__ = $nn['title']; $fid__ = $nn['id']; $succ = array( 'url' => getPath(). ( getConfig('rss.output.usemodrewrite') ? rss_uri($ftitle__) ."/" :"feed.php?folder=$fid__") , 'lbl' => htmlentities( $ftitle__,ENT_COMPAT,"UTF-8" ) ); } break; default: //echo "current view: $currentView"; break; } return array($prev,$succ, $up); } return null; } function markReadForm($cid) { if (!isLoggedIn()) { return; } if (!defined('MARK_READ_FEED_FORM')) { define ('MARK_READ_FEED_FORM',$cid); } echo "\n\n
\n" ."\t

\n" ."\t\n" ."\t\n" ."\tgetShownUnreadIds())."\" />\n" ."

\n
"; } function markFolderReadForm($fid) { if (!isLoggedIn()) { return; } if (!defined('MARK_READ_FOLDER_FORM')) { define ('MARK_READ_FOLDER_FORM',$fid); } echo "\n\n
\n" ."\t

\n" ."\t\n" ."\t\n" ."\tgetShownUnreadIds())."\" />\n" ."

"; } function markVirtualFolderReadForm($vfid) { if (!isLoggedIn()) { return; } if (!defined('MARK_READ_VFOLDER_FORM')) { define ('MARK_READ_VFOLDER_FORM',$vfid); } echo "\n\n
\n" ."\t

\n" ."\t\n" ."\t\n" ."\tgetShownUnreadIds())."\" />\n" ."

\n
"; } function debugFeed($cid) {} ?>