<?

Class G_Paginacao {
    /*
        Baseado no c�digo do Calvin
        http://phpbrasil.com/scripts/script.php/id/581
        Colocado em uma classe por Fabio Issamu Oshiro 13/8/2006
        Alterado para controlar o n�mero de links exibidos por vez (por Hudson FAS em Maio/2007)
    */
    var $registros_por_pagina = 35;
    var $pagina = 1;
    var $paginaKey = "pagina";
    var $query;
    var $currentPage;
    var $link_de_navegacao;
    var $links_por_pagina = 15;  // N�mero de itens de links exib�veis

    
    function G_Paginacao() {
        $this->currentPage = "?" . $_SERVER["QUERY_STRING"];
        if (strpos($this->currentPage,"&")!==false)  {
          $this->currentPage = "?" ;
          $vettemp = split('&',$_SERVER["QUERY_STRING"]);
          $qtd=0;
          foreach ($vettemp as $Item) {
            if (trim($Item)!="")
              if (strpos($Item,$this->paginaKey)===false) {
                if ($qtd>0) $this->currentPage .= "&" & $Item;
                else        $this->currentPage .= $Item;
                $qtd++;
              }
          }
       }
    }
    function SetPaginacao($query,$regs_pag=0,$links_pag=0) {
        if ($regs_pag>0 ) $this->registros_por_pagina = $regs_pag;
        if ($links_pag>0) $this->links_por_pagina     = $links_pag;

        //   Descobrir qual o n�mero total de registros que a busca QUERY retorna
        $resultado = mysql_query(eregi_replace('(.*)from','select count(*) from', $query));
        $total_de_registros = mysql_result($resultado, 0);

        // Calcular o n�mero de p�ginas que ser� preciso dividir o resultado 

        if ($total_de_registros <= $this->registros_por_pagina) {
            $total_de_paginas = 1;
        } elseif (($total_de_registros % $this->registros_por_pagina) == 0) {
            $total_de_paginas = ($total_de_registros / $this->registros_por_pagina);
        } else {
            $total_de_paginas = ($total_de_registros / $this->registros_por_pagina) + 1;
        }
        $total_de_paginas = (int) $total_de_paginas;   //  Caso o n�mero seja quebrado, transformar em n�mero inteiro

        // Lendo "pagina atual" e "ultima p�gina" da URL e efetuando medidas sanit�rias nas mesmas 

        $pagina_base = 1;
        $ultima_pagina = $this->pagina;
        if ( isset($_REQUEST[$this->paginaKey]) ) {
          $vetTemp = explode('_',$_REQUEST[$this->paginaKey]);
          if (count($vetTemp)>=1) {
            if ($vetTemp[0]>=1 && $vetTemp[0]<=$total_de_paginas) $this->pagina  = $vetTemp[0];
          }          
          if (count($vetTemp)==3) {
            if ($vetTemp[1]>=1 && $vetTemp[1]<=$total_de_paginas) $pagina_base   = $vetTemp[1];
            if ($vetTemp[2]>=1 && $vetTemp[2]<=$total_de_paginas) $ultima_pagina = $vetTemp[2];
          }
        }

     /*
           Vamos calcular a p�gina anterior e posterior que estamos
           Em seguida devemos calcular qual o ponto nos registros retornados na QUERY, acima,
           atualmente devemos RECOME�AR a ler.
           */                   
        $pagina_anterior  = $this->pagina - 1;
        $pagina_posterior = $this->pagina + 1;
        $registro_inicio  = ($this->registros_por_pagina * $this->pagina) - $this->registros_por_pagina;


        if (($this->pagina > $total_de_paginas) || ($this->pagina < 0)) {
          echo 'n�mero da p�gina inv�lido';
          exit;
        }
        $query = $query . " LIMIT $registro_inicio, $this->registros_por_pagina";
        
        /*
                   Aqui se faz a m�gica de limitar os resultados que vc deseja para a
                   p�gina ser do registro X at� Y

                   Caso tenha prestado aten��o no c�digo, perceber� que o segredo da pagina��o de resultados
                   se limita ao uso do recurso LIMIT do MySQL para limitar a busca para os registros que
                   vc quer mostrar na p�gina.

                   Explica��o sobre como funciona esse pequena parte do SQL.

                   A QUERY:  SELECT * FROM tabela_qualquer WHERE idnome='$idnome'
                   vai retornar o seguinte resultado

                  resultado   | idnome   |   nome        | coluna1  | coluna2
                  0               1          manuel        xxx        yyy
                  1               2          joaquim       xxx        yyy
                  3               3          tereza        xxx        yyy
                  4               4          luiz          xxx        yyy
                  5               5          francisco     xxx        yyy

                   A linha resultado 0 � a primeira linha dos resultados encontrados. A numera��o �
                   a partir de ZERO e n�o 1 como se pensaria.

                   Se vc quizesse apenas os registros de joaquim a luiza vc faria esta query

                   SELECT * FROM tabela_usuarios LIMIT 1,3

                   O que significa LIMIT 1,3?
                   Indica que vc quer 3 registros a partir da linha 1 da busca.
                */
        $resultado = mysql_query($query);
        
        // Decidindo a nova p�gina base
        $pagina_media = $pagina_base + intval(round($this->links_por_pagina/2)) - 1;
        if ( $total_de_paginas > $this->links_por_pagina) {
          if ($this->pagina >= $ultima_pagina) {              // avan�ando
            if ($this->pagina >= $pagina_media) {
               if ($this->pagina-$ultima_pagina==1) 
                 $pagina_base++;
               else 
                 $pagina_base = $this->pagina - intval(round($this->links_por_pagina/2));
            }   
          }
          else {                                               // voltando
            if ($this->pagina <= $pagina_media) {
              if ($ultima_pagina-$this->pagina==1) 
                $pagina_base--;
              else
                $pagina_base = $this->pagina - intval(round($this->links_por_pagina/2));
            }
          }
          if ($pagina_base<1) $pagina_base=1;          
          while ( $pagina_base>1 && ($pagina_base+$this->links_por_pagina-1)>$total_de_paginas )
            $pagina_base--;          
        }  

        /*
                    * Se��o para criar link de navega��o entre as p�ginas
                    * Vai aparecer como aqueles link do tipo
                    *
                    * Anterior 1 2 [3] 4 5 Pr�ximo
                    */
        $link_base = "${pagina_base}_$this->pagina";
        $this->link_de_navegacao = 'P�gina:&nbsp;';

        if ($total_de_paginas>1) {
          /* link "anterior" */
          if($pagina_anterior) {
            $this->link_de_navegacao .= "<a href=\"$this->currentPage&$this->paginaKey=${pagina_anterior}_${link_base}\"><strong>&lt;</strong></a>&nbsp;";
          }
          else $this->link_de_navegacao .= "&lt;&nbsp;";              
         
          for($i=$pagina_base; (($i-$pagina_base)<$this->links_por_pagina) && ($i <= $total_de_paginas); $i++) {
            if($i != $this->pagina) {
              /* link individual para as outras p�ginas */
              $this->link_de_navegacao .= "&nbsp;<a href=\"$this->currentPage&$this->paginaKey=${i}_${link_base}\">$i</a>&nbsp;";
            } else {
              $this->link_de_navegacao .= "&nbsp;<big><b>${i}</b></big>&nbsp;";
            }
          }
          /* link "proximo" */
          if($this->pagina != $total_de_paginas) {
            $this->link_de_navegacao .= "&nbsp;<a href=\"$this->currentPage&$this->paginaKey=${pagina_posterior}_${link_base}\"><strong>&gt;</strong></a>&nbsp;";
          }
          else $this->link_de_navegacao .= "&nbsp;&gt;";
        }
        else $this->link_de_navegacao .= "<big><b>1</b></big>";
        return $resultado;
        }
}

// Modo de Usar:

/*
$objPaginacao=new G_Paginacao;
//caso voc� queira alterar o n�mero de p�ginas exibidas
//$objPaginacao->registros_por_pagina=4;
//caso voc� tenha que usar outro nome no QueryString Ex: nomedasuapagina.php?paginacao2=2
//$objPaginacao->paginaKey="paginacao2";
$objPaginacao->currentPage="nomedasuapagina.php";
$result = $objPaginacao->SetPaginacao("Select * From Tbl_alguma where alguma_coisa='algo' order by sua_ordem",30,10);
// A linha anterior informa que cada p�gina ter� apenas 30 registros, e a janela de 'links' de p�gina mostra de 10 em 10 links
$num=mysql_numrows($result);
if ($num==0){
    echo "<tr><td colspan='3'>vazio</td></tr>";
}
$i=0;
$objRua=new G_Rua();
While($i<$num) {
    //seu c�digo para imprimir os resultados
}

// Aqui imprime os bot�es de Anterior 1 2 3 4 pr�ximo
// <?=$objPaginacao->link_de_navegacao?>

*/
?>