<?
/*
*  Copyright (C) 2000-2004 Christophe Thibault, sIX, Gael Chardon
*  Rating system added by sIX / aEGIS <six@aegis-corp.org>
*  Many small things (see below) added by Gael Chardon <gael.dev@4now.net>
*
* > Gael Chardon <gael.dev@4now.net>, 23 November 2004:
* - automatic redirction to the main page instead of blank page
* - fix root dir bug (no /./pic)
* - root_dir is now a link
*
* > Gael Chardon <gael.dev@4now.net>, 23 October 2004:
* - only list files with the following extension jpg/jpeg/avi/mov/wmv/asf/mpeg/mpg/wav/mp3/txt
* - display the filesize for movie files
* - display movie in a popup after a simple "preview page"
*
* > Gael Chardon <gael.dev@4now.net>, 23 October 2004:
* - only list files with the following extension jpg/jpeg/avi/mov/wav/mp3/txt
* - fix movie link when remote_link!="" 
*
* > Gael Chardon <gael.dev@4now.net>, 26 June 2004:
* - adding log support using $logfile variable
* - add $remote_4nolr option to force the loading from remote_link
*   for small files with no lr_    
* - display the number of files in a directory even from a "root" dir
* - destroy session when not logged
* - fix wrong level check in "top rating" page 
*
* > Gael Chardon <gael.dev@4now.net>, 19 June 2004:
* - use php session instead of cookie
*
* > Gael Chardon <gael.dev@4now.net>, 30 June 2003:
* - fix 'add coment' reload (using the same code for dir & pic)
* - use $sDB (DB name) instead of 'PhpGraphy' for the cookie name
*
* > Gael Chardon <gael.dev@4now.net>, 27 June 2003:
* - adding comment support for directory (first version)
*
* > Gael Chardon <gael.dev@4now.net>, 23 June 2003:
* - add "remote_link" feature
* - add pages list
* - add "return to list" in pic. display
* - add more $txt_ stuff for localization
* - now "already_rated" function also uses login
* - use login name (when present) to add comments
* - change directory display
* - change cookie's name and duration (in config.php)
*
* TODO:
* - Display exif data
* - ftp upload for external link mode 
* - Find a better way to display comment: using frame ?
* - Flag to enable/disable comments for each directory
* - Improve level restriction
*
*  This program is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2, or (at your option)
*  any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software
*  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/

session_start();

include 
"config.inc.php";

if(
$thumb_generator=="convert") {
  @
exec("which convert"$my_convert_path);
  if(
$my_convert_path[0]=="") die("install convert (see manual) or use 'GD' or 'manual' as thumb generator");
}

function 
get_comment($nom)
{
  global 
$sDB,$nConnection,$sTable;
  
$cmd="select * from $sTable where name='".addslashes($nom)."'";
  
$res=mysql_db_query($sDB,$cmd,$nConnection);
  
$row=mysql_fetch_array($res);
  return 
$row["descr"];
}

function 
get_movie_size($file)
{
  global 
$root_dir;
  if (
get_movie_type($file))
  {
    
$comment_size filesize($root_dir.$file);
    if (
$comment_size>(1048576))
      
$comment_size sprintf("%.1f M"$comment_size/1048576); 
    else if (
$comment_size>1024)
      
$comment_size sprintf("%.1f K"$comment_size/1024);
    
$comment_size "<br>(".$comment_size."B)";
    return 
$comment_size;
  }
  return 
"";
}

function 
add_log($txt)
{
  global 
$logfile,$sDB;
  if (
$logfile)
  {
    
$handle fopen ($logfile"a");
    if (
$handle
    {
      
$curdate date("M j G:i:s O");
      
fputs($handle"[$curdate][".getenv("REMOTE_ADDR")."][$sDB] $txt\n");
      
fclose($handle);
    }
  }
}

function 
get_rating($nom)
{
  global 
$sDB,$nConnection,$sTableRatings;
  
$cmd="select avg(rating), count(*) from $sTableRatings where pic_name='".addslashes($nom)."'";
  
$res=mysql_db_query($sDB,$cmd,$nConnection);
  
$row=mysql_fetch_array($res);
  return (
$row[1]?$row[0]:false);
}

function 
already_rated($nom)
{
  global 
$sDB,$nConnection,$sTableRatings;
  if(
$_SESSION['sess_login'])
    
$cmd="select * from $sTableRatings where pic_name='".addslashes($nom)."' and login='".$_SESSION['sess_login']."'";
  else
    
$cmd="select * from $sTableRatings where pic_name='".addslashes($nom)."' and ip='".getenv("REMOTE_ADDR")."'";
  
$res=mysql_db_query($sDB,$cmd,$nConnection);
  
$row=mysql_fetch_array($res);
  return(
$row);
}

function 
get_level_db($nom)
{
  global 
$sDB,$nConnection,$sTable;
  
$cmd="select * from $sTable where name='".addslashes($nom)."'";
  
$res=mysql_db_query($sDB,$cmd,$nConnection);
  
$row=mysql_fetch_array($res);
  return (int)
$row["seclevel"];
}

function 
get_level($pic) {
  if(!
strstr($pic,"/")) return (int)get_level_db($pic);
  
$l=get_level_db($pic);
  if(
$l!=0) return (int)$l;
  
$l2=get_level_db($pic."/");
  if(
$l2!=0) return (int)$l2;
//  return (int)(get_level(substr($pic,0,strrpos($pic,"/")+1)));
  
return (int)(get_level(substr($pic,0,strrpos($pic,"/"))));
}

function 
get_nb_photos($dir$seclevel$dirlevel)
{
  if (
$dirlevel>5)
    return 
0;
  global 
$root_dir;
  
$count 0;
  
$dh=dir($root_dir.$dir);
//  echo $root_dir.$dir."<br>";
  
while ($file=$dh->read()) {
    if(
substr($file,0,1)==".") continue;
    if(
substr($file,-8)=="_comment") continue;
//    echo $dir.$file."/<br>";
    
if(is_dir($root_dir.$dir.$file)) {
      if((int)
get_level($dir.$file."/")<=$seclevel)
        
$count += get_nb_photos($dir.$file."/"$seclevel$dirlevel+1);
    } else {
//      if(get_level($dir.$file)<=(int)$seclevel)
        
$count ++;
    }
  }
  
$dh->close();
  return 
$count;  
}

function 
reformat($s)
{
  if(
$s$s=StripSlashes($s);
  if(!
strstr($s,"..")) { } else $s=""// ANTI HACK :)
  
if ($s=="."$s="";
  return(
$s);
}

// sound/video/text functions

function get_movie_type($doc)
{
  if (
eregi("mov$"$doc)) {
    return 
"video/quicktime";
  }
  if (
eregi("asf$"$doc)) {
    return 
"video/x-msvideo";
  }  
  if (
eregi("wmv$"$doc)) {
    return 
"video/x-msvideo";
  }  
  if (
eregi("avi$"$doc)) {
    return 
"video/x-msvideo";
  }
  else if (
eregi("mpe?g$"$doc)) {
    return 
"video/mpeg";
  }
  return 
0;
}

function 
get_sound_type($doc)
{
  if (
eregi("wav$"$doc)) {
    return 
"audio/x-wav";
  }
  else if (
eregi("mp3$"$doc)) {
    return 
"audio/mp3";
  }
  return 
0;
}

function 
get_text_type($doc)
{
  if (
eregi("txt$"$doc)) {
    return 
"text/plain";
  }
  return 
0;
}

// image convertion functions

function wait_convert_proc()
{
  global 
$sem,$use_sem;

  
register_shutdown_function("end_convert_proc");
  if(
$use_sem) {
    
$sem=sem_get(31337);
    
sem_acquire($sem);
  }
}

function 
end_convert_proc()
{
  global 
$sem,$use_sem;
  if(
$use_sem) {
    
sem_release($sem);
  }
  
register_shutdown_function("");
}

function 
convert_image($sourcepic,$destpic,$res,$quality)
{
  global 
$my_convert_path,$thumb_generator;

  if (
get_sound_type($sourcepic)) {
    
copy("icons/sound.gif"$destpic);
    return;
  }
  else if (
get_movie_type($sourcepic)) {
    
copy("icons/movie.gif"$destpic);
    return;
  } else if (
get_text_type($sourcepic)) {
    
copy("icons/text.gif"$destpic);
    return;
  }

  
wait_convert_proc();

  if(
$thumb_generator=="convert") {
    @
exec($my_convert_path[0]." -geometry ".$res." -quality ".$quality." \"".$sourcepic."\" \"".$destpic."\"");
  } else if(
$thumb_generator=="gd") {
    if(
eregi("\.(jpg|jpeg)$",$sourcepic))
      
$im=imagecreatefromjpeg($sourcepic);
    else if (
eregi("\.png$",$fn))
      
$im=imagecreatefrompng($createfn);
    if (
$im != "") {
      
$dims=explode("x",$res);
      
$newh=$dims[1];
      
$neww=$newh/imagesy($im) * imagesx($im);
      if (
$neww imagesx($im)) {
        
$neww=imagesx($im);
        
$newh=imagesy($im);
      }
      if (
$neww $dims[0])
      {
        
$neww=$dims[0];
        
$newh=$neww/imagesx($im) * imagesy($im);
      }
      
$im2=ImageCreate($neww,$newh);
      
ImageCopyResized($im2,$im,0,0,0,0,$neww,$newh,imagesx($im),imagesy($im));
      if (
eregi("\.(jpg|jpeg)$",$sourcepic)) imagejpeg($im2,$destpic,$quality);
      else if (
eregi("\.png$",$fn)) imagepng($im2,$destpic);
      
ImageDestroy($im);
      
ImageDestroy($im2);
     } else {
      
debug_image("Error loading file!");
     }
  }

  
end_convert_proc();
}

//show debug info in image format
function debug_image($str){
    
$im ImageCreate (15050); /* Create a blank image */
    
