2012-06-15 00:46:58 +00:00
< ? php
function network_init ( & $a ) {
if ( ! local_user ()) {
notice ( t ( 'Permission denied.' ) . EOL );
return ;
}
2013-01-13 16:13:01 +00:00
2012-06-15 00:46:58 +00:00
$is_a_date_query = false ;
if ( $a -> argc > 1 ) {
for ( $x = 1 ; $x < $a -> argc ; $x ++ ) {
if ( is_a_date_arg ( $a -> argv [ $x ])) {
$is_a_date_query = true ;
break ;
}
}
}
2013-01-13 16:13:01 +00:00
2014-11-10 14:07:35 +00:00
// convert query string to array. remove friendica args
$query_array = array ();
$query_string = str_replace ( $a -> cmd . " ? " , " " , $a -> query_string );
parse_str ( $query_string , $query_array );
array_shift ( $query_array );
2013-01-13 16:13:01 +00:00
2015-02-22 16:34:04 +00:00
2012-09-29 23:56:50 +00:00
// fetch last used network view and redirect if needed
if ( ! $is_a_date_query ) {
$sel_tabs = network_query_get_sel_tab ( $a );
$sel_nets = network_query_get_sel_net ();
$sel_groups = network_query_get_sel_group ( $a );
$last_sel_tabs = get_pconfig ( local_user (), 'network.view' , 'tab.selected' );
$last_sel_nets = get_pconfig ( local_user (), 'network.view' , 'net.selected' );
$last_sel_groups = get_pconfig ( local_user (), 'network.view' , 'group.selected' );
$remember_tab = ( $sel_tabs [ 0 ] === 'active' && is_array ( $last_sel_tabs ) && $last_sel_tabs [ 0 ] !== 'active' );
$remember_net = ( $sel_nets === false && $last_sel_nets && $last_sel_nets !== 'all' );
$remember_group = ( $sel_groups === false && $last_sel_groups && $last_sel_groups != 0 );
$net_baseurl = '/network' ;
$net_args = array ();
if ( $remember_group ) {
$net_baseurl .= '/' . $last_sel_groups ; // Note that the group number must come before the "/new" tab selection
}
else if ( $sel_groups !== false ) {
$net_baseurl .= '/' . $sel_groups ;
}
2015-08-11 18:16:53 +00:00
2012-09-29 23:56:50 +00:00
if ( $remember_tab ) {
// redirect if current selected tab is '/network' and
2014-03-09 08:19:14 +00:00
// last selected tab is _not_ '/network?f=&order=comment'.
2012-09-29 23:56:50 +00:00
// and this isn't a date query
$tab_baseurls = array (
'' , //all
'' , //postord
'' , //conv
2015-05-30 00:21:30 +00:00
'/new' , //new
2012-09-29 23:56:50 +00:00
'' , //starred
'' , //bookmarked
'' , //spam
);
$tab_args = array (
'f=&order=comment' , //all
2015-05-30 00:21:30 +00:00
'f=&order=post' , //postord
'f=&conv=1' , //conv
'' , //new
'f=&star=1' , //starred
'f=&bmark=1' , //bookmarked
'f=&spam=1' , //spam
2012-09-29 23:56:50 +00:00
);
$k = array_search ( 'active' , $last_sel_tabs );
$net_baseurl .= $tab_baseurls [ $k ];
2014-11-10 14:07:35 +00:00
// parse out tab queries
$dest_qa = array ();
$dest_qs = $tab_args [ $k ];
parse_str ( $dest_qs , $dest_qa );
$net_args = array_merge ( $net_args , $dest_qa );
2012-09-29 23:56:50 +00:00
}
else if ( $sel_tabs [ 4 ] === 'active' ) {
// The '/new' tab is selected
$net_baseurl .= '/new' ;
}
if ( $remember_net ) {
$net_args [ 'nets' ] = $last_sel_nets ;
}
2014-11-10 14:37:52 +00:00
else if ( $sel_nets !== false ) {
$net_args [ 'nets' ] = $sel_nets ;
}
2015-08-11 18:16:53 +00:00
2012-09-29 23:56:50 +00:00
if ( $remember_tab || $remember_net || $remember_group ) {
2014-03-09 08:19:14 +00:00
$net_args = array_merge ( $query_array , $net_args );
$net_queries = build_querystring ( $net_args );
2015-08-11 18:16:53 +00:00
2012-09-29 23:56:50 +00:00
$redir_url = ( $net_queries ? $net_baseurl . " ? " . $net_queries : $net_baseurl );
2015-08-11 18:16:53 +00:00
2012-09-29 23:56:50 +00:00
goaway ( $a -> get_baseurl () . $redir_url );
}
}
2015-08-11 18:16:53 +00:00
2012-09-29 23:56:50 +00:00
if ( x ( $_GET [ 'nets' ]) && $_GET [ 'nets' ] === 'all' )
unset ( $_GET [ 'nets' ]);
2013-01-13 16:13:01 +00:00
2012-10-01 20:07:32 +00:00
$group_id = (( $a -> argc > 1 && is_numeric ( $a -> argv [ 1 ])) ? intval ( $a -> argv [ 1 ]) : 0 );
2012-09-29 23:56:50 +00:00
set_pconfig ( local_user (), 'network.view' , 'group.selected' , $group_id );
2013-01-13 16:13:01 +00:00
2012-06-15 00:46:58 +00:00
require_once ( 'include/group.php' );
require_once ( 'include/contact_widgets.php' );
require_once ( 'include/items.php' );
2015-11-09 14:56:20 +00:00
require_once ( 'include/forums.php' );
2012-06-15 00:46:58 +00:00
if ( ! x ( $a -> page , 'aside' ))
$a -> page [ 'aside' ] = '' ;
$search = (( x ( $_GET , 'search' )) ? escape_tags ( $_GET [ 'search' ]) : '' );
if ( x ( $_GET , 'save' )) {
2015-10-24 13:04:27 +00:00
$r = q ( " SELECT * FROM `search` WHERE `uid` = %d AND `term` = '%s' LIMIT 1 " ,
2012-06-15 00:46:58 +00:00
intval ( local_user ()),
dbesc ( $search )
);
if ( ! count ( $r )) {
2015-10-24 13:04:27 +00:00
q ( " INSERT INTO `search` ( `uid`,`term` ) VALUES ( %d, '%s') " ,
2012-06-15 00:46:58 +00:00
intval ( local_user ()),
dbesc ( $search )
);
}
}
if ( x ( $_GET , 'remove' )) {
2015-10-24 13:04:27 +00:00
q ( " DELETE FROM `search` WHERE `uid` = %d AND `term` = '%s' " ,
2012-06-15 00:46:58 +00:00
intval ( local_user ()),
dbesc ( $search )
);
}
// search terms header
if ( x ( $_GET , 'search' )) {
2015-05-30 00:21:30 +00:00
$a -> page [ 'content' ] .= replace_macros ( get_markup_template ( " section_title.tpl " ), array (
'$title' => sprintf ( t ( 'Search Results For: %s' ), $search )
));
2012-06-15 00:46:58 +00:00
}
2015-11-28 19:09:28 +00:00
$a -> page [ 'aside' ] .= ( feature_enabled ( local_user (), 'groups' ) ? group_side ( 'network/0' , 'network' , 'standard' , $group_id ) : '' );
2015-11-11 00:29:31 +00:00
$a -> page [ 'aside' ] .= ( feature_enabled ( local_user (), 'forumlist_widget' ) ? widget_forumlist ( $a ) : '' );
2014-03-09 08:19:14 +00:00
$a -> page [ 'aside' ] .= posted_date_widget ( $a -> get_baseurl () . '/network' , local_user (), false );
2012-06-15 00:46:58 +00:00
$a -> page [ 'aside' ] .= networks_widget ( $a -> get_baseurl ( true ) . '/network' ,( x ( $_GET , 'nets' ) ? $_GET [ 'nets' ] : '' ));
$a -> page [ 'aside' ] .= saved_searches ( $search );
$a -> page [ 'aside' ] .= fileas_widget ( $a -> get_baseurl ( true ) . '/network' ,( x ( $_GET , 'file' ) ? $_GET [ 'file' ] : '' ));
2015-10-29 07:10:39 +00:00
if ( x ( $_GET [ 'cid' ]) && intval ( $_GET [ 'cid' ]) != 0 ) {
2015-10-30 00:30:42 +00:00
$r = q ( " SELECT `url` FROM `contact` WHERE `id` = %d " ,
2015-10-29 07:10:39 +00:00
intval ( $_GET [ 'cid' ]));
if ( $r ) {
$a -> page [ 'aside' ] = " " ;
2015-10-30 23:01:33 +00:00
profile_load ( $a , " " , 0 , get_contact_details_by_url ( $r [ 0 ][ " url " ]));
2015-10-29 07:10:39 +00:00
}
}
2012-06-15 00:46:58 +00:00
}
function saved_searches ( $search ) {
2012-11-22 16:14:22 +00:00
if ( ! feature_enabled ( local_user (), 'savedsearch' ))
return '' ;
2012-06-15 00:46:58 +00:00
$a = get_app ();
2013-12-09 23:13:19 +00:00
$srchurl = '/network?f='
. (( x ( $_GET , 'cid' )) ? '&cid=' . $_GET [ 'cid' ] : '' )
2012-06-15 00:46:58 +00:00
. (( x ( $_GET , 'star' )) ? '&star=' . $_GET [ 'star' ] : '' )
. (( x ( $_GET , 'bmark' )) ? '&bmark=' . $_GET [ 'bmark' ] : '' )
. (( x ( $_GET , 'conv' )) ? '&conv=' . $_GET [ 'conv' ] : '' )
. (( x ( $_GET , 'nets' )) ? '&nets=' . $_GET [ 'nets' ] : '' )
. (( x ( $_GET , 'cmin' )) ? '&cmin=' . $_GET [ 'cmin' ] : '' )
. (( x ( $_GET , 'cmax' )) ? '&cmax=' . $_GET [ 'cmax' ] : '' )
. (( x ( $_GET , 'file' )) ? '&file=' . $_GET [ 'file' ] : '' );
;
2013-12-09 23:13:19 +00:00
2012-06-15 00:46:58 +00:00
$o = '' ;
2015-10-24 13:04:27 +00:00
$r = q ( " SELECT `id`,`term` FROM `search` WHERE `uid` = %d " ,
2012-06-15 00:46:58 +00:00
intval ( local_user ())
);
$saved = array ();
if ( count ( $r )) {
foreach ( $r as $rr ) {
$saved [] = array (
2015-05-30 00:21:30 +00:00
'id' => $rr [ 'id' ],
'term' => $rr [ 'term' ],
2012-06-15 00:46:58 +00:00
'encodedterm' => urlencode ( $rr [ 'term' ]),
2015-05-30 00:21:30 +00:00
'delete' => t ( 'Remove term' ),
'selected' => ( $search == $rr [ 'term' ]),
2012-06-15 00:46:58 +00:00
);
}
2013-10-14 22:49:13 +00:00
}
2012-06-15 00:46:58 +00:00
$tpl = get_markup_template ( " saved_searches_aside.tpl " );
$o = replace_macros ( $tpl , array (
2015-05-30 00:21:30 +00:00
'$title' => t ( 'Saved Searches' ),
'$add' => t ( 'add' ),
'$searchbox' => search ( $search , 'netsearch-box' , $srchurl , true ),
'$saved' => $saved ,
2012-06-15 00:46:58 +00:00
));
2013-10-14 22:49:13 +00:00
2012-06-15 00:46:58 +00:00
return $o ;
}
/**
* Return selected tab from query
2014-03-09 08:19:14 +00:00
*
2012-06-15 00:46:58 +00:00
* urls -> returns
* '/network' => $no_active = 'active'
* '/network?f=&order=comment' => $comment_active = 'active'
* '/network?f=&order=post' => $postord_active = 'active'
* '/network?f=&conv=1' , => $conv_active = 'active'
* '/network/new' , => $new_active = 'active'
* '/network?f=&star=1' , => $starred_active = 'active'
* '/network?f=&bmark=1' , => $bookmarked_active = 'active'
* '/network?f=&spam=1' , => $spam_active = 'active'
2014-03-09 08:19:14 +00:00
*
2012-06-15 00:46:58 +00:00
* @ return Array ( $no_active , $comment_active , $postord_active , $conv_active , $new_active , $starred_active , $bookmarked_active , $spam_active );
*/
function network_query_get_sel_tab ( $a ) {
$no_active = '' ;
$starred_active = '' ;
$new_active = '' ;
$bookmarked_active = '' ;
$all_active = '' ;
$search_active = '' ;
$conv_active = '' ;
$spam_active = '' ;
$postord_active = '' ;
2013-12-09 23:13:19 +00:00
if (( $a -> argc > 1 && $a -> argv [ 1 ] === 'new' )
2012-06-15 00:46:58 +00:00
|| ( $a -> argc > 2 && $a -> argv [ 2 ] === 'new' )) {
$new_active = 'active' ;
}
2013-10-14 22:49:13 +00:00
2012-06-15 00:46:58 +00:00
if ( x ( $_GET , 'search' )) {
$search_active = 'active' ;
}
2013-10-14 22:49:13 +00:00
2012-06-15 00:46:58 +00:00
if ( x ( $_GET , 'star' )) {
$starred_active = 'active' ;
}
2013-10-14 22:49:13 +00:00
2012-06-15 00:46:58 +00:00
if ( x ( $_GET , 'bmark' )) {
$bookmarked_active = 'active' ;
}
if ( x ( $_GET , 'conv' )) {
$conv_active = 'active' ;
}
if ( x ( $_GET , 'spam' )) {
$spam_active = 'active' ;
}
2013-10-14 22:49:13 +00:00
2013-12-09 23:13:19 +00:00
if (( $new_active == '' )
&& ( $starred_active == '' )
2012-06-15 00:46:58 +00:00
&& ( $bookmarked_active == '' )
&& ( $conv_active == '' )
&& ( $search_active == '' )
&& ( $spam_active == '' )) {
$no_active = 'active' ;
}
if ( $no_active == 'active' && x ( $_GET , 'order' )) {
switch ( $_GET [ 'order' ]){
case 'post' : $postord_active = 'active' ; $no_active = '' ; break ;
case 'comment' : $all_active = 'active' ; $no_active = '' ; break ;
}
}
2013-10-14 22:49:13 +00:00
2012-06-15 00:46:58 +00:00
return array ( $no_active , $all_active , $postord_active , $conv_active , $new_active , $starred_active , $bookmarked_active , $spam_active );
}
2012-09-29 23:56:50 +00:00
/**
* Return selected network from query
*/
function network_query_get_sel_net () {
$network = false ;
if ( x ( $_GET , 'nets' )) {
$network = $_GET [ 'nets' ];
}
2013-01-27 12:57:44 +00:00
2012-09-29 23:56:50 +00:00
return $network ;
}
function network_query_get_sel_group ( $a ) {
$group = false ;
if ( $a -> argc >= 2 && is_numeric ( $a -> argv [ 1 ])) {
$group = $a -> argv [ 1 ];
}
return $group ;
}
2012-06-15 00:46:58 +00:00
function network_content ( & $a , $update = 0 ) {
require_once ( 'include/conversation.php' );
if ( ! local_user ()) {
$_SESSION [ 'return_url' ] = $a -> query_string ;
2014-10-22 07:04:32 +00:00
return login ( false );
2012-06-15 00:46:58 +00:00
}
2014-10-22 07:32:24 +00:00
// TODO:is this really necessary? $a is already available to hooks
2012-06-15 00:46:58 +00:00
$arr = array ( 'query' => $a -> query_string );
call_hooks ( 'network_content_init' , $arr );
$datequery = $datequery2 = '' ;
$group = 0 ;
$nouveau = false ;
if ( $a -> argc > 1 ) {
for ( $x = 1 ; $x < $a -> argc ; $x ++ ) {
if ( is_a_date_arg ( $a -> argv [ $x ])) {
if ( $datequery )
$datequery2 = escape_tags ( $a -> argv [ $x ]);
else {
$datequery = escape_tags ( $a -> argv [ $x ]);
$_GET [ 'order' ] = 'post' ;
}
}
elseif ( $a -> argv [ $x ] === 'new' ) {
$nouveau = true ;
}
elseif ( intval ( $a -> argv [ $x ])) {
$group = intval ( $a -> argv [ $x ]);
$def_acl = array ( 'allow_gid' => '<' . $group . '>' );
}
}
}
$o = '' ;
// item filter tabs
// TODO: fix this logic, reduce duplication
//$a->page['content'] .= '<div class="tabs-wrapper">';
2013-01-27 12:57:44 +00:00
2012-06-15 00:46:58 +00:00
list ( $no_active , $all_active , $postord_active , $conv_active , $new_active , $starred_active , $bookmarked_active , $spam_active ) = network_query_get_sel_tab ( $a );
// if no tabs are selected, defaults to comments
if ( $no_active == 'active' ) $all_active = 'active' ;
$cmd = (( $datequery ) ? '' : $a -> cmd );
2013-01-27 12:57:44 +00:00
$len_naked_cmd = strlen ( str_replace ( '/new' , '' , $cmd ));
2012-06-15 00:46:58 +00:00
// tabs
$tabs = array (
array (
2015-10-24 13:04:27 +00:00
'label' => t ( 'Commented Order' ),
'url' => $a -> get_baseurl ( true ) . '/' . str_replace ( '/new' , '' , $cmd ) . '?f=&order=comment' . (( x ( $_GET , 'cid' )) ? '&cid=' . $_GET [ 'cid' ] : '' ),
'sel' => $all_active ,
'title' => t ( 'Sort by Comment Date' ),
'id' => 'commented-order-tab' ,
2015-08-08 15:33:43 +00:00
'accesskey' => " e " ,
2012-06-15 00:46:58 +00:00
),
array (
2015-10-24 13:04:27 +00:00
'label' => t ( 'Posted Order' ),
'url' => $a -> get_baseurl ( true ) . '/' . str_replace ( '/new' , '' , $cmd ) . '?f=&order=post' . (( x ( $_GET , 'cid' )) ? '&cid=' . $_GET [ 'cid' ] : '' ),
'sel' => $postord_active ,
'title' => t ( 'Sort by Post Date' ),
'id' => 'posted-order-tab' ,
2015-08-08 15:33:43 +00:00
'accesskey' => " t " ,
2012-06-15 00:46:58 +00:00
),
);
2013-01-27 12:57:44 +00:00
2012-11-22 16:14:22 +00:00
if ( feature_enabled ( local_user (), 'personal_tab' )) {
$tabs [] = array (
2015-10-24 13:04:27 +00:00
'label' => t ( 'Personal' ),
'url' => $a -> get_baseurl ( true ) . '/' . str_replace ( '/new' , '' , $cmd ) . (( x ( $_GET , 'cid' )) ? '/?f=&cid=' . $_GET [ 'cid' ] : '/?f=' ) . '&conv=1' ,
'sel' => $conv_active ,
'title' => t ( 'Posts that mention or involve you' ),
'id' => 'personal-tab' ,
2015-08-08 15:33:43 +00:00
'accesskey' => " r " ,
2012-11-22 16:14:22 +00:00
);
}
if ( feature_enabled ( local_user (), 'new_tab' )) {
$tabs [] = array (
2015-10-24 13:04:27 +00:00
'label' => t ( 'New' ),
'url' => $a -> get_baseurl ( true ) . '/' . str_replace ( '/new' , '' , $cmd ) . ( $len_naked_cmd ? '/' : '' ) . 'new' . (( x ( $_GET , 'cid' )) ? '/?f=&cid=' . $_GET [ 'cid' ] : '' ),
'sel' => $new_active ,
'title' => t ( 'Activity Stream - by date' ),
'id' => 'activitiy-by-date-tab' ,
2015-08-08 15:33:43 +00:00
'accesskey' => " w " ,
2012-11-22 16:14:22 +00:00
);
}
if ( feature_enabled ( local_user (), 'link_tab' )) {
$tabs [] = array (
2015-10-24 13:04:27 +00:00
'label' => t ( 'Shared Links' ),
'url' => $a -> get_baseurl ( true ) . '/' . str_replace ( '/new' , '' , $cmd ) . (( x ( $_GET , 'cid' )) ? '/?f=&cid=' . $_GET [ 'cid' ] : '/?f=' ) . '&bmark=1' ,
'sel' => $bookmarked_active ,
'title' => t ( 'Interesting Links' ),
'id' => 'shared-links-tab' ,
2015-08-08 15:33:43 +00:00
'accesskey' => " b " ,
2012-11-22 16:14:22 +00:00
);
}
if ( feature_enabled ( local_user (), 'star_posts' )) {
$tabs [] = array (
2015-10-24 13:04:27 +00:00
'label' => t ( 'Starred' ),
'url' => $a -> get_baseurl ( true ) . '/' . str_replace ( '/new' , '' , $cmd ) . (( x ( $_GET , 'cid' )) ? '/?f=&cid=' . $_GET [ 'cid' ] : '/?f=' ) . '&star=1' ,
'sel' => $starred_active ,
'title' => t ( 'Favourite Posts' ),
'id' => 'starred-posts-tab' ,
2015-08-08 15:33:43 +00:00
'accesskey' => " m " ,
2012-11-22 16:14:22 +00:00
);
}
2012-06-15 00:46:58 +00:00
// save selected tab, but only if not in search or file mode
if ( ! x ( $_GET , 'search' ) && ! x ( $_GET , 'file' )) {
set_pconfig ( local_user (), 'network.view' , 'tab.selected' , array ( $all_active , $postord_active , $conv_active , $new_active , $starred_active , $bookmarked_active , $spam_active ) );
}
$arr = array ( 'tabs' => $tabs );
call_hooks ( 'network_tabs' , $arr );
$o .= replace_macros ( get_markup_template ( 'common_tabs.tpl' ), array ( '$tabs' => $arr [ 'tabs' ]));
// --- end item filter tabs
$contact_id = $a -> cid ;
require_once ( 'include/acl_selectors.php' );
$cid = (( x ( $_GET , 'cid' )) ? intval ( $_GET [ 'cid' ]) : 0 );
$star = (( x ( $_GET , 'star' )) ? intval ( $_GET [ 'star' ]) : 0 );
$bmark = (( x ( $_GET , 'bmark' )) ? intval ( $_GET [ 'bmark' ]) : 0 );
$order = (( x ( $_GET , 'order' )) ? notags ( $_GET [ 'order' ]) : 'comment' );
$liked = (( x ( $_GET , 'liked' )) ? intval ( $_GET [ 'liked' ]) : 0 );
$conv = (( x ( $_GET , 'conv' )) ? intval ( $_GET [ 'conv' ]) : 0 );
$spam = (( x ( $_GET , 'spam' )) ? intval ( $_GET [ 'spam' ]) : 0 );
$nets = (( x ( $_GET , 'nets' )) ? $_GET [ 'nets' ] : '' );
$cmin = (( x ( $_GET , 'cmin' )) ? intval ( $_GET [ 'cmin' ]) : 0 );
$cmax = (( x ( $_GET , 'cmax' )) ? intval ( $_GET [ 'cmax' ]) : 99 );
$file = (( x ( $_GET , 'file' )) ? $_GET [ 'file' ] : '' );
if ( x ( $_GET , 'search' ) || x ( $_GET , 'file' ))
$nouveau = true ;
if ( $cid )
$def_acl = array ( 'allow_cid' => '<' . intval ( $cid ) . '>' );
if ( $nets ) {
2015-10-24 13:04:27 +00:00
$r = q ( " SELECT `id` FROM `contact` WHERE `uid` = %d AND network = '%s' AND `self` = 0 " ,
2012-06-15 00:46:58 +00:00
intval ( local_user ()),
dbesc ( $nets )
);
$str = '' ;
if ( count ( $r ))
foreach ( $r as $rr )
$str .= '<' . $rr [ 'id' ] . '>' ;
if ( strlen ( $str ))
$def_acl = array ( 'allow_cid' => $str );
}
2012-09-29 23:56:50 +00:00
set_pconfig ( local_user (), 'network.view' , 'net.selected' , ( $nets ? $nets : 'all' ));
2012-06-15 00:46:58 +00:00
if ( ! $update ) {
if ( $group ) {
if (( $t = group_public_members ( $group )) && ( ! get_pconfig ( local_user (), 'system' , 'nowarn_insecure' ))) {
notice ( sprintf ( tt ( 'Warning: This group contains %s member from an insecure network.' ,
'Warning: This group contains %s members from an insecure network.' ,
$t ), $t ) . EOL );
notice ( t ( 'Private messages to this group are at risk of public disclosure.' ) . EOL );
}
}
nav_set_selected ( 'network' );
2015-04-09 22:42:03 +00:00
$content = " " ;
if ( $cid ) {
2015-10-30 11:47:48 +00:00
// If $cid belongs to a communitity forum or a privat goup,.add a mention to the status editor
2015-10-30 00:59:17 +00:00
$contact = q ( " SELECT `nick` FROM `contact` WHERE `id` = %d AND `uid` = %d AND (`forum` OR `prv`) " ,
2015-10-24 13:04:27 +00:00
intval ( $cid ),
intval ( local_user ())
);
2015-04-09 22:42:03 +00:00
if ( $contact )
$content = " @ " . $contact [ 0 ][ " nick " ] . " + " . $cid ;
}
2012-06-15 00:46:58 +00:00
$x = array (
'is_owner' => true ,
'allow_location' => $a -> user [ 'allow_location' ],
'default_location' => $a -> user [ 'default-location' ],
'nickname' => $a -> user [ 'nickname' ],
2015-08-11 18:16:53 +00:00
'lockstate' => ((( $group ) || ( $cid ) || ( $nets ) || ( is_array ( $a -> user ) &&
(( strlen ( $a -> user [ 'allow_cid' ])) || ( strlen ( $a -> user [ 'allow_gid' ])) ||
2015-05-30 00:21:30 +00:00
( strlen ( $a -> user [ 'deny_cid' ])) || ( strlen ( $a -> user [ 'deny_gid' ]))))) ? 'lock' : 'unlock' ),
'default_perms' => get_acl_permissions ( $a -> user ),
2015-06-26 13:13:52 +00:00
'acl' => populate_acl ((( $group || $cid || $nets ) ? $def_acl : $a -> user ), true ),
2015-05-30 00:21:30 +00:00
'bang' => (( $group || $cid || $nets ) ? '!' : '' ),
2012-06-15 00:46:58 +00:00
'visitor' => 'block' ,
2013-01-26 19:52:21 +00:00
'profile_uid' => local_user (),
'acl_data' => construct_acl_data ( $a , $a -> user ), // For non-Javascript ACL selector
2015-04-09 22:42:03 +00:00
'content' => $content ,
2012-06-15 00:46:58 +00:00
);
$o .= status_editor ( $a , $x );
}
2013-01-27 12:57:44 +00:00
// We don't have to deal with ACLs on this page. You're looking at everything
2012-06-15 00:46:58 +00:00
// that belongs to you, hence you can see all of it. We will filter by group if
2014-03-09 08:19:14 +00:00
// desired.
2012-06-15 00:46:58 +00:00
2014-03-09 08:19:14 +00:00
$sql_post_table = " " ;
2012-06-15 00:46:58 +00:00
$sql_options = (( $star ) ? " and starred = 1 " : '' );
$sql_options .= (( $bmark ) ? " and bookmark = 1 " : '' );
2014-03-09 08:19:14 +00:00
$sql_extra = $sql_options ;
$sql_extra2 = " " ;
$sql_extra3 = " " ;
$sql_table = " `thread` " ;
$sql_parent = " `iid` " ;
2012-06-15 00:46:58 +00:00
2014-03-09 08:19:14 +00:00
if ( $nouveau OR strlen ( $file ) OR $update ) {
$sql_table = " `item` " ;
$sql_parent = " `parent` " ;
}
2012-06-15 00:46:58 +00:00
2014-03-09 08:19:14 +00:00
$sql_nets = (( $nets ) ? sprintf ( " and $sql_table .`network` = '%s' " , dbesc ( $nets )) : '' );
2012-06-15 00:46:58 +00:00
if ( $group ) {
$r = q ( " SELECT `name`, `id` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $group ),
intval ( $_SESSION [ 'uid' ])
);
if ( ! count ( $r )) {
if ( $update )
killme ();
notice ( t ( 'No such group' ) . EOL );
2013-03-16 16:11:32 +00:00
goaway ( $a -> get_baseurl ( true ) . '/network/0' );
2012-06-15 00:46:58 +00:00
// NOTREACHED
}
$contacts = expand_groups ( array ( $group ));
2014-03-09 08:19:14 +00:00
$contact_str_self = " " ;
2012-06-15 00:46:58 +00:00
if (( is_array ( $contacts )) && count ( $contacts )) {
$contact_str = implode ( ',' , $contacts );
2014-03-09 08:19:14 +00:00
$self = q ( " SELECT `id` FROM `contact` WHERE `uid` = %d AND `self` " , intval ( $_SESSION [ 'uid' ]));
if ( count ( $self ))
$contact_str_self = " , " . $self [ 0 ][ " id " ];
2012-06-15 00:46:58 +00:00
}
else {
2015-05-30 00:21:30 +00:00
$contact_str = ' 0 ' ;
info ( t ( 'Group is empty' ));
2012-06-15 00:46:58 +00:00
}
2014-03-20 22:34:09 +00:00
//$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item` WHERE (`contact-id` IN ($contact_str) OR `allow_gid` like '".protect_sprintf('%<'.intval($group).'>%')."') and deleted = 0 ORDER BY `created` DESC) AS `temp1` ON $sql_table.$sql_parent = `temp1`.`parent` ";
2014-03-09 08:19:14 +00:00
2014-03-20 22:34:09 +00:00
$sql_extra3 .= " AND `contact-id` IN ( $contact_str $contact_str_self ) " ;
2015-10-30 00:59:17 +00:00
$sql_extra3 .= " AND EXISTS (SELECT `id` FROM `item` WHERE (`contact-id` IN ( $contact_str )
OR `allow_gid` LIKE '".protect_sprintf(' %< '.intval($group).' >% ')."' ) AND `deleted` = 0
AND `parent` = $sql_table . $sql_parent ) " ;
2015-05-30 00:21:30 +00:00
$o = replace_macros ( get_markup_template ( " section_title.tpl " ), array (
'$title' => sprintf ( t ( 'Group: %s' ), $r [ 0 ][ 'name' ])
)) . $o ;
}
elseif ( $cid ) {
2012-06-15 00:46:58 +00:00
2014-03-09 08:19:14 +00:00
$r = q ( " SELECT `id`,`name`,`network`,`writable`,`nurl` FROM `contact` WHERE `id` = %d
2012-06-15 00:46:58 +00:00
AND `blocked` = 0 AND `pending` = 0 LIMIT 1 " ,
intval ( $cid )
);
if ( count ( $r )) {
2015-10-07 22:25:55 +00:00
$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item`
2015-10-24 13:04:27 +00:00
WHERE 1 $sql_options AND `contact-id` = " .intval( $cid ). " AND `deleted` = 0
2015-10-07 22:25:55 +00:00
ORDER BY `item` . `received` DESC ) AS `temp1`
2015-05-30 00:21:30 +00:00
ON $sql_table . $sql_parent = `temp1` . `parent` " ;
2013-11-02 09:49:44 +00:00
$sql_extra = " " ;
2015-05-30 00:21:30 +00:00
$o = replace_macros ( get_markup_template ( " section_title.tpl " ), array (
2015-10-07 22:25:55 +00:00
'$title' => sprintf ( t ( 'Contact: %s' ), htmlentities ( $r [ 0 ][ 'name' ]))
2015-05-30 00:21:30 +00:00
)) . $o ;
2012-06-15 00:46:58 +00:00
if ( $r [ 0 ][ 'network' ] === NETWORK_OSTATUS && $r [ 0 ][ 'writable' ] && ( ! get_pconfig ( local_user (), 'system' , 'nowarn_insecure' ))) {
notice ( t ( 'Private messages to this person are at risk of public disclosure.' ) . EOL );
}
}
else {
notice ( t ( 'Invalid contact.' ) . EOL );
goaway ( $a -> get_baseurl ( true ) . '/network' );
// NOTREACHED
}
}
2012-09-19 00:43:09 +00:00
if (( ! $group ) && ( ! $cid ) && ( ! $update ) && ( ! get_config ( 'theme' , 'hide_eventlist' ))) {
2012-06-15 00:46:58 +00:00
$o .= get_birthdays ();
$o .= get_events ();
}
if ( $datequery ) {
2014-03-09 08:19:14 +00:00
$sql_extra3 .= protect_sprintf ( sprintf ( " AND $sql_table .created <= '%s' " , dbesc ( datetime_convert ( date_default_timezone_get (), '' , $datequery ))));
2012-06-15 00:46:58 +00:00
}
if ( $datequery2 ) {
2014-03-09 08:19:14 +00:00
$sql_extra3 .= protect_sprintf ( sprintf ( " AND $sql_table .created >= '%s' " , dbesc ( datetime_convert ( date_default_timezone_get (), '' , $datequery2 ))));
2012-06-15 00:46:58 +00:00
}
2014-03-09 08:19:14 +00:00
//$sql_extra2 = (($nouveau) ? '' : " AND `item`.`parent` = `item`.`id` ");
$sql_extra2 = (( $nouveau ) ? '' : $sql_extra2 );
2012-06-15 00:46:58 +00:00
$sql_extra3 = (( $nouveau ) ? '' : $sql_extra3 );
2013-11-08 07:11:39 +00:00
$sql_order = " " ;
2013-12-09 23:13:19 +00:00
$order_mode = " received " ;
2014-03-16 16:12:56 +00:00
$tag = false ;
2013-11-02 09:49:44 +00:00
2012-06-15 00:46:58 +00:00
if ( x ( $_GET , 'search' )) {
$search = escape_tags ( $_GET [ 'search' ]);
2013-01-13 16:13:01 +00:00
if ( strpos ( $search , '#' ) === 0 ) {
$tag = true ;
$search = substr ( $search , 1 );
}
if ( get_config ( 'system' , 'only_tag_search' ))
$tag = true ;
if ( $tag ) {
2013-11-03 01:07:44 +00:00
$sql_extra = " " ;
2014-03-09 08:19:14 +00:00
$sql_post_table = sprintf ( " INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` " ,
2013-11-03 01:07:44 +00:00
dbesc ( protect_sprintf ( $search )), intval ( TERM_OBJ_POST ), intval ( TERM_HASHTAG ), intval ( local_user ()));
2014-03-16 16:12:56 +00:00
$sql_order = " `item`.`id` " ;
$order_mode = " id " ;
2013-01-13 16:13:01 +00:00
} else {
if ( get_config ( 'system' , 'use_fulltext_engine' ))
$sql_extra = sprintf ( " AND MATCH (`item`.`body`, `item`.`title`) AGAINST ('%s' in boolean mode) " , dbesc ( protect_sprintf ( $search )));
else
$sql_extra = sprintf ( " AND `item`.`body` REGEXP '%s' " , dbesc ( protect_sprintf ( preg_quote ( $search ))));
2014-03-16 16:12:56 +00:00
$sql_order = " `item`.`received` " ;
$order_mode = " received " ;
2012-06-15 00:46:58 +00:00
}
}
2014-03-16 16:12:56 +00:00
if ( strlen ( $file )) {
$sql_post_table = sprintf ( " INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` " ,
dbesc ( protect_sprintf ( $file )), intval ( TERM_OBJ_POST ), intval ( TERM_FILE ), intval ( local_user ()));
$sql_order = " `item`.`id` " ;
$order_mode = " id " ;
}
2012-06-15 00:46:58 +00:00
2014-03-09 08:19:14 +00:00
if ( $conv )
2014-03-16 16:12:56 +00:00
$sql_extra3 .= " AND `mention` " ;
2012-06-15 00:46:58 +00:00
if ( $update ) {
// only setup pagination on initial page view
$pager_sql = '' ;
}
else {
2015-02-08 10:54:42 +00:00
if ( get_config ( 'system' , 'old_pager' )) {
2015-10-30 00:59:17 +00:00
$r = q ( " SELECT COUNT(*) AS `total`
FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact` . `id` = $sql_table . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
WHERE $sql_table . `uid` = % d AND $sql_table . `visible` = 1 AND $sql_table . `deleted` = 0
$sql_extra2 $sql_extra3
$sql_extra $sql_nets " ,
intval ( $_SESSION [ 'uid' ])
);
if ( count ( $r )) {
$a -> set_pager_total ( $r [ 0 ][ 'total' ]);
}
2012-08-10 03:17:11 +00:00
}
2014-03-09 08:19:14 +00:00
// check if we serve a mobile device and get the user settings
2013-04-24 01:58:52 +00:00
// accordingly
2014-03-09 08:19:14 +00:00
if ( $a -> is_mobile ) {
2015-10-30 00:59:17 +00:00
$itemspage_network = get_pconfig ( local_user (), 'system' , 'itemspage_mobile_network' );
$itemspage_network = (( intval ( $itemspage_network )) ? $itemspage_network : 20 );
2014-03-09 08:19:14 +00:00
} else {
2015-10-30 00:59:17 +00:00
$itemspage_network = get_pconfig ( local_user (), 'system' , 'itemspage_network' );
$itemspage_network = (( intval ( $itemspage_network )) ? $itemspage_network : 40 );
2013-04-24 01:58:52 +00:00
}
2015-10-30 00:59:17 +00:00
2014-03-09 08:19:14 +00:00
// now that we have the user settings, see if the theme forces
2013-04-24 01:58:52 +00:00
// a maximum item number which is lower then the user choice
2012-08-10 03:17:11 +00:00
if (( $a -> force_max_items > 0 ) && ( $a -> force_max_items < $itemspage_network ))
$itemspage_network = $a -> force_max_items ;
$a -> set_pager_itemspage ( $itemspage_network );
$pager_sql = sprintf ( " LIMIT %d, %d " , intval ( $a -> pager [ 'start' ]), intval ( $a -> pager [ 'itemspage' ]));
2012-06-15 00:46:58 +00:00
}
if ( $nouveau ) {
2015-10-30 00:59:17 +00:00
$simple_update = (( $update ) ? " AND `item`.`unseen` = 1 " : '' );
2012-06-15 00:46:58 +00:00
2014-03-16 16:12:56 +00:00
if ( $sql_order == " " )
$sql_order = " `item`.`received` " ;
2014-03-09 08:19:14 +00:00
// "New Item View" - show all items unthreaded in reverse created date order
2013-12-27 00:58:21 +00:00
$items = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2012-06-15 00:46:58 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` , `contact` . `writable` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid`
2014-03-09 08:19:14 +00:00
FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
WHERE `item` . `uid` = % d AND `item` . `visible` = 1
2015-10-30 00:59:17 +00:00
AND `item` . `deleted` = 0 AND `item` . `moderated` = 0
2012-06-15 00:46:58 +00:00
$simple_update
$sql_extra $sql_nets
2014-03-16 16:12:56 +00:00
ORDER BY $sql_order DESC $pager_sql " ,
2012-06-15 00:46:58 +00:00
intval ( $_SESSION [ 'uid' ])
);
2012-09-29 23:56:50 +00:00
$update_unseen = ' WHERE uid = ' . intval ( $_SESSION [ 'uid' ]) . " AND unseen = 1 $sql_extra $sql_nets " ;
2014-03-09 08:19:14 +00:00
} else {
2012-06-15 00:46:58 +00:00
// Normal conversation view
2013-12-09 23:13:19 +00:00
if ( $order === 'post' ) {
$ordering = " `created` " ;
if ( $sql_order == " " )
$order_mode = " created " ;
} else {
$ordering = " `commented` " ;
if ( $sql_order == " " )
$order_mode = " commented " ;
}
2012-06-15 00:46:58 +00:00
2013-10-14 22:49:13 +00:00
if ( $sql_order == " " )
2014-03-09 08:19:14 +00:00
$sql_order = " $sql_table . $ordering " ;
2013-10-14 22:49:13 +00:00
2013-12-09 23:13:19 +00:00
if (( $_GET [ " offset " ] != " " ))
$sql_extra3 .= sprintf ( " AND $sql_order <= '%s' " , dbesc ( $_GET [ " offset " ]));
2012-06-15 00:46:58 +00:00
// Fetch a page full of parent items for this page
if ( $update ) {
2015-02-23 11:44:50 +00:00
if ( ! get_config ( " system " , " like_no_comment " ))
2015-10-09 12:20:01 +00:00
$sql_extra4 = " (`item`.`deleted` = 0
OR `item` . `verb` = '".ACTIVITY_LIKE."' OR `item` . `verb` = '".ACTIVITY_DISLIKE."'
OR `item` . `verb` = '".ACTIVITY_ATTEND."' OR `item` . `verb` = '".ACTIVITY_ATTENDNO."'
2015-10-09 11:46:08 +00:00
OR `item` . `verb` = '".ACTIVITY_ATTENDMAYBE."' ) " ;
2015-02-23 11:44:50 +00:00
else
2015-03-02 22:34:59 +00:00
$sql_extra4 = " `item`.`deleted` = 0 AND `item`.`verb` = ' " . ACTIVITY_POST . " ' " ;
2015-02-23 11:44:50 +00:00
2013-12-27 00:58:21 +00:00
$r = q ( " SELECT `item`.`parent` AS `item_id`, `item`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid`
2014-03-09 08:19:14 +00:00
FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
2015-02-23 11:44:50 +00:00
WHERE `item` . `uid` = % d AND `item` . `visible` = 1 AND $sql_extra4
AND `item` . `moderated` = 0 AND `item` . `unseen` = 1
2014-03-09 08:19:14 +00:00
$sql_extra3 $sql_extra $sql_nets ORDER BY `item_id` DESC LIMIT 100 " ,
2012-06-15 00:46:58 +00:00
intval ( local_user ())
);
2014-03-09 08:19:14 +00:00
} else {
$r = q ( " SELECT `thread`.`iid` AS `item_id`, `thread`.`network` AS `item_network`, `contact`.`uid` AS `contact_uid`
2014-05-24 09:01:52 +00:00
FROM $sql_table $sql_post_table STRAIGHT_JOIN `contact` ON `contact` . `id` = `thread` . `contact-id`
2014-03-09 08:19:14 +00:00
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
WHERE `thread` . `uid` = % d AND `thread` . `visible` = 1 AND `thread` . `deleted` = 0
AND `thread` . `moderated` = 0
$sql_extra2 $sql_extra3 $sql_extra $sql_nets
2013-10-14 22:49:13 +00:00
ORDER BY $sql_order DESC $pager_sql " ,
2012-06-15 00:46:58 +00:00
intval ( local_user ())
);
}
// Then fetch all the children of the parents that are on this page
$parents_arr = array ();
$parents_str = '' ;
2013-12-09 23:13:19 +00:00
$date_offset = " " ;
2012-06-15 00:46:58 +00:00
if ( count ( $r )) {
foreach ( $r as $rr )
if ( ! in_array ( $rr [ 'item_id' ], $parents_arr ))
$parents_arr [] = $rr [ 'item_id' ];
2014-03-09 08:19:14 +00:00
$parents_str = implode ( " , " , $parents_arr );
2012-06-15 00:46:58 +00:00
2013-12-08 13:49:24 +00:00
// splitted into separate queries to avoid the problem with very long threads
// so always the last X comments are loaded
// This problem can occur expecially with imported facebook posts
$max_comments = get_config ( " system " , " max_comments " );
if ( $max_comments == 0 )
2014-05-04 19:11:25 +00:00
$max_comments = 100 ;
2013-12-08 13:49:24 +00:00
$items = array ();
2014-03-09 08:19:14 +00:00
foreach ( $parents_arr AS $parents ) {
// $sql_extra ORDER BY `item`.`commented` DESC LIMIT %d",
2013-12-27 00:58:21 +00:00
$thread_items = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2013-12-08 13:49:24 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `alias` , `contact` . `rel` , `contact` . `writable` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid`
2014-03-09 08:19:14 +00:00
FROM `item` INNER JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
2013-12-08 13:49:24 +00:00
WHERE `item` . `uid` = % d AND `item` . `visible` = 1 AND `item` . `deleted` = 0
AND `item` . `moderated` = 0
2014-03-09 08:19:14 +00:00
AND `item` . `parent` = % d
ORDER BY `item` . `commented` DESC LIMIT % d " ,
2013-12-08 13:49:24 +00:00
intval ( local_user ()),
2014-03-09 08:19:14 +00:00
intval ( $parents ),
2013-12-08 13:49:24 +00:00
intval ( $max_comments + 1 )
);
$items = array_merge ( $items , $thread_items );
}
2012-06-15 00:46:58 +00:00
$items = conv_sort ( $items , $ordering );
} else {
$items = array ();
}
2012-09-29 23:56:50 +00:00
2013-12-09 23:13:19 +00:00
if ( $_GET [ " offset " ] == " " )
$date_offset = $items [ 0 ][ $order_mode ];
else
$date_offset = $_GET [ " offset " ];
$a -> page_offset = $date_offset ;
2012-09-29 23:56:50 +00:00
if ( $parents_str )
$update_unseen = ' WHERE uid = ' . intval ( local_user ()) . ' AND unseen = 1 AND parent IN ( ' . dbesc ( $parents_str ) . ' )' ;
2012-06-15 00:46:58 +00:00
}
// We aren't going to try and figure out at the item, group, and page
// level which items you've seen and which you haven't. If you're looking
2014-03-09 08:19:14 +00:00
// at the top level network page just mark everything seen.
2013-01-13 16:13:01 +00:00
2012-10-26 21:29:42 +00:00
2014-03-09 08:19:14 +00:00
// The $update_unseen is a bit unreliable if you have stuff coming into your stream from a new contact -
// and other feeds that bring in stuff from the past. One can't find it all.
2012-10-26 21:29:42 +00:00
// I'm reviving this block to mark everything seen on page 1 of the network as a temporary measure.
// The correct solution is to implement a network notifications box just like the system notifications popup
// with the ability in the popup to "mark all seen".
// Several people are complaining because there are unseen messages they can't find and as time goes
// on they just get buried deeper. It has happened to me a couple of times also.
2014-03-09 08:19:14 +00:00
2012-10-26 21:29:42 +00:00
if (( ! $group ) && ( ! $cid ) && ( ! $star )) {
2013-09-15 08:40:58 +00:00
$r = q ( " UPDATE `item` SET `unseen` = 0
2012-06-15 00:46:58 +00:00
WHERE `unseen` = 1 AND `uid` = % d " ,
intval ( local_user ())
);
2012-10-26 21:29:42 +00:00
}
2012-11-13 10:30:43 +00:00
else {
if ( $update_unseen )
$r = q ( " UPDATE `item` SET `unseen` = 0 $update_unseen " );
}
2012-06-15 00:46:58 +00:00
// Set this so that the conversation function can find out contact info for our wall-wall items
$a -> page_contact = $a -> contact ;
$mode = (( $nouveau ) ? 'network-new' : 'network' );
$o .= conversation ( $a , $items , $mode , $update );
2013-10-14 22:49:13 +00:00
if ( ! $update ) {
2015-02-05 10:29:14 +00:00
if ( get_pconfig ( local_user (), 'system' , 'infinite_scroll' )) {
$o .= scroll_loader ();
} elseif ( ! get_config ( 'system' , 'old_pager' )) {
2012-11-28 02:30:46 +00:00
$o .= alt_pager ( $a , count ( $items ));
2015-02-08 10:54:42 +00:00
} else {
2012-11-28 02:30:46 +00:00
$o .= paginate ( $a );
2012-07-14 18:21:58 +00:00
}
2012-06-15 00:46:58 +00:00
}
return $o ;
}
2013-11-02 09:49:44 +00:00