<?php
  
function getstr($get$default false) {
    if(isset(
$_GET[$get]))
      return 
$_GET[$get];

    return 
$default;
  }

/*
  function str2int($x) {
    $r = '(char) ';
    for( $i=0 ; $i<strlen($x) ; $i++)
      $r .= ord($x[$i]).' ';

    return $r;
  }
*/

  // Do sort of folders first, then files -- all in natural order
  
function dirsort($a$b) {
    
$x is_dir($a);
    
$z is_dir($b);
    if(
$x != $z) return $x?-1:1;

    return 
strnatcasecmp($a$b);
  }

  function 
deldir($dir) {
    foreach(array(
'','/.thumb','/.scale600','/.scale800','/.scale1024') as $prefix)
      
rmdir(SYSTEM_PATH.$prefix.$dir);
  }

  function 
delfile($file) {
    foreach(array(
'','/.thumb','/.scale600','/.scale800','/.scale1024') as $prefix) {
      
$postfix $prefix=='/.thumb'?'.jpg':'';
      
$f SYSTEM_PATH.$prefix.$file.$postfix;
      if(
is_file($f)) unlink($f);
    }
  }

  function 
deleteall($file) {
    if(
$file == '') {
      
deleteall('.');
      
      if(
is_dir(FILE_PATH))
        return 
GET_PATH;

      
$tmp explode('/',GET_PATH);
      
array_pop($tmp);
      
array_pop($tmp);
      return 
implode('/',$tmp).'/';
    }

    if(
is_dir(FILE_PATH.$file)) {
      if(
$file == '.'$file '';
      
chdir(FILE_PATH.$file);
      
$x glob('*');
      foreach(
$x as $e) {
        if(
is_dir($e)) {
          if(!
DELETE_RECURSE) continue;
          
deleteall($file.$e.'/');
          
deldir(GET_PATH.$file.$e);
        } else {
          
deleteall($file.$e);
        }
      }
      
deldir(GET_PATH.$file);

    } else {
      
delfile(GET_PATH.$file);
    }
  }

  
// Utility function for admin -- rename all copies of a file or folder
  // renameall('file', 'newfile');
  // renameall('', 'newfolder');
  
function renameall($from$to) {
    if(!empty(
$from) && $from != GET_PATH) {
      
$parent GET_PATH;
    } elseif(
GET_PATH == '/') {
      return 
false;
    } elseif(
GET_PATH == $from) {
      
$tmp explode('/',GET_PATH);
      
array_pop($tmp);
      
$to .= '/'.array_pop($tmp);
      
$parent '';
    } else {
      
$from GET_PATH;
      
$tmp explode('/',GET_PATH);
      
array_pop($tmp);
      
array_pop($tmp);
      
$parent implode('/',$tmp);
    }
  
error_log($from.' => '.$to);

    if(
$parent!='' && (!file_exists(SYSTEM_PATH.$from) || file_exists(SYSTEM_PATH.$parent.$to)))
      return 
false;

    
$postfix is_dir(SYSTEM_PATH.$from) ? '':'.jpg';

    foreach(array(
'','/.thumb','/.scale600','/.scale800','/.scale1024') as $prefix) {
      
$s SYSTEM_PATH.$prefix.$from.($prefix=='/.thumb'?$postfix:'');
      
$t SYSTEM_PATH.$prefix.$parent.$to.($prefix=='/.thumb'?$postfix:'');

error_log($s.' => '.$t);
      if(
file_exists($s) && !file_exists($t)) rename($s$t);
    }

    return 
true;
  }

  function 
getint($get$default false) {
    if(isset(
$_GET[$get]) && is_numeric($_GET[$get]))
      return 
$_GET[$get];

    return 
$default;
  }

  function 
redirect($href) {
    
error_log('Redirect: '.$_SERVER['REQUEST_URI'].' => '.$href);
    
header('Location: '.$href);
    die();
  }

  function 
getcomments($image) {
    global 
$db;
    
$res =& $db->query('SELECT * FROM comments WHERE image=? ORDER BY posted ASC'$image);
    if(
DB::isError($res))
      return 
false;

    
$return = array('count'=>$res->numRows(),'comments'=>array());

    while(
$comment =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
      
$return['comments'][] =& $comment;
    }

    return 
$return;
  }

  function 
needdir($dir) {
    if(!
is_dir($dir)) {
      if(
is_file($dir)) unlink($dir);
      
mkdir($dir0777true);
    }
  }

  function 
url($mode$target) {

    
// Don't propagate ;foo=bar to direct file links
    
$remember = !($mode == '' && is_file(SYSTEM_PATH.$target));

    if(
$mode == MODE && !strchr($target'/')) {

      if(
MOD_REWRITE) {
        
$href '';
      } else {
        
$href BASE_URL INDEX_PHP GET_PATH;
      }
      
$href .= rawurlencode($target);

      if(
is_dir(FILE_PATH.$target)) {
        
$href .= '/';
      }

    } else {
      if(
MOD_REWRITE) {
        
$href str_replace('%2F','/',rawurlencode($mode.$target));
        if(!empty(
$mode))
          
$href BASE_URL $href;
      } else {
        
$href str_replace('%2F','/',rawurlencode($target));
        if(!empty(
$mode))
          
$href BASE_URL INDEX_PHP $href;
      }
    }

    
$args = array();
    if(!
MOD_REWRITE)
      
$args[] = 'what='.(empty($mode)?MODE:$mode);

    
// remember hidden comments
    
if($remember && isset($_GET['comment']) && $_GET['comment'] == 'hide')
      
$args[] = 'comment=hide';

    
// remember max_scale
    
if($remember && isset($_GET['max_scale']) && $_GET['max_scale'] != DEFAULT_SCALE)
      
$args[] = 'max_scale='.$_GET['max_scale'];

    
// paging settings
    
if(isset($_GET['c'])) $args[] = 'c='.$_GET['c'];
    if(isset(
$_GET['r'])) $args[] = 'r='.$_GET['r'];

    if(
func_num_args() > && func_get_arg(2)!==false) {
      
$uargs func_get_args();
      
array_shift($uargs);
      
array_shift($uargs);
      if(
count($uargs))
        
$args array_merge($args$uargs);
    }

    if(
count($args))
      
$href .= (MOD_REWRITE URL_SEP '?') . join(URL_SEP$args);

    return 
$href;
  }

  function 
template($name,$content) {
    global 
$refresh;

    if(empty(
$_SESSION['templates'][$name]) || $refresh)
      
$_SESSION['templates'][$name] = file_get_contents('.template/'.$name.'.html');

    return 
str_replace(array_keys($content),array_values($content),$_SESSION['templates'][$name]);
  }

  function 
parsenode($node, &$number) {
    if(
is_dir(FILE_PATH.$node)) {
      return array(
        
'image'  => '/.template/folder.png',
        
'supported' => true,
        
'text'   => 'click to enter folder...',
      );
    } elseif(
is_file(FILE_PATH.$node)) {

      if(
is_file(SYSTEM_PATH.'/.thumb'.GET_PATH.$node.'.none')) {
        
$supported false;
      } else {
        
$thumbfile '/.thumb'.GET_PATH.$node.'.jpg';
        
$supported true;

        if(!
is_file(SYSTEM_PATH.$thumbfile)) {

          
// if we fail creating thumb, file is unsupported; create .none
          
if(!thumbnail(FILE_PATH.$nodeSYSTEM_PATH.$thumbfile)) {
            
touch(SYSTEM_PATH.'/.thumb'.GET_PATH.$node.'.none') or error_log('Unable to create '.SYSTEM_PATH.$thumbfile.'.none');
            
$supported false;
          }
        }
      }

      if(
$supported) {
        
$number++;
        return array(
          
'nr'     => $number,
          
'image'  => str_replace('%2F','/',rawurlencode($thumbfile)),
          
'text'   => 'click to see big image...',
          
'supported' => true,
        );
      } else {
        return array(
          
'image' => '/.template/file.png',
          
'text'  => 'Unsupported file',
          
'supported' => false,
        );
      }
    } else {
      
//error_log('Invalid node: '.GET_PATH.$node);
      
return false;
    }
  }

  
// returns an array of files and folders and a count of thumbnailed files
  
function ls() {
    if(!
is_dir(FILE_PATH)) return false;

    global 
$ignored;
    
$list =& $_SESSION['dir'];
    
$list = array('files' => 0);

    if(
GET_PATH != '/')
      
$list['..'] = array(
        
'image'     => '/.template/parent.png',
        
'supported' => true,
        
'text'      => 'Return to parent folder...',
      );

    
// get folder listing
    
chdir(FILE_PATH);
    
$d glob('*');
    
usort($d,'dirsort');

    
$image_nr 0;
    
$dummy 0;

    
// process folder listing
    
foreach($d as $entry) {
      
// Cases to skip (don't show in the browser) unless we are in admin mode
      
if(MODE != 'admin' 
        
&& ($entry == 'files'
         
|| $entry == 'display'
         
|| $entry == 'browse'
         
|| $entry == 'admin'
         
|| $entry == 'brief'
         
|| $entry == 'robots.txt'
         
|| ( is_file($entry) && isset($ignored[strrchr($entry,'.')]) )
        ))
          continue;

      if(
is_readable($entry))
        
$list[$entry] = parsenode($entry$list['files']);
    }

    
chdir(SYSTEM_PATH);

    return 
true;
  }

  
// image related functions -------------------------------------------------------------------------------------------------------------------------------

  // wrapper to various imagecreatefromxxx() functions - simplifies scale() and thumbnail()
  
function imagecreatefromfile($file) {

    
// nasty little fallback
    
if(!function_exists('exif_imagetype')) 
      return 
imagecreatefromstring(file_get_contents($file));

    switch(
exif_imagetype($file)) {
      case 
IMAGETYPE_GIF:
        return 
imagecreatefromgif($file);
      case 
IMAGETYPE_JPEG:
        return 
imagecreatefromjpeg($file);
      case 
IMAGETYPE_PNG:
        return 
imagecreatefrompng($file);
      case 
IMAGETYPE_WBMP:
        return 
imagecreatefromwbmp($file);
      case 
IMAGETYPE_XBM:
        return 
imagecreatefromxbm($file);

      
//case IMAGETYPE_SWF:
      //case IMAGETYPE_PSD:
      //case IMAGETYPE_BMP:
      //case IMAGETYPE_TIFF_II:
      //case IMAGETYPE_TIFF_MM:
      //case IMAGETYPE_JPC:
      //case IMAGETYPE_JP2:
      //case IMAGETYPE_JPX:
      //case IMAGETYPE_JB2:
      //case IMAGETYPE_SWC:
      //case IMAGETYPE_IFF:
    
}

    return 
false;
  }

  function 
crop($source$cache$x$y$w$h)
  {
    
$image imagecreatefromfile($source);
    
$crop imagecreatetruecolor($w,$h);
    
needdir(dirname($cache));
    
imagecopy($crop$image00$x$y$w$h);
    
imagejpeg($crop$cacheQUALITY);
    
imagedestroy($crop);
    
imagedestroy($image);
  }

  
// make a thumbnail from $source, write it to $target with size THUMB_X by THUMB_Y with padding
  
function thumbnail($source$target) {

    
needdir(SYSTEM_PATH.'/.thumb'.GET_PATH);

    
// ImageMagick fallback -----------------------
    
if(!function_exists('imagecreatetruecolor')) {
      
error_log('WARNING: Using imagemagick to create thumbs!');

      
exec('convert -thumbnail '.THUMB_X.'x'.THUMB_Y.' "'.$source.'" "'.$target.'.fg.png"');

      
// ImageMagick wasn't able to convert source file
      
if(!is_file($target.'.fg.png'))
        return 
false;

      
exec('convert -size '.THUMB_X.'x'.THUMB_Y.' xc: "'.$target.'.bg.png"');
      
exec('composite -gravity center "'.$target.'.fg.png" "'.$target.'.bg.png" "'.$target.'"');
      
unlink($target.'.fg.png');
      
unlink($target.'.bg.png');
    }
    
// ImageMagick fallback end -------------------

    
$image imagecreatefromfile($source);
    if(!
$image) return false;

    
$nx THUMB_X;
    
$ny THUMB_Y;
    
$dx 0;
    
$dy 0;

    
$aspect = ($x imagesx($image)) 
            / (
$y imagesy($image));

    if( 
roundTHUMB_X $aspect ) > THUMB_Y ) {
      
$nx roundTHUMB_Y $aspect );
    } else {
      
$ny roundTHUMB_X $aspect );
    }

    