$bgc ImageColorAllocate ($im255255255);
    
$tc  ImageColorAllocate ($im000);
    
ImageFilledRectangle ($im0015030$bgc);
    
/* Output an errmsg */
    
ImageString ($im155$str$tc);
    
ImageJPEG($im);
}

// comments functions

function get_nb_comments($id)
{
  global 
$sDB,$nConnection,$sTableComments;
  
$cmd="select * from ".$sTableComments." where pic_name='".addslashes($id)."'";
  
$res=mysql_db_query($sDB,$cmd,$nConnection);
  return 
mysql_num_rows($res);
}

function 
display_comments($id)
{
  global 
$sDB,$nConnection,$sTableComments,$admin,$admin_light;
  global 
$txt_comments,$txt_add_comment,$txt_comment_from,$txt_comment_on,$txt_photos;
?>
  <table width="100%">
  <tr><td align=left>
<? if(get_nb_comments($id)>0) { ?> 
  <u><? echo $txt_comments ?></u>
<? ?>
  </td><td align=right>
  <a href="" onClick='enterWindow=window.open("?id=<? echo rawurlencode($id?>&addcomment=1","commentadd","width=400,height=260,top=250,left=500"); return false'><? echo $txt_add_comment ?></a>
  </td></tr>
  </table>
  <br>
<?
  $cmd
="select * from ".$sTableComments." where pic_name='".addslashes($id)."'";
  
$res=mysql_db_query($sDB,$cmd,$nConnection);
  while(
$row=mysql_fetch_array($res))
  {
     echo 
"<span class=\"small\">".$txt_comment_from."<b>".htmlentities($row["user"])."</b>".$txt_comment_on.$row["datetime"];
     if(
$admin)
       echo 
" | <a href=\"?display=".rawurlencode($id)."&delcom=".$row["id"]."\">Delete</a>";
     echo 
"</span><br>";
     echo 
nl2br(htmlentities($row["comment"]))."<br>";
     echo 
"<br>";
  }
}


// logout ?

if($logout) {
  
add_log("'".$_SESSION['sess_login']."' log out");
  
$sess_login=$_SESSION['sess_login'];
  unset(
$_SESSION['sess_login'],$sess_login);
  
$sess_pass=$_SESSION['sess_pass'];
  unset(
$_SESSION['sess_pass'],$sess_pass);  
  
header("Location: ".$SCRIPT_NAME);
  exit;
}

// logging in ?

unset($user_row);
if(
$startlogin) {
  
$sess_login=$_SESSION['sess_login'];
  unset(
$_SESSION['sess_login'],$sess_login);
  
$sess_pass=$_SESSION['sess_pass'];
  unset(
$_SESSION['sess_pass'],$sess_pass);  
  
$cmd="select * from ".$sTableUsers." where login='$user' and pass='$pass'";
  
$res mysql_db_query($sDB,$cmd,$nConnection);
  if(!
$res || mysql_num_rows($res)==) {
   
// FIXME display somme msg !!
   
$error_login=1;
   echo 
"<br>! Wrong login !<br>";
   
add_log("Wrong login '$user'/'$pass'");
  } else {
    
$logged=1;
    
$user_row=mysql_fetch_array($res);
    
$_SESSION['sess_login']= $user_row['login'];    
    
$_SESSION['sess_pass']= $user_row['pass']; 
    
add_log("'".$_SESSION['sess_login']."' logged in");
  }
} else if(
$_SESSION['sess_login'] && $_SESSION['sess_pass']) { 
  
$cmd="select * from ".$sTableUsers." where login='".$_SESSION['sess_login']."' and pass='".$_SESSION['sess_pass']."'";
  
$res mysql_db_query($sDB,$cmd,$nConnection);
  if(
$res && mysql_num_rows($res)>) {
    
$logged=1;
    
$user_row=mysql_fetch_array($res);
  }
}

if (!
$loggedsession_destroy();

/*else
  echo "<br>Not logged ! (".$_SESSION['sess_login'].")<br>"; */

$admin=($user_row["seclevel"]==999);
$admin_light=($user_row["seclevel"]==998);

// pic rating update ?

if ($display&&$rating) {
    if (!
already_rated($display) && ($rating>0) && ($rating<=10)) 
  {
    if(
$_SESSION['sess_login']) 
      
$cmd="insert into $sTableRatings (datetime, pic_name, login, rating) values (now(), '$display', '".$_SESSION['sess_login']."', $rating)";
    else
      
$cmd="insert into $sTableRatings (datetime, pic_name, ip, rating) values (now(), '$display', '".getenv("REMOTE_ADDR")."', $rating)";
        
mysql_db_query($sDB,$cmd,$nConnection);
    }
}

// pic comment update ?

if($updpic=="1"&&($admin || $admin_light)) {
  
$cmd="replace into $sTable values('$display','$dsc','$lev')";
  
mysql_db_query($sDB,$cmd,$nConnection);
}

// dir level update ?

if($dirlevelchange&&$admin) {
  
$cmd="replace into $sTable values('$dir','','$dirlevel')";
  
mysql_db_query($sDB,$cmd,$nConnection);
}

if(
$display$display=reformat($display);
if(
$display)
{
  
// Is it a dir to 'display' ?
  
if ($display{strlen($display)-1} == '/')
  {
    
$dir=$display;
    
$display='';
  }
}

if(
$displaypic$displaypic=reformat($displaypic);
if(
$displaymov$displaymov=reformat($displaymov);
if(
$preview$preview=reformat($preview);
if(
$display$dir=dirname($display);
if(
$dir$dir=reformat($dir);

if(
substr($root_dir,-1)!='/'$root_dir.='/';
if(
$dir && substr($dir,-1)!='/'$dir.='/';

// dir creation ?

if($dircreate&&$admin) {
  
mkdir($root_dir.$dir.$createdirname,0755);
}

// file uploaded ?

if($admin&&$picupload&&$picuploadname!="none") {
  
Exec("cp -f \"$picuploadname\" \"".$root_dir.$dir.$picuploadname_name."\"");
  
Exec("chmod 755 \"".$root_dir.$dir.$picuploadname_name."\"");
}

// adding comment ?

if($addingcomment && (trim($comment) || trim($user))) {
  
$picname=reformat($picname);
  
$cmd="insert into ".$sTableComments." values(0,'".addslashes($picname)."','$comment','".date("Y-m-d H:i:s")."','$user','$REMOTE_ADDR')";
  
mysql_db_query($sDB,$cmd,$nConnection);
//  if ($picname{strlen($picname)-1} != '/')
//    echo "<html><script language=\"javascript\">window.opener.location=\"?display=".rawurlencode($picname).";window.close();</script></html>";
//  else
    
echo "<html><script language=\"javascript\">window.opener.location.reload();window.close();</script></html>";  
  exit;
}

// deleting comment ?

if($delcom&&$admin) {
  
$cmd="delete from ".$sTableComments." where id=$delcom";
  
mysql_db_query($sDB,$cmd,$nConnection);
  
$picname=reformat($picname);
}

// picture displaying ?

if($displaypic)
{
 if (
get_level($displaypic)<=(int)$user_row["seclevel"]) 
 {
   
header("Content-type: image/jpeg");
   if(
filesize($root_dir.$displaypic)>=$lr_limit && !$non_lr) {
    
// switch to lr_mode
    
$lrdir=$root_dir.dirname($displaypic)."/.thumbs";
    
$lrfile=$lrdir."/lr_".basename($displaypic);
    if(!
file_exists($lrfile)) {
      if(!
is_dir($lrdir)) mkdir($lrdir,0755);
      
convert_image($root_dir.$displaypic,$lrfile,$lr_res,$lr_quality);
    }
    
readfile($lrfile);
    } else 
readfile($root_dir.$displaypic);
    exit;
  }
  else
 {
   echo 
"Your security level is too low !";
 }
}

if(
$preview) {
  
header("Content-type: image/jpeg"); 
  
$prdir=$root_dir.dirname($preview)."/.thumbs";
  
$prfile=$prdir."/thumb_".basename($preview);
  if(!
file_exists($prfile)) {
    if(!
is_dir($prdir)) mkdir($prdir,0755);
    
convert_image($root_dir.$preview,$prfile,$thumb_res,$thumb_quality);
  }
  
readfile($prfile);
  exit;
}

// random image?

if($random) {
  
$level=0;
  if(
$logged$level=(int)$user_row["seclevel"];
  
$ok=0;
  
srand ((double) microtime() * 1000000);
  
exec('find '.$root_dir.' -type f -print | egrep -i "\.(jpg|jpeg|gif|png)$" | grep -v ".thumbs/"',$find_ar);

  
$l=sizeof($find_ar);
  for(
$try=0;!$ok && $try<32;$try++) {
    
$pickline=substr($find_ar[rand(0,$l)],strlen($root_dir));
    
$ok = (get_level($pickline)<=$level);
  }
  
$display $pickline;
  
$dir substr($display,0,strrpos($display,"/"))."/";
}

// generate all thumbnails/low res

if($genall&&$admin) { 
//if($genall) { 
  
echo "Generating all missing thumbnails/low res pictures: (be patient)<br><br>";
  
flush();

  
$gen_lr=0$gen_th=0;
  
exec('find '.$root_dir.' -type f -print | egrep -i "\.(jpg|jpeg|gif|png)$" | grep -v ".thumbs/"',$find_ar);
  for(
$i=0;$find_ar[$i];$i++) {
    
$pic=substr($find_ar[$i],strlen($root_dir));
    
$lrdir=$root_dir.dirname($pic)."/.thumbs";
    if(!
is_dir($lrdir)) mkdir($lrdir,0755);

    
// low res check
    
if(filesize($root_dir.$pic)>=$lr_limit) {
      
$lrfile=$lrdir."/lr_".basename($pic);
      if(!
file_exists($lrfile)) {
        echo 
"Generating low res picture for $pic<br>";
        
flush();
        
convert_image($root_dir.$pic,$lrfile,$lr_res,$lr_quality);
        
$gen_lr++;
      }
    }

    
// thumbnail check
    
$prfile=$lrdir."/thumb_".basename($pic);
    if(!
file_exists($prfile)) {
      echo 
"Generating thumbnail picture for $pic<br>";
      
flush();
      
convert_image($root_dir.$pic,$prfile,$thumb_res,$thumb_quality);
      
$gen_th++;
    }
  }

  echo 
"<br>";
  echo 
"Generated <b>$gen_lr</b> low res pictures and <b>$gen_th</b> thumbnails.<br>";
  echo 
"Your library has <b>".sizeof($find_ar)."</b> pictures.<br>";

  exit;
}

// pic delete
if($updpic=="del"&&$admin) {
  
$cmd="delete from $sTable where name='$display'";
  
$db=mysql_db_query($sDB,$cmd,$nConnection);
  
$cmd="delete from $sTableComments where pic_name='$display'";
  
$db=mysql_db_query($sDB,$cmd,$nConnection);
  
$filename=$root_dir.$display;
  
$thumbname=$root_dir.dirname($display)."/.thumbs/thumb_".basename($display);
  
$lrname=$root_dir.dirname($display)."/.thumbs/lr_".basename($display);
  if (
file_exists($filename))unlink($filename);
  if (
file_exists($thumbname))unlink($thumbname);
  if (
file_exists($lrname))unlink($lrname);
  
//jump back to the directory after deleting the pic
  
$dir=dirname($display);
  
header("Location: ./?dir=$dir");
  exit;
}

// test if display is video or sound
if ($displaymov) {
  if ((
$type get_movie_type($displaymov)) || ($type get_sound_type($displaymov)) || ($type get_text_type($displaymov))) {
    
header("Content-type: ".$type);
    
header("Content-Disposition: inline; filename=".basename($displaymov));
    
readfile($root_dir.$displaymov);
    return;
  }
}
/*
if ($display) {
  if (($type = get_movie_type($display)) || ($type = get_sound_type($display)) || ($type = get_text_type($display))) {
    header("Content-type: ".$type);
    header("Content-Disposition: inline; filename=".basename($display));
    readfile($root_dir.$display);
    return;
  }
}
*/
?>

<? include "header.inc.php" ?>

<? // Login form

if($login) {
?>
<form method=POST action="index.php">
<? echo $txt_login_form_login ?> <input name="user" size=20><br>
<? echo $txt_login_form_pass ?> <input type="password" name="pass" size=20> 
<input type="hidden" name="startlogin" value="1">
<input type="hidden" name="dir" value="<? echo $dir ?>">
<input type="submit" value="Login">
</form> 
<?
  
include "footer.inc.php";
  exit;
} else if(
$create&&$admin) {  // Create dir form
echo "Current directory : ".$dir."<br>";
?>
<form method=POST action="index.php">
Directory to create: <input name="createdirname" size=50><br>
<input type="hidden" name="dircreate" value="1">
<input type="hidden" name="dir" value="<? echo $dir ?>">
<input type="submit" value="Create">
</form> 
<?
  
include "footer.inc.php";
  exit;
} else if(
$upload&&$admin) {  // Create dir form
echo "Current directory : ".$dir."<br>";
?>
<form method=POST action="index.php" ENCTYPE="multipart/form-data">
File to upload: <INPUT TYPE=FILE NAME="picuploadname" SIZE=24 MAXLENGTH=80>
<INPUT TYPE="SUBMIT" VALUE="Upload">
<input type="hidden" name="picupload" value="1">
<input type="hidden" name="dir" value="<? echo $dir ?>">
</form> 
<?
  
include "footer.inc.php";
  exit;
} else if(
$addcomment) { // (little "add comment" popup window)
  
$id=reformat($id);
  
?>
    <form name="blah" method=POST>
    <? 
    
if ($_SESSION["sess_login"])
    {
      
$login_name $user_row['login'];
      echo 
$txt_comment_from.$login_name."\n";
      echo 
"<font face=\"Courier\" size=1><input type=hidden name=user value=\"$login_name\" size=30></font><br>";
    }
    else
    {
      echo 
$txt_comment_form_name;
      echo 
"<font face=\"Courier\" size=1><input type=text name=user size=30></font><br>";
    }
    echo 
$txt_comment_form_comment ?> <br><font face="Courier" size=1><textarea name=comment cols=40 rows=3></textarea></font><br>
    <br>
    <input type=submit value="<? echo $txt_add_comment ?>">
    <input type=hidden name=addingcomment value="1">
    <input type=hidden name=picname value="<? echo $id ?>">
    </form>
    <script language="javascript">document.blah.user.focus();</script>
  <?
  
include "footer.inc.php";
  
  exit;
} else if(
$lastcomments) { // display last added comments
  
echo "<u>".$txt_last_comments."</u><br>";
  echo 
"<br>";
  
$cmd="select * from ".$sTableComments." order by datetime desc";
  
$res=mysql_db_query($sDB,$cmd,$nConnection);
  
$i=0;
  while((
$row=mysql_fetch_array($res)) && $i<20)
  {
    if(
get_level($row["pic_name"])>(int)$user_row["seclevel"]) continue;
    echo 
"<span class=\"small\">";
    echo 
$row["datetime"]." by <b>".htmlentities($row["user"])."</b> : </span>";
    
$comment=get_comment($row["pic_name"]);
    if(
trim($comment)==""$comment=$row["pic_name"];
    echo 
"<a href=\"?display=".rawurlencode($row["pic_name"])."\">".$comment."</a>";
    echo 
"<br>";
    
$i++;
  }
  echo 
"<br>";
  echo 
"<span class=\"small\"><a href=\"?dir=\">Go back</a></span><br>";
  echo 
"<br>";
  include 
"footer.inc.php";
  exit;
} else if(
$topratings) { // display top ratings
  
echo "<u>Top ".$nb_top_rating." :</u><br>";
  echo 
"<br>";
  
$cmd="select *,avg(rating) as rat from ".$sTableRatings." group by pic_name order by rat desc";
  
$res=mysql_db_query($sDB,$cmd,$nConnection);
  
$i=0;
  while((
$row=mysql_fetch_array($res)) && $i<$nb_top_rating)
  {
    if(
get_level($row["pic_name"])>(int)$user_row["seclevel"]) continue;
    echo 
"<span class=\"small\">".($i+1).": </span>";
    
$comment=get_comment($row["pic_name"]);
    if(
trim($comment)==""$comment=$row["pic_name"];
    echo 
"<a href=\"?display=".rawurlencode($row["pic_name"])."\">".$comment."</a>";
    echo 
" <span class=\"small\">(<b>".sprintf("%.1f"$row["rat"])."</b>)</span>";
    echo 
"<br>";
    
$i++;
  }
  echo 
"<br>";
  echo 
"<span class=\"small\"><a href=\"?dir=\">Go back</a></span><br>";
  echo 
"<br>";
  include 
"footer.inc.php";
  exit;
}

?>

<?

  
if(get_level($dir)>(int)$user_row["seclevel"]) {
    if (!
$logged) {
      
// back to index 
    
echo "<span class=\"big\"><center><br><br>Access denied, maybe your session has expired.<br><br>You will be redirect automatically to the main page<br><br> If nothing happened you can click <a href=\"index.php?dir=&login=1\">here</a></center></span>";
    echo 
"<meta HTTP-EQUIV=\"Refresh\" CONTENT=\"1;URL=index.php?dir=&login=1\">";
    }
    else {
      echo 
"You should not be there: your security level is too low !";
      echo 
"<meta HTTP-EQUIV=\"Refresh\" CONTENT=\"1;URL=index.php\">";
    }
    exit; 
// antihack :)
  
}
  
// scan dir

$nb_dirs=0$nb_files=0;
$dirs_nbf[0]=0;
$dirs[0]=""$files[0]="";
$dh=dir($root_dir.$dir);
$total_files=0;
while (
$file=$dh->read()) {
  if(
substr($file,0,1)==".") continue;
//  if(substr($file,-3)=="_lr") continue;
//  if(substr($file,-6)=="_thumb") continue;
  
if(substr($file,-8)=="_comment") continue;
  if(
is_dir($root_dir.$dir.$file)) {
      
// directory
    
if(get_level($dir.$file."/")<=(int)$user_row["seclevel"])
    {
      
$dirs[$nb_dirs++]=$file;
      
$dirs_nbf[$nb_dirs-1] = get_nb_photos($dir.$file."/", (int)$user_row["seclevel"], 0);
      
$total_files += $dirs_nbf[$nb_dirs-1];
    }
  } else {
    
// file
    
$ext1 substr(strtolower($file),-4);
    
$ext2 substr(strtolower($file),-5); 
    
// Only display pic, avi, sound and txt 
    
if($ext1!=".jpg" && $ext2!=".jpeg" && $ext1!=".mov" 
    
&& $ext1!=".avi" && $ext1!=".asf" && $ext1!=".wmv"
    
&& $ext1!=".mpg" && $ext1!=".mpeg" && $ext1!=".mpg" && $ext1!=".m2v"
    
&& $ext1!=".txt") continue;
    if(
get_level($dir.$file)<=(int)$user_row["seclevel"])
    {
      
$files[$nb_files++]=$file;
      
$total_files ++;
    }
  }
}
$dh->close();
// NO sort .. because we use dirs_nbf[0..N] FIXME
//sort($dirs);

if (is_file($root_dir.$dir."/.desc"))
  
rsort($files);
else
  
sort($files);

?>

<table width="100%"  border="0" cellspacing="0" cellpadding="0">
<tr><td align="left" width="80%">
<? 
  
// display current dir

      
if(!$dir) echo "<a href=\"index.php\">".$txt_root_dir."</a>/";
else echo 
"<a href=\"?dir=\">".$txt_root_dir."</a>/";
$alldirs=explode("/",$dir);
$alldirtmp="";
for(
$i=0;$alldirs[$i];$i++) {
  
$alldirtmp.=$alldirs[$i]."/";
  if(
$alldirs[$i+1] || $display) echo "<a href=\"?dir=".rawurlencode($alldirtmp)."\">";
  echo 
$alldirs[$i];
  if(
$alldirs[$i+1] || $display) echo "</a>/";
}
echo 
" (".$total_files." ".$txt_photos.")";
echo 
"<br>";

?>
</td><td align="right">
<? if(!$logged) { ?>
<a href="?dir=<? echo rawurlencode($dir?>&login=1"><? echo $txt_login ?></a>
<? } else {
  echo 
$user_row['login']." - "
  if(
$admin) {
    echo 
"<a href=\"?dir=".rawurlencode($dir)."&create=1\">create dir</a> - <a href=\"?dir=".rawurlencode($dir)."&upload=1\">upload</a> - ";
    echo 
"<a href=\"?genall=1\">gen all pics</a> - ";
  } 
?>
<a href="?logout=1">logout</a> - <a href="?topratings=1"><? echo $txt_topratings ?></a> - <a href="?lastcomments=1"><? echo $txt_lastcomments ?></a>
<? ?>
<? 
if($logged && $txt_random_pic) { ?>
- <a href="?random=1"><? echo $txt_random_pic ?></a>
<? ?>
</td></tr>
</table>

<?
  
// display dirs

for($i=0;$i<$nb_dirs;$i++) {
    echo 
"&nbsp;&nbsp;<a href=\"?dir=".rawurlencode($dir.$dirs[$i])."\">".$dirs[$i]." (".$dirs_nbf[$i].")</a><br>\n";
}
?>

<?
if($admin&&$dir&&!$display) {
  echo 
"<form method=POST>Directory security level: <input name=\"dirlevel\" value=\"".get_level($dir)."\" size=4>";
  echo 
"<input type=hidden name=dir value=\"".$dir."\">";
  echo 
"<input type=hidden name=dirlevelchange value=\"1\">";
  echo 
" <input type=submit value=\"Change\"></form>";
}
?>

<br>

<?

// display .welcome message if it exists

if(is_file($root_dir.$dir.".welcome") && !$display) {
  echo 
"<font color=".$welcomecolor."><pre>";
  
system("cat \"".$root_dir.$dir.".welcome\"");
/*  exec("cat ".$root_dir.$dir.".welcome",$welcome);
  for($i=0;$i<sizeof($welcome);$i++)
    echo $welcome[$i]."<br>";*/
  
echo "</pre></font>";
//  echo "<br>";
}

?>

<? if(!$display) { ?>
<table border=0>
<?
  
// display the directory content

function echo_pic($i)
{
  global 
$root_dir,$dir,$files,$sDB,$nConnection,$remote_link,$txt_list_comments,$txt_list_rating,$comments_on_dir;

  
// gch hack: use remote_pic_link
  
if ($remote_link!="")
  {
    
// convert the path to an url
    
$dir_url ''
    
$pathbits explode('/'$dir); 
    foreach(
$pathbits as $dir_tmp
    {
      
$dir_url $dir_url.rawurlencode($dir_tmp)."/";
    }
    if (
get_movie_type($dir.$files[$i]))
       echo 
"<td><a href=\"".$remote_link.$dir_url.rawurlencode($files[$i])."\"><img src=icons/movie.gif border=0></a></td>";
    else
      echo 
"<td><a href=\"?display=".rawurlencode($dir.$files[$i])."\"><img src=".$remote_link.$dir_url.".thumbs/thumb_".rawurlencode($files[$i])." border=0></a></td>";    
  }
  else
  {
    echo 
"<td><a href=\"?display=".rawurlencode($dir.$files[$i])."\"><img src=\"?preview=".rawurlencode($dir.$files[$i])."\" border=0></a></td>";
  }
  
$comment=get_comment($dir.$files[$i]);
  if(
$comment==""$comment=$files[$i];
  
$comment_sizeget_movie_size($dir.$files[$i]);
  echo 
"<td><a href=\"?display=".rawurlencode($dir.$files[$i])."\">".nl2br(htmlentities($comment)).$comment_size."</a>";
  if((
$nbc=get_nb_comments($dir.$files[$i]))>0)
  {
    echo 
"<br><span class=\"small\">".$nbc." ".$txt_list_comments;
    if (
$nbc>1)
      echo 
"s";
    echo 
"</span>";
  }
  if((
$rtg=get_rating($dir.$files[$i]))!==false)
    echo 
"<br><br><span class=\"small\">".$txt_list_rating." <b>".sprintf("%.1f"$rtg)."</b></span>";
  echo 
"</td>";
}

if(!
$startpic$startpic=0;

echo 
"<tr><td width=300><table border=0>";
for(
$i=$startpic;$i<$nb_files && $i<($startpic+$nb_pic_max);$i++) {
    echo 
"<tr>";
    
echo_pic($i);
    echo 
"</tr>";
}
echo 
"</table></td><td width=50% valign=top><table border=0>";
$startpic2=$i;
for(;
$i<$nb_files && $i<($startpic2+$nb_pic_max);$i++) {
    echo 
"<tr>";
    
echo_pic($i);
    echo 
"</tr>";
}
echo 
"</table></td></tr>";

echo 
"</table>";

echo 
"<center>";
if(
$startpic!=0) {
  
$a=$startpic-($nb_pic_max*2);
  if(
$a<0$a=0;
  echo 
"<a href=\"?dir=".rawurlencode($dir)."&startpic=".$a."\">".$txt_previous_page."</a> ";
}
// Display the pages list
//echo "<br><br>";
$ii 0;
$cur_page 0;
if (
$nb_files>($nb_pic_max*2))
  while (
$ii<$nb_files)
  {
    if (
$ii == $startpic)
      echo 
"[".$cur_page."]";
    else
      echo 
"<a href=\"?dir=".rawurlencode($dir)."&startpic=".$ii."\">[".$cur_page."]</a>";
    
$ii += ($nb_pic_max*2);
    
$cur_page ++;
  }

if(
$i!=$nb_files) {
  echo 
"<a href=\"?dir=".rawurlencode($dir)."&startpic=".$i."\">".$txt_next_page."</a>";
}

/* $max_pages_display = 2;
 $nb_pages = (int)(0.5+($nb_files/($nb_pic_max*2));
 $cur_page = $startpic / (2*$nb_pic_max);
 $min_p = abs($cur_page-$nb_pages_list);
 $max_p = $cur_page+$nb_pages_list;
 if ($max_p>nb_pages)
 $max_p = $cur_pag
 for($i=min_p;$i<max_p;$i++)
 {
   echo "<a href=\"?dir=".rawurlencode($dir)."&startpic=".$i."\">".$i."</a>";
} */
echo "</center>";

// Directory comment
echo"</center><br>";
if (
$comments_on_dir && $nb_files)
  
display_comments($dir);

?>

<? } else { 

   
// display the picture

for($i=0;$i<$nb_files && basename($display)!=$files[$i];$i++);

echo 
"<center>";
echo 
" (".($i+1)."/".$nb_files.")<br> <br>";
echo 
"<span class=\"big\"><b>";
$comment=get_comment($display);
if(
$comment!="") echo nl2br(htmlentities($comment)); else echo basename($display);
echo 
"</b></span><br>";
if(
$i!=0) echo "<a href=\"?display=".rawurlencode($dir.$files[$i-1])."\">".$txt_previous_image."</a> ";
if(
filesize($root_dir.$display)>=$lr_limit && !$non_lr) echo " <a href=\"?display=".rawurlencode($display)."&non_lr=1\">".$txt_hires_image."</a> ";
if(
filesize($root_dir.$display)>=$lr_limit && $non_lr) echo " <a href=\"?display=".rawurlencode($display)."\">".$txt_lores_image."</a> ";
//if($files[$i+1]) echo "<a href=\"?display=".rawurlencode($dir.$files[$i+1])."\">".$txt_next_image."</a>";
if ($files[$i+1])
{
  
$n $i+1;
  while (
$files[$n] && (get_sound_type($dir.$files[$n]) || get_text_type($dir.$files[$n]))) {
    
$n++;
  }
  if(
$files[$n]) echo "<a href=\"?display=".rawurlencode($dir.$files[$n])."\">".$txt_next_image."</a>";
}
echo 
"<br>";
$cur_page = (int)($i / (2*$nb_pic_max))*(2*$nb_pic_max);
echo 
"<a href=\"?dir=".rawurlencode($dir)."&startpic=".$cur_page."\">".$txt_return_list."</a><br>";

if (
$use_rating) {
    
$pic_rating=get_rating($display);
    if (
$pic_rating===false) echo $txt_no_rating; else echo $txt_pic_rating."<b>".sprintf("%.1f"$pic_rating)."</b>";
    echo 
"<br>";
    if (!
already_rated($display)) {
        
$rate_url="?display=".rawurlencode($display);
        if (
strpos($rate_url"?")!==false$rate_url.="&rating="; else $rate_url.="?rating=";
        echo 
"<select onChange='document.location.href=\"".$rate_url."\" + this.options[this.selectedIndex].value'>";
        echo 
"<option value='null'>".$txt_option_rating;
        for (
$a=1;$a<=10;$a++) echo "<option value='$a'>$a</option>";
        echo 
"</select>";
    }
}

echo 
"<br><br>";

if(
$admin ||$admin_light)
?>
<form name="updateform">
<table cellspacing=1>
<tr><td colspan=2 align=center>
<?echo $txt_description ?><br>
<textarea name="dsc" cols=60 rows=3><? echo get_comment($display?></textarea><br>
</td></tr>
 <tr><td align=left>
         <?
if ($admin_light)
 echo 
"<input type=hidden name=\"lev\" value=\"".get_level($display)."\">";   
else
{
 echo 
$txt_sec_lev;
 echo 
"<input name=\"lev\" value=\"".get_level($display)."\" size=4>";
}
?>         <input type=hidden name=display value="<? echo $display ?>">
         <input type=hidden name=updpic value="1">
         <input type=submit value="<?echo $txt_change?>">
<?
 
if ($admin)
 { 
?>
 </td><td align=right>
         <input type=button value="<?echo $txt_delete_photo?>" onclick="javascript:if(confirm('Are you sure to delete?')){document.updateform.updpic.value='del';document.updateform.submit();}">
 </td></tr>
<? }
?>
</table>
</form>
<? }

// display comment message if it exists

if(is_file($root_dir.$display."_comment")) {
  echo 
"<font color=".$welcomecolor."><table><tr><td><pre>";
  
system("cat \"".$root_dir.$display."_comment\"");
  echo 
"</pre></td></tr></table></font>";
}

if(
get_level($display)<=(int)$user_row["seclevel"]) 
{
  
// movie & co
  
  
if (get_movie_type($display))
  {
    if (
$remote_link_high!="")
      echo 
"<a href=\"#\" OnClick=\"window.open('".$remote_link_high.$dir_url.rawurlencode($files[$i])."','video');\"><img src=icons/movie.gif border=0>".get_movie_size($display)."</a>";      
    else
      echo 
"<a href=\"#\" OnClick=\"window.open('?displaymov=".rawurlencode($display)."','video');\"><img src=icons/movie.gif border=0>".get_movie_size($display)."</a>";
  }
  else
  {
    
// gch hack: use remote_link
    
if ($remote_link_high!="" || $remote_link!="")
    {
      
// convert the path to an url
      
$dir_url ''
      
$pathbits explode('/'$dir); 
      foreach(
$pathbits as $dir_tmp
      {
        
$dir_url $dir_url.rawurlencode($dir_tmp)."/";
      }
      if (
filesize($root_dir.$dir.$files[$i])>=$lr_limit && !$non_lr)
      {
        if (
$remote_link!="")
          echo 
"<img src=".$remote_link.$dir_url.".thumbs/lr_".rawurlencode($files[$i])." border=0><br>";    
        else
          echo 
"<img src=\"?displaypic=".rawurlencode($display)."&non_lr=".$non_lr."\" border=0><br>";
      }
      else
      {
        if (
$remote_link_high!="")
          echo 
"<img src=".$remote_link_high.$dir_url.rawurlencode($files[$i])." border=0><br>";    
        else
        { 
          if (!
$non_lr && $remote_link!="" && $remote_4nolr)
            echo 
"<img src=".$remote_link.$dir_url.rawurlencode($files[$i])." border=0><br>";    
          else
            echo 
"<img src=\"?displaypic=".rawurlencode($display)."&non_lr=".$non_lr."\" border=0><br>";
        }
      }
    }
    else  
    {
      echo 
"<img src=\"?displaypic=".rawurlencode($display)."&non_lr=".$non_lr."\" border=0><br>";
    }
  }

echo
"</center><br>";
display_comments($display);

?>

<? include "footer.inc.php" ?>