<?php
/**
 *  Biblioteca de Funções básicas  ---------------------------------------  //
 *  =============================
 *  arquivo: PhPage.lib.php
 *  versão: 1.0.1
 *  atualizado: 19/07/2005
 */
 
/**
 *  Função: getPatch()
 *
 *  Descrição: Monta o caminho para a cópia local do Projeto
 *  retorna: string -
 */
  function getPatch()
  {
    $uri = $_SERVER["REQUEST_URI"];
    $len = strlen($uri) -1;
    while($uri[$len] != "/")
      $len --;

    return substr($uri, 0, $len + 1);
  }// End function getPatch()

/**
 *  Função execPage()
 *
 *  Descrição: Executa o código da Page.
 *  Recebe: $nPage => nome da Page a ser Executada
 *  retorna:
 *
 *  Executa um Page
 */
  function execPage( $nPage )
  {
    global $projeto,
           $esquema,
           $componentes_no_Prj,
           $_desenv_,
           $modo_RAD;

    /*  declara as variáveis Globais  */
    foreach( $componentes_no_Prj as $ind_ => $val_)
    {
      global $$ind_;
    }// End foreach( $componentes_no_Prj as $ind_ => $val_)
    
    include( $_SERVER['DOCUMENT_ROOT'] .
             $_desenv_ . "core/" .
             $nPage . '.main.php' );
  }// End function execPage( $nPage )


/**
 *  função: getTemplates( $comp_no_Prj, $local )
 *
 *  Descrição: Retorna os nomes dos templates contidos no Objeto
 *
 *  $comp_no_Prj => array com os componentes incluidos no projeto
 *  $local       => Nome do Objeto Container
 *
 *  retorna: array com o nome dos templates para o Objeto do tipo container
 */
  function getTemplates( $comp_no_Prj, $local )
  {
    $arr = array();
    foreach($comp_no_Prj as $_ind_ => $_val_)
    {
      foreach($_val_ as $_n_ => $_l_)
      {
        if ($_l_['local'] == $local )
          $arr[] = $_l_['nome'];
      }
    }// End foreach($objetos_na_Page as $_ind_ => $_val_)
    return($arr);
  }// End function getTemplates( $comp_no_Prj, $local )


/**
 *  função: getGlobal( $comp_no_Prj, $local )
 *
 *  Descrição:
 *
 *  Parametros:
 *  $comp_no_Prj => array com os componentes incluidos no projeto
 *  $local       => container dos objetos
 *
 *  retorna: array com o nome das variáveis Globais
 */
  function getGlobal( $comp_no_Prj, $local )
  {
    $arr = array();
    foreach($comp_no_Prj as $_ind_ => $_val_)
    {
      foreach($_val_ as $_n_ => $_l_)
      {
        if ($_l_['local'] == $local )
          $arr[] = $_l_['nome'];
      }
    }// End foreach($objetos_na_Page as $_ind_ => $_val_)
    return($arr);
  }// End function getGlobal( $comp_no_Prj, $local )


  
/**
 *  função getRegistro()
 *
 *  Lê o Arquivo de Projeto (.main.prj)
 *  para criar o arquivo de Configuração (.main.inc.php)
 *  ---------------------------------------------------------------------  //
 *
 *  $prj = nome do Projeto
 *  retorna: nome do arquivo gerado (.main.inc.php)
 */
  function getRegistro( $prj )
  {
    global $_rad_, $_desenv_;
    
    $nFile = $prj . ".main.prj";
    $nDest = $prj . ".main.inc.php";
    $texto = "";
    $nComp = "";
    $nObj  = "";
    $nl    = "\n";
    $array = array();
    if ( file_exists($nFile) )
    {
      $linhas = file($nFile);
    }else
    {
      $linhas = array();
    }// End
      
    asort($linhas);
    reset($linhas);

    $texto = "<?php " . NEWLINE;
    $flag  = false;
    foreach( $linhas as $i_ => $linha_ )
    {
      $linha_ = trim($linha_);
      
      if ( !empty( $linha_ ) )
      {
        $flag = true;
        $arrLinhas = explode( ";", trim($linha_) );
        array_pop($arrLinhas);
      
        foreach( $arrLinhas as $ii_ => $linha )
        {
          $arr = explode( ":", $linha );
      
          if( $nComp != $arr[0] )
          {
            if ( $nObj != "" )
            {
              $texto .= "    )".$nl;
            }// End if ( $nObj == "" )
            if( $nComp != "" )
              $texto .= "  ); ".$nl;
        
            $nComp   = $arr[0];
            $nObj    = "";
            $array[] = $arr[0];
            $texto .= "  $".$arr[0]." = array( ".$nl;
          }// End if( $nComp != $arr[0] )

          if( $nObj != $arr[1] )
          {
            if ( $nObj != "" )
            {
              $texto .= "    ),".$nl;
            }// End if ( $nObj == "" )
            $nObj = $arr[1];
            $texto .= "    '" . $arr[1] . "' => array( " . $nl;
          }// End if( $nObj != $arr[1] )
      
          $texto .= "      'nome'      => '" . $arr[2]       . "'," . $nl;
          $texto .= "      'local'     => '" . $arr[3]       . "'," . $nl;
          $texto .= "      'container' => '" . $arr[4]       . "'," . $nl;
          $texto .= "      'visual'    => '" . trim($arr[5]) . "' " . $nl;

        }// End foreach()
      }// End if()
    }//End foreach( $linhas as $i_ => $linha )

    $l = count( $array );
    $x = 0;

    if ( $flag )
    {
      $texto .= "    )" . $nl;
      $texto .= "  );"  . $nl;
    }
    $texto .= "  "    . $nl;
    $texto .= "  \$componentes_no_Prj = array( " . $nl; 
     
    foreach($array as $ii_ => $cpo )
    {
      $x ++;
      $sp = ( $x < $l ) ? "," : "";
      $texto .= "    '".$cpo."' => $".$cpo . $sp . $nl; 
    }// End foreach($array as $ii_ => $cpo )

    $texto .= "  ); " . $nl;
    $texto .= "  "    . $nl;
    $texto .= "?> "   . $nl;  
    
    $fp = @fopen( $nDest, 'wb' );
    fwrite( $fp, $texto );
    fclose( $fp );
    
    return( $prj . ".main.inc.php" );
  }// End function getRegistro( $prj ) 
  
  
/**
 *  getPaletas()
 *
 *  retorna: array com as Paletas disponíveis
 */  
  function getPaletas()
  { 
    $nDir      = "core/paletas/";
    $arrPaleta = array();
    
    if ( file_exists($nDir) && is_dir($nDir) )
    {
      if ($handle = opendir($nDir)) 
      {
        while (false !== ($file = readdir($handle))) 
        {
          if ( is_dir($nDir.$file) )
          {
            if ($file != "." && 
                $file != ".." &&
                $file != "bkp"
                ) 
            {
              $arrPaleta[] =  "$file";
            }
          }  
        }
        closedir($handle);
      }
    }// End if ( file_exists($nDir) && is_dir($nDir) )
    return( $arrPaleta  );
  }// End function getPaletas()
  
