<?php
/*
 * Функция преобразования стандартной листалки страниц в красивый вид - с указанием первой, последней страницы и ссылками перехода вперед/назад
 * Учитывает наличие нескольких инфоблоков на странице
 * Сохраняет строку get-запроса для дополнительных ссылок
 * Использует стандартный шаблон $browse_msg, для добавления ссылок вперед/назад нужно дополнить шаблон следующими элементами:
 * $browse_msg['plink'] = "<a href='#PLINK#'>назад</a>";
 * $browse_msg['nlink'] = "<a href='#NLINK#'>вперед</a>";
 * При использовании другого шаблона, его нужно указать третьим аргументом функции, так же, как для стандартной функции nc_browse_messages
 * 
 * Вызывать в любом компоненте из шаблона вывода списка объектов так:
 * <?=welpis_browse_messages($cc_env, 10)?>
 * Результат будет примерно в таком виде: « 1 ... 6 7 8 9 10 11 12 13 14 15 ... 120 »
 */



function welpis_browse_messages($cc_env, $range, $user_template = false) {
    global $cc, $current_sub;
    $maxRows  = $cc_env['maxRows'];
    $totRows  = $cc_env['totRows'];
    $recNum   = $cc_env['recNum'];
    $curPos   = $cc_env['curPos'];
    $prevLink = $cc_env['prevLink'];
    $nextLink = $cc_env['nextLink'];
	if ( is_array($user_template) ) $tpl =& $user_template;
	else $tpl =& $GLOBALS['browse_msg'];

	$curget = $_GET; 
	unset( $curget['curPos'] ); 
	unset( $curget['cur_cc'] ); 
	if ( count($curget) ) $query_string = http_build_query( $curget, '', '&amp;' ); $add_cc = ( intval( $current_sub['UseMultiSubClass'] ) ? true : false );

    $flink = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH).( $add_cc ? '?cur_cc='.$cc : NULL ).( !empty($query_string) ? ( $add_cc ? '&' : '?' ).$query_string : NULL );
    $llink = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH).'?'.( $add_cc ? 'cur_cc='.$cc.'&' : NULL ).'curPos='.( ( ceil( $totRows / $recNum ) - 1 ) * $recNum ).( !empty($query_string) ? '&'.$query_string : NULL );
    $plink = ( $prevLink ? str_replace('#PLINK#', $prevLink, $tpl['plink']) : NULL );
    $nlink = ( $nextLink ? str_replace('#NLINK#', $nextLink, $tpl['nlink']) : NULL );

    $item = $tpl['unactive'];
    function replace_macro($str, $link, $page) {
        if ( empty($str) ) return false;
        $str = str_replace('%URL', $link, $str);
        $str = str_replace('%PAGE', $page, $str);
        return $str;
    }

	$page_count = ( $maxRows > 0 ? ceil( $totRows / $maxRows) : 0 ); 
    $cur_page   = ( $maxRows > 0 ? ceil( $curPos / $maxRows ) + 1 : 1 ); 
    $half_range = ceil( $range / 2 ); 
    $maybe_from = $cur_page - $half_range; 
    $maybe_to   = $cur_page + $half_range; 
    if ( $maybe_from < 0 ) { 
        $maybe_to = $maybe_to - $maybe_from; 
        $maybe_from = 0; 
        if ( $maybe_to > $page_count ) $maybe_to = $page_count; 
    } 
    if ( $maybe_to > $page_count ) { 
        $maybe_from = $page_count - $range; 
        $maybe_to = $page_count; 
        if ( $maybe_from < 0 ) $maybe_from = 0; 
    } 

    if ( $maybe_from != 0 || $cur_page != 1)
        $tpl['prefix'] .= '#PREV#'.( $maybe_from >= 1 ?
            replace_macro($item, $flink, 1).
            ( $maybe_from != 1 ? replace_macro($item, $flink, '...') : NULL )
        : NULL ); 
    else $tpl['prefix'] .= '#PREV#'.( $maybe_from >= 2 ? replace_macro($item, $flink, '...') : NULL );

    if ( $maybe_to != $page_count || $cur_page != $page_count )
        $tpl['suffix'] = ( $maybe_to <= $page_count ?   
            ( $maybe_to < $page_count ? replace_macro($item, $llink, '...') : NULL ).
            ( $cur_page < $page_count - floor( $range / 2 ) && $page_count > $range ? replace_macro($item, $llink, $page_count) : NULL )
        : NULL ).'#NEXT#'.$tpl['suffix']; 
    else $tpl['suffix'] = ( $maybe_to + 1 < $page_count ? replace_macro($item, $llink, '...') : NULL).'#NEXT#'.$tpl['suffix'];

    $tpl['prefix'] = str_replace('#PREV#', $plink, $tpl['prefix']); 
    $tpl['suffix'] = str_replace('#NEXT#', $nlink, $tpl['suffix']); 

    return nc_browse_messages($cc_env, $range, $user_template);
} 


?>