$dx = ( $nx == THUMB_X )?0:round( ( THUMB_X $nx ) / 2);
    
$dy = ( $ny == THUMB_Y )?0:round( ( THUMB_Y $ny ) / 2);

    
// Remove unsightly 1px white strip on some thumbs
    
if(THUMB_X-($dx+$nx) == $dx-1) { $dx--; $nx++; } else
    if(
THUMB_X-($dx+$nx) == $dx+1) { $dx++; $nx--; }
    if(
THUMB_Y-($dy+$ny) == $dy-1) { $dy--; $ny++; } else
    if(
THUMB_Y-($dy+$ny) == $dy+1) { $dy++; $ny--; }

    
$thumb imagecreatetruecolor(THUMB_X,THUMB_Y);
    
imagefilledrectangle($thumb,0,0,THUMB_X,THUMB_Y,imagecolorallocate($thumb,255,255,255));
    
imagecopyresampled$thumb$image$dx$dy00$nx$ny$x$y);
    
imagejpeg($thumb$targetQUALITY);
    
imagedestroy($thumb);
    
imagedestroy($image);

    return 
true;
  }

  
// Scale an image and write it to a cache file, set $x and $y to scaled size
  
function scale($scale, &$x, &$y) {

    if(!
is_numeric($scale) or !is_dir(SYSTEM_PATH."/.scale$scale"))
      die(
"Invalid scale value");

    
needdir(SYSTEM_PATH.'/.scale'.$scale.GET_PATH);

    
// ImageMagick fallback -----------------------
    
if(!function_exists('imagecreatetruecolor')) {
      
error_log('WARNING: Using imagemagick to create scaled image!');

      
exec('convert -resize '.$scale.'x'.$scale.' "'.FILE_PATH.SHOW_FILE.'" "'.SYSTEM_PATH.'/.scale'.$scale.GET_PATH.SHOW_FILE.'.jpg'.'"');
      if(!
is_file(SYSTEM_PATH.'/.scale'.$scale.GET_PATH.SHOW_FILE.'.jpg'))
        return 
false;
    }

    if(
is_file(SYSTEM_PATH.'/.scale'.$scale.GET_PATH.SHOW_FILE.'.jpg')) {
      
$imageinfo getimagesize(SYSTEM_PATH."/.scale$scale".GET_PATH.SHOW_FILE.'.jpg');
      
$x $imageinfo[0];
      
$y $imageinfo[1];
      return 
true;
    }
    
// ImageMagick fallback end -------------------

    
$im imagecreatefromfile(FILE_PATH.SHOW_FILE);
    if(!
$im) return false;

    if(
$y $x && $x $scale) {
      
$nx $scale$ny = ($nx/$x) * $y;
    } elseif(
$y $scale) {
      
$ny $scale$nx = ($ny/$y) * $x;
    } else {
      return 
false;
    }
    
    
$scaled imagecreatetruecolor($nx,$ny);
    
imagecopyresampled$scaled$im0000$nx$ny$x$y);
    
imagejpeg($scaledSYSTEM_PATH."/.scale$scale".GET_PATH.SHOW_FILE.'.jpg'75);
    
imagedestroy($scaled);
    
imagedestroy($im);
    
$x $nx;
    
$y $ny;
    return 
true;

  } 
// scale();
?>