/**
 *  getObjetos()
 *
 *  $nPaleta = nome da Paleta
 *  retorna: array com os Componentes da Paletas
 */  
  function getObjetos( $nPaleta )
  { 
    $nDir   = "core/paletas/" . $nPaleta;
    $arrObj = array();
    
    if ( file_exists($nDir) )
    {
      if ($handle = opendir($nDir)) 
      {
        while (false !== ($file = readdir($handle))) 
        {
            if ($file != "." && 
                $file != ".." &&
                $file != "bkp"
                ) 
            {
              $ix = strpos( $file, ".");
              $arrObj[] =  substr($file,0, $ix);
            }
        }
        closedir($handle);
      }
    }// End if ( file_exists($nDir) && is_dir($nDir) )
    return( array_unique($arrObj)  );
  }// End function getObjetos()
  


  /**
   *  getFile()
   *
   *  pega os nome dos Arquivos no diretorio especificado
   *
   *  $nDir = nome do Diretorio
   *  $pre  = prefixo do nome dos arquivos
   *  retorna: Array associativo com os nomes dos Arquivos
   */
  function getFile( $nDir, $pre = "" )
  { 
    $arrFile = array();
    if ( file_exists($nDir) && is_dir($nDir) )
    {
      if ($handle = opendir($nDir)) 
      {
        while (false !== ($file = readdir($handle))) 
        {
          if ( !is_dir($nDir.$file) )
          {
            if ($pre == "" )
            {
              $arrFile[] =  "$file";
            }else
            {
              $l = strlen( $pre );
              if( $pre == substr( $file, 0, $l ) &&
                  !strpos( $file, "RAD" )
                )
                $arrFile[] =  "$file";
            }// End if ($pre == "" )
          }// End if ( !is_dir($nDir.$file) )
        }// End while (false !== ($file = readdir($handle)))
        closedir($handle);
      }// End if ($handle = opendir($nDir))
    }// End if ( file_exists($nDir) && is_dir($nDir) )
    return( $arrFile  );
  }// End function getFile( $nDir, $sufixo = "" ) 



  /**
   *  getDir()
   *
   *  pega os nome dos Diretorios
   *
   *  $nDir = nome do Diretorio base
   *  retorna: Array associativo com os nomes dos Diretorios
   */
  function getDir( $nDir )
  {
    $arrFile = array();
    if ( file_exists($nDir) && is_dir($nDir) )
    {
      if ($handle = opendir($nDir))
      {
        while (false !== ($file = readdir($handle)))
        {
          if ( is_dir($nDir . $file) &&
               $file != '.' && $file != '..'
             )
          {
            $arrFile[] =  "$file";
          }
        }
        closedir($handle);
      }// End if()
    }// End if ( file_exists($nDir) && is_dir($nDir) )
    return( $arrFile  );
  }// End function getFile( $nDir, $sufixo = "" )


/**
 *  writeTO()
 *
 *  escreve uma String no dispositivo indicado
 *
 *  $texto = String a ser escrita
 *  retorna: boolean
 */
function writeTO( $texto_, $alvo_ = "HTML" )
{
  if ( $alvo_ == "HTML")
  {
    echo( $texto_ . NEWLINE );
  }else
  {
//echo('dest: '.$alvo_."\n");
//echo('text: '.$texto_."\n");exit;
    fwrite( $alvo_, $texto_ . NEWLINE );
  }// End if ( $alvo_ == "HTML")
  return( true );
}// End function writeTO()





/**
 * writeINIfile()
 *
 *  Escreve no arquivo .ini
 *
 *  $filename = nome do arquivo a ser Escrito
 *  $array1 = Array com os Itens para ser escritos
 *  $commentchar = Caracter utilizado como marcador de Comentário
 *  $commenttext = Comentário a ser escrito
 *  retorna: boolean
 */
function writeINIfile($filename, $array1, $commentchar, $commenttext)
{
  $handle = @fopen($filename, 'wb');
  
  if ( $commenttext != '' )
  {
    $comtext = $commentchar.
    str_replace($commentchar, "\r\n".$commentchar,
      str_replace("\r", $commentchar,
        str_replace("\n", $commentchar,
          str_replace("\n\r", $commentchar,
            str_replace("\r\n", $commentchar, $commenttext)
          )
        )
      )
    );
    if ( substr($comtext, -1, 1) == $commentchar &&
         substr($comtext, -1, 1) != $commentchar)
    {
     $comtext = substr( $comtext, 0, -1 );
    }
    @fwrite ( $handle, $comtext."\r\n" );
  }// End if()
  
  foreach ($array1 as $sections => $items)
  {
    //Write the section
    if (isset($section))
    {
      @fwrite ($handle, "\r\n");
    }// End if()
    
    //$section = ucfirst(preg_replace('/[\0-\37]|[\177-\377]/', "-", $sections));
    $section = ucfirst(preg_replace('/[\0-\37]|\177/', "-", $sections));
    @fwrite ( $handle, "[".$section."]\r\n" );

    foreach ($items as $keys => $values)
    {
      //Write the key/value pairs
      //$key = ucfirst(preg_replace('/[\0-\37]|=|[\177-\377]/', "-", $keys));
      //$key = ucfirst(preg_replace('/[\0-\37]|=|\177/', "-", $keys));
      $key = preg_replace('/[\0-\37]|=|\177/', "-", $keys);

      if ( substr($key, 0, 1) == $commentchar)
      {
        $key = '-'.substr($key, 1);
      }
      //$value = ucfirst(addcslashes($values,''));
      $value = addcslashes($values,'');
      //@fwrite( $handle, '    ' . $key . ' = "' . $value . "\"\r\n" );
      @fwrite( $handle, '    ' . $key . ' = ' . $value . "\r\n" );

    }//End foreach()
  }// End foreach()
  
  fclose($handle);
  return(true);
}

/**
 * readINIfile()
 *
 *  Le o arquivo .ini para um array associativo
 *
 *  $filename = nome do arquivo a ser Lido
 *  $commentchar = Caracter utilizado como marcador de Comentário
 *  retorna: Array contendo os Itens do arquivo
 */
function readINIfile( $filename, $commentchar = ";" )
{
  $array1 = array();
  $array2 = array();
  if( file_exists( $filename ) )
  {
    $array1  = @file( $filename );
    $section = '';
    foreach ( $array1 as $filedata )
    {
     $dataline  = trim($filedata);
     $firstchar = substr($dataline, 0, 1);
     if ( $firstchar != $commentchar && $dataline != '' )
     {
       //It's an entry (not a comment and not a blank line)
       if ($firstchar == '[' && substr($dataline, -1, 1) == ']')
       {
         //It's a section
         $section = strtolower( substr( $dataline, 1, -1 ) );
       }else
       {
         //It's a key...
         $delimiter = strpos($dataline, '=');

         if ($delimiter > 0)
         {
           //...with a value
           //$key   = strtolower( trim( substr($dataline, 0, $delimiter) ) );
           $key   = trim( substr($dataline, 0, $delimiter) );

           $value = trim( substr( $dataline, $delimiter + 1) );

           if ( substr($value, 1, 1) == '"' &&
                substr($value, -1, 1) == '"')
           {
             $value = substr($value, 1, -1);
           }
           $array2[$section][$key] = stripcslashes($value);
         }else
         {
           //...without a value
           //$array2[$section][strtolower(trim($dataline))] = '';
           $array2[$section][ trim($dataline) ] = '';
         }
       }
     }else
     {
       //It's a comment or blank line.  Ignore.
     }
    }
  }
  return( $array2 );
}

function getPrimaryKeyOf($table)
{
  $keys = Array();

  $query = sprintf("SHOW KEYS FROM `%s`", $table);
  $result = mysql_query($query) or die(mysql_error());

  while ($row = mysql_fetch_assoc($result))
  {
    if ( $row['Key_name'] == 'PRIMARY' )
    $keys[$row['Seq_in_index'] - 1] = $row['Column_name'];
  }// End while

  return $keys;
}// end function

/**
 *  getTableInformationOf()
 *  retorna um array associativo com os dados da Tabela fornecida
 *
 *  array
 *  (
 *    [auto] => nome da coluna auto_incremento
 *    [primary] => array
 *    (
 *       [0] => nome da(s) coluna(s) da chave primaria
 *    )
 *    [fields] => array
 *    (
 *      [0] => array
 *      (
 *        [Field]   => nome do campo
 *        [Type]    => tipo do campo
 *        [Null]    => yes ou no para NOT NULL
 *        [Key]     => nome da chave
 *        [Default] => valor padrão
 *        [Extra]   => valor extra
 *      )
 *    )
 *  )
 */
function getTableInformationOf($table)
{
  $information = array(
    "auto" => "",
    "primary" => array(),
    "fields" => array()
  );

  $information['primary'] = getPrimaryKeyOf($table);
  $result = mysql_query("DESC `$table`");
  while ( $field = mysql_fetch_assoc($result) )
  {
    $information['fields'][] = $field;
    if ( $field['Extra'] == "auto_increment" )
      $information['auto'] = $field['Field'];
  }

  return $information;
}// End function


?>

