<?php
/*
 * werxgallery
 *
 * Version: 0.1-alpha
 * Author:  Dan Cech (dcech@phpwerx.net)
 * Website: http://www.phpwerx.net
 *
 * $Id: index.php,v 1.6 2005/05/03 15:48:53 dcech Exp $
 */

if (isset($_REQUEST['source'])) {
    
highlight_file(__FILE__);
    exit;
}

define('GALLERY_TITLE','Photos');

define('IMG_LIB','imagemagick');
// define('IMG_LIB','gd2');

define('IMAGEMAGICK_PATH',   '');
define('IMAGEMAGICK_MONTAGE',IMAGEMAGICK_PATH.'montage');
define('IMAGEMAGICK_CONVERT',IMAGEMAGICK_PATH.'montage');

define('THUMB_HEIGHT',100);
define('THUMB_WIDTH'120);
define('THUMB_TYPE''jpeg');
define('THUMB_BG_R',  255);
define('THUMB_BG_G',  255);
define('THUMB_BG_B',  255);

define('DEFAULT_TYPE','jpeg');

define('BASE_PATH',realpath(getcwd()));
define('DIR_SEP',  strpos(BASE_PATH,'/') === FALSE '\\' '/');

error_reporting(E_ALL);
ini_set('memory_limit','20M');

$gallery = new gallery();
$gallery->display();

class 
gallery
{
    var 
$exts = array(
        
'.jpg'  => 'jpeg',
        
'.jpeg' => 'jpeg',
        
'.gif'  => 'png',
        
'.png'  => 'png',
        
'.bmp'  => 'png'
    
);
    
    var 
$sizes = array(
        
'800x600',
        
'1024x768',
        
'full'
    
);
    
    var 
$base;
    var 
$path;
    var 
$uri;
    var 
$rel;
    
    var 
$dirs;
    var 
$imgs;
    
    var 
$mtime;
    
    var 
$use_cache true;
    
    function 
gallery()
    {
        
// start with directory part of PHP_SELF
        
$this->base strrev(strchr(strrev($_SERVER['PHP_SELF']),'/'));
        
        
// get request URI
        
$this->uri  urldecode($_SERVER['REQUEST_URI']);
        if (
strpos($this->uri,'?') !== false) {
            
$this->uri  substr($this->uri,0,strpos($this->uri,'?'));
        }
        
        
// check for thumb request
        
if (preg_match('/^(.+\/)?(thumbs?\/)([^\/]+)$/',$this->uri,$matches)) {
            
$this->uri         $matches[1];
            
$_REQUEST['thumb'] = $matches[3];
        
// check for image page request
        
} elseif (preg_match('/^(.+?\/)?((800x600|1024x768|full)\/)?([^\/]+).html$/',$this->uri,$matches)) {
            
$this->uri         $matches[1];
            
$_REQUEST['view']  = $matches[4];
            if (!empty(
$matches[3])) {
                
$_REQUEST['size']  = $matches[3];
            }
        
// check for image request
        
} elseif (preg_match('/^(.+?\/)?((800x600|1024x768|full)\/)?([^\/]+)$/',$this->uri,$matches)) {
            
$this->uri         $matches[1];
            
$_REQUEST['img']   = $matches[4];
            if (!empty(
$matches[3])) {
                
$_REQUEST['size']  = $matches[3];
            }
        }
        
        
$this->rel  substr($this->uri,strlen($this->base));
        
$this->path realpath('./'.$this->rel).DIR_SEP;
        
        
// check it is in the base
        
if (substr($this->path,0,strlen(BASE_PATH)) != BASE_PATH) {
            exit(
'Invalid Directory');
        }
        
        
// try to open the directory
        
if (!is_dir($this->path) || !$dh opendir($this->path)) {
            exit(
'Could Not Open Directory');
        }
        
        
$this->dirs = array();
        
$this->imgs = array();
        
        while ((
$file readdir($dh)) !== false) {
            if (
substr($file,0,1) == '.') {
                continue;
            }
            
            if (
is_dir($this->path.$file)) {
                
$this->dirs[$file] = $file;
                continue;
            }
            
$ext strtolower(strrchr($file,'.'));
            
            if (isset(
$this->exts[$ext])) {
                
$this->imgs[$file] = $file;
            }
        }
        
closedir($dh);
        
        
natsort($this->dirs);
        
natsort($this->imgs);
        
        
$this->mtime filemtime(__FILE__);
    }
    
    function 
display()
    {
        
// figure out what we're trying to do
        
if (isset($_REQUEST['thumb'])) {
            if (isset(
$this->imgs[$_REQUEST['thumb']])) {
                return 
$this->thumb($_REQUEST['thumb']);
            }
        }
        
        if (!isset(
$_REQUEST['size']) || !in_array($_REQUEST['size'],$this->sizes)) {
            
$_REQUEST['size'] = reset($this->sizes);
        }
        
        if (isset(
$_REQUEST['img'])) {
            if (isset(
$this->imgs[$_REQUEST['img']])) {
                return 
$this->image($_REQUEST['img'],$_REQUEST['size']);
            }
        }
        
        if (isset(
$_REQUEST['view'])) {
            if (isset(
$this->imgs[$_REQUEST['view']])) {
                return 
$this->show_img($_REQUEST['view'],$_REQUEST['size']);
            } else {
                
add_message('Invalid Image');
            }
        }
        
        return 
$this->show_dir();
    }
    
    function 
show_img($img,$size)
    {
        
$dim  getimagesize($this->path.$img);
        
$fsize filesize($this->path.$img);
        
        
$details = array(
            
'width'  => $dim[0],
            
'height' => $dim[1],
            
'fsize'  => $fsize,
            
'dsize'  => $size
        
);
        
        
print_header($this->base);
        
print_breadcrumb($this->base,$this->rel);
        
print_messages();
        
        
print_image($img,$this->imgs,$this->sizes,$details);
        
        
print_footer();
    }
    
    function 
show_dir()
    {
        
print_header($this->base);
        
print_breadcrumb($this->base,$this->rel);
        
print_messages();
        
        
print_directories($this->dirs);
        
        
print_thumbnails($this->imgs);
        
        
print_footer();
    }
    
    function 
thumb($imgfile)
    {
        
$name strrev(strchr(strrev($imgfile),'.')).THUMB_TYPE;
        
        if (
$this->use_cache) {
            @
chmod($this->path,0775);
            
            
$path $this->path.'.thumbs'.DIR_SEP;
            
            if (!
is_dir($path)) {
                @
mkdir($path);
            }
            
            if (@
file_exists($path.$name) && filesize($path.$name) > 0) {
                
$mtime filemtime($path.$name);
                if (
$mtime filemtime($this->path.$imgfile) && $mtime $this->mtime) {
                    
$this->header(THUMB_TYPE);
                    
readfile($path.$name);
                    exit;
                }
            }
            
            if (@
touch($path.$name)) {
                
thumbnail_image($this->path.$imgfile,THUMB_WIDTH,THUMB_HEIGHT,THUMB_TYPE,$path.$name);
                
$this->header(THUMB_TYPE);
                
readfile($path.$name);
                exit;
            }
        }
        
        
$this->header(THUMB_TYPE);
        
thumbnail_image($this->path.$imgfile,THUMB_WIDTH,THUMB_HEIGHT,THUMB_TYPE);
        exit;
    }
    
    function 
image($imgfile,$size)
    {
        
$ext strtolower(strrchr($imgfile,'.'));
        if (isset(
$this->exts[$ext])) {
            
$type $this->exts[$ext];
        } else {
            
$type DEFAULT_TYPE;
        }
        
        if (
$size == 'full') {
            
$this->header($type);
            
readfile($this->path.$imgfile);
            exit;
        }
        
        list(
$w,$h) = explode('x',$size,2);
        
        
$name strrev(strchr(strrev($imgfile),'.')).$type;
        
        if (
$this->use_cache) {
            @
chmod($this->path,0775);
            
            
$path $this->path.'.'.$size.DIR_SEP;
            
            if (!
is_dir($path)) {
                @
mkdir($path);
            }
            
            if (@
file_exists($path.$name)) {
                
$mtime filemtime($path.$name);
                if (
$mtime filemtime($this->path.$imgfile) && $mtime $this->mtime) {
                    
$this->header($type);
                    
readfile($path.$name);
                    exit;
                }
            }
            
            if (@
touch($path.$name)) {
                
resize_image($this->path.$imgfile,$w,$h,$type,$path.$name);
                
$this->header($type);
                
readfile($path.$name);
                exit;
            }
        }
        
        
$this->header($type);
        
resize_image($this->path.$imgfile,$w,$h,$type);
        exit;
    }
    
    function 
header($type)
    {
        
// return false if headers already sent
        
if (headers_sent()) {
            return 
false;
        }
        
        
// disable php automatic cache control
        
session_cache_limiter('none');
        
        
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3
        
$http_date_format 'D, d M Y H:i:s \G\M\T';
        
$gm_date   gmdate('U');
        
$http_date gmdate($http_date_format,$gm_date);
        
        
// set date header
        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
        
header('Date: '$http_date);
        
        
// set content expiration 30 days in the future
        
header('Expires: 'gmdate($http_date_format,mktime(0,0,0,gmdate('m',$gm_date),gmdate('d',$gm_date)+30,gmdate('Y',$gm_date)))); 
        
// set content last modified on the first of last month
        
header('Last-Modified: 'gmdate($http_date_format,mktime(0,0,0,gmdate('m',$gm_date)-1,1,gmdate('Y',$gm_date)))); 
        
// HTTP/1.1
        
header('Cache-Control: public');
        
        switch (
$type) {
            case 
'jpeg':
                
$mimetype 'image/jpeg';
                break;
            case 
'png':
            default:
                
$mimetype 'image/png';
        }
        
        
header('Content-Type: '.$mimetype);
    }
}

/*** FUNCTIONS ***/

function print_header($base)
{
    echo 
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Photo Gallery</title>
    <link rel="stylesheet" type="text/css" href="'
$base .'styles.css" />
</head>
<body>'
;
}

function 
print_footer()
{
    echo 
'
    <div class="footer">
        werxgallery 0.1-alpha <a href="?source=1">source</a>
    </div>
</body>
</html>'
;
}

function 
print_breadcrumb($base,$rel)
{
    echo 
'
    <div class="breadcrumb">
        <a href="'
.htmlentities($base).'">'.htmlentities(GALLERY_TITLE).'</a>';
    
    
$url $base;
    
    
$folders preg_split('/(\/|\\\)/',$rel,0,PREG_SPLIT_NO_EMPTY);
    
    foreach (
$folders as $key => $val) {
        
$url .= $val .'/';
        echo 
' / <a href="'htmlentities($url) .'">'htmlentities(str_replace('_',' ',$val)) .'</a>';
    }
    
    echo 
'
    </div>'
;
}

function 
print_directories($subdirs)
{
    if (!
is_array($subdirs) || empty($subdirs)) {
        return;
    }
    
    echo 
'
    <div class="subdirs">
        <h2>Galleries</h2>
        <ul>'
;
    
    foreach (
$subdirs as $subdir) {
        echo 
'
            <li><a href="'
htmlentities($subdir) .'/">'htmlentities(str_replace('_',' ',$subdir)) .'</a></li>';
    }
    
    echo 
'
        </ul>
    </div>'
;
}

function 
print_thumbnails($images)
{
    if (!
is_array($images) || empty($images)) {
        return;
    }
    
    echo 
'
    <div class="thumbs">
        <h2>Images</h2>
        <ul>'
;
    
    foreach (
$images as $image) {
        echo 
'
            <li><a href="'
view_url($image) .'"><img src="'thumb_url($image) .'" width="'THUMB_WIDTH .'" height="'THUMB_HEIGHT .'" title="'htmlentities($image) .'" /></a></li>';
    }
    
    echo 
'
        </ul>
        <div class="clearer"></div>
    </div>'
;
}

function 
thumb_url($image)
{
    if (!empty(
$_SERVER['REDIRECT_STATUS'])) {
        global 
$gallery;
        return 
htmlentities($gallery->base $gallery->rel .'thumb/'$image);
    }
    
    return 
htmlentities('?thumb='urlencode($image));
}

function 
img_url($image,$size NULL)
{
    if (!empty(
$_SERVER['REDIRECT_STATUS'])) {
        global 
$gallery;
        
$url $gallery->base $gallery->rel;
        if (!empty(
$size)) {
            
$url .= $size .'/';
        }
        
$url .= $image;
    } else {
        
$url '?img='urlencode($image);
        if (!empty(
$size)) {
            
$url .= '&size='$size;
        }
    }
    
    return 
htmlentities($url);
}

function 
view_url($image,$size NULL)
{
    if (!empty(
$_SERVER['REDIRECT_STATUS'])) {
        global 
$gallery;
        
$url $gallery->base $gallery->rel;
        if (!empty(
$size)) {
            
$url .= $size .'/';
        }
        
$url .= $image .'.html';
    } else {
        
$url '?view='urlencode($image);
        if (!empty(
$size)) {
            
$url .= '&size='$size;
        }
    }
    
    return 
htmlentities($url);
}

function 
print_image($img,$files,$sizes,$details)
{
    echo 
'
    <div class="image">
        <h2>'
htmlentities($img) .'</h2>';
    
    if (
$details['dsize'] == 'full') {
        
$w $details['width'];
        
$h $details['height'];
    } else {
        list(
$w,$h) = explode('x',$details['dsize'],2);
        if (
in_array('full',$sizes) && $w $details['width'] && $h $details['height']) {
            
$details['dsize'] = 'full';
            
$w $details['width'];
            
$h $details['height'];
        } elseif (
$size calculate_image_size($img,$w,$h,$details)) {
            
$w $size['w'];
            
$h $size['h'];
        }
    }
    
    echo 
'
        <div class="img"><img src="'
img_url($img,$details['dsize']) .'" width="'.$w.'" height="'.$h.'" /></div>';
    
    
$out_sizes = array();
    foreach (
$sizes as $size) {
        if (
$size == 'full') {
            
$label 'full';
        } else {
            list(
$w,$h) = explode('x',$size,2);
            if (
$w $details['width'] && $h $details['height']) {
                continue;
            }
            
$label $w .'&nbsp;x&nbsp;'$h;
        }
        if (
$size == $details['dsize']) {
            
$out_sizes[] = $label;
        } else {
            
$out_sizes[] = '<a href="'view_url($img,$size) .'">'$label .'</a>';
        }
    }
    
    if (!empty(
$out_sizes)) {
        echo 
'
        <div class="sizes">
            '
implode(' &nbsp; ',$out_sizes) .'
        </div>'
;
    }
    
    echo 
'
        <div class="details">
            '
$details['width'] .' x '$details['height'] .' px - 'hsize($details['fsize']) .'
        </div>'
;
    
    
$files array_values($files);
    
$pos   array_search($img,$files);
    
    
$first $files[0];
    
$last  $files[count($files) - 1];
    
    
$prev = isset($files[$pos 1]) ? $files[$pos 1] : NULL;
    
$next = isset($files[$pos 1]) ? $files[$pos 1] : NULL;
    
    echo 
'
        <div class="navigation">'
;
    
    if (
$img != $first) {
        echo 
'
            <a href="'
view_url($first,$details['dsize']) .'" title="first">I&lt;</a> &nbsp;<a href="'view_url($prev,$details['dsize']) .'" title="previous">&lt;&lt;</a>';
    } else {
        echo 
'
            I&lt; &nbsp;&lt;&lt;'
;
    }
    
// echo '&nbsp;<a href=".">index</a>&nbsp;';
    
echo '
            &nbsp; &nbsp;'
. ($pos 1) .'&nbsp;of&nbsp;'count($files) .'&nbsp; &nbsp;';
    
    if (
$img != $last) {
        echo 
'
            <a href="'
view_url($next,$details['dsize']) .'" title="next">&gt;&gt;</a> &nbsp;<a href="'view_url($last,$details['dsize']) .'" title="last">&gt;I</a>';
    } else {
        echo 
'
            &gt;&gt; &nbsp;&gt;I'
;
    }
    
    echo 
'
        </div>'
;
    
    echo 
'
        <div class="forum_code">
            '
preg_replace('/ /','+','[url=http://'$_SERVER['SERVER_NAME'] . view_url($img,$details['dsize']) .'][img]http://' $_SERVER['SERVER_NAME'] . thumb_url($img) .'[/img][/url]') .'
        </div>'
;

    echo 
'
        <div class="forum_code">
            '
htmlentities('<a href="http://'$_SERVER['SERVER_NAME'] . img_url($img,$details['dsize']) .'" rel="lightbox['date('Y-m-d') .']" title="'htmlentities($img) .'"><img src="http://' $_SERVER['SERVER_NAME'] . thumb_url($img) .'" alt="'htmlentities($img) .'" width="'THUMB_WIDTH .'" height="'THUMB_HEIGHT .'" /></a>') .'
        </div>'
;
    
    echo 
'
    </div>'
;
}

function 
add_message($message NULL)
{
    static 
$messages = array();
    
    if (!empty(
$message)) {
        
$messages[] = $message;
    }
    
    return 
$messages;
}

function 
print_messages()
{
    
$messages add_message();
    
    if (empty(
$messages)) {
        return;
    }
    
    echo 
'
    <div class="messages">'
;
    
    foreach (
$messages as $message) {
        echo 
'
        '
$message .'<br />';
    }
    
    echo 
'
    </div>'
;
}

function 
calculate_image_size($imgfile,$w NULL,$h NULL,$details NULL)
{
    if (!isset(
$w)) {
        
$w THUMB_WIDTH;
    }
    if (!isset(
$h)) {
        
$h THUMB_HEIGHT;
    }
    
    if (
is_array($details)) {
        
$s_w $details['width'];
        
$s_h $details['height'];
    } else {
        if (!
file_exists($imgfile)) {
            return 
false;
        }
        
        
$size getimagesize($imgfile);
        
$s_w $size[0];
        
$s_h $size[1];
    }
    
    
$s_aspect $s_w $s_h;
    
$d_aspect $w $h;
    
    if ((
$s_aspect && $d_aspect 1) || ($s_aspect && $d_aspect 1)) {
        
$t $w;
        
$w $h;
        
$h $t;
    }
    
    
$ratio min($w $s_w,$h $s_h);
    
    return array(
        
'w' => round($s_w $ratio),
        
'h' => round($s_h $ratio)
    );
}

function 
thumbnail_image($imgfile,$w NULL,$h NULL,$format 'png',$destfile NULL)
{
    if (!
file_exists($imgfile)) {
        return 
false;
    }
    
    if (!isset(
$w)) {
        
$w THUMB_WIDTH;
    }
    if (!isset(
$h)) {
        
$h THUMB_HEIGHT;
    }
    
    switch (
strtolower(IMG_LIB)) {
        case 
'imagemagick':
            return 
_thumbnail_image_imagemagick($imgfile,$w,$h,$format,$destfile);
        case 
'gd2':
            return 
_thumbnail_image_gd2($imgfile,$w,$h,$format,$destfile);
    }
    
    return 
false;
}

function 
resize_image($imgfile,$w NULL,$h NULL,$format 'png',$destfile NULL)
{
    if (!isset(
$w)) {
        
$w THUMB_WIDTH;
    }
    if (!isset(
$h)) {
        
$h THUMB_HEIGHT;
    }
    
    if (!
$size calculate_image_size($imgfile,$w,$h)) {
        return 
false;
    }
    
    
$w $size['w'];
    
$h $size['h'];
    
    switch (
strtolower(IMG_LIB)) {
        case 
'imagemagick':
            return 
_resize_image_imagemagick($imgfile,$w,$h,$format,$destfile);
        case 
'gd2':
            return 
_resize_image_gd2($imgfile,$w,$h,$format,$destfile);
    }
    
    return 
false;
}

function 
_thumbnail_image_imagemagick($imgfile,$w NULL,$h NULL,$format 'png',$destfile NULL)
{
    
$cmd IMAGEMAGICK_MONTAGE
         
' -size '$w .'x'$h
         
' -geometry '$w .'x'$h
         
' -background 'escape_arg('rgb('THUMB_BG_R .','THUMB_BG_G .','THUMB_BG_B .')')
         . 
' 'escape_arg($imgfile)
         . 
' ';
    
    if (isset(
$destfile)) {
        switch (
strtolower($format)) {
            case 
'jpg':
            case 
'jpeg':
                
$cmd .= escape_arg('jpeg:'.$destfile);
                
exec($cmd);
                break;
            case 
'png':
                
$cmd .= escape_arg('png:'.$destfile);
                
exec($cmd);
                break;
            default:
                return 
false;
        }
    } else {
        switch (
strtolower($format)) {
            case 
'jpg':
            case 
'jpeg':
                
$cmd .= 'jpeg:-';
                
passthru($cmd);
                break;
            case 
'png':
                
$cmd .= 'png:-';
                
passthru($cmd);
                break;
            default:
                return 
false;
        }
    }
    
    return 
true;
}

function 
_resize_image_imagemagick($imgfile,$w NULL,$h NULL,$format 'png',$destfile NULL)
{
    
$cmd IMAGEMAGICK_CONVERT
         
' -size '$w .'x'$h
         
' -geometry '$w .'x'$h
         
' 'escape_arg($imgfile)
         . 
' ';
    
    if (isset(
$destfile)) {
        switch (
strtolower($format)) {
            case 
'jpg':
            case 
'jpeg':
                
$cmd .= escape_arg('jpeg:'.$destfile);
                
exec($cmd);
                break;
            case 
'png':
                
$cmd .= escape_arg('png:'.$destfile);
                
exec($cmd);
                break;
            default:
                return 
false;
        }
    } else {
        switch (
strtolower($format)) {
            case 
'jpg':
            case 
'jpeg':
                
$cmd .= 'jpeg:-';
                
passthru($cmd);
                break;
            case 
'png':
                
$cmd .= 'png:-';
                
passthru($cmd);
                break;
            default:
                return 
false;
        }
    }
    
    return 
true;
}

function 
_thumbnail_image_gd2($imgfile,$w NULL,$h NULL,$format 'png',$destfile NULL)
{
    
$size getimagesize($imgfile);
    
$s_w $size[0];
    
$s_h $size[1];
    
    
$w_ratio $w $s_w;
    
$h_ratio $h $s_h;
    
    
// source image is smaller than dest image
    
if (min($h_ratio,$w_ratio) >= 1) {
        
$d_w $s_w;
        
$d_h $s_h;
        
$d_x floor(($w $s_w) / 2);
        
$d_y floor(($h $s_h) / 2);
    
// same aspect ratio
    
} elseif ($w_ratio == $h_ratio) {
        
$d_w $w;
        
$d_h $h;
        
$d_x 0;
        
$d_y 0;
    
// different aspect ratio
    
} elseif ($w_ratio $h_ratio) {
        
$d_w $w;
        
$d_h floor($s_h $w_ratio);
        
$d_x 0;
        
$d_y floor(($h $d_h) / 2);
    } else {
        
$d_w floor($s_w $h_ratio);
        
$d_h $h;
        
$d_x floor(($w $d_w) / 2);
        
$d_y 0;
    }
    
    switch (
$size[2]) {
        case 
1// GIF
            
$src imagecreatefromgif($imgfile);
            break;
        case 
2// JPEG
            
check_jpeg($imgfile);
            
$src imagecreatefromjpeg($imgfile);
            break;
        case 
3// PNG
            
$src imagecreatefrompng($imgfile);
            break;
        default:
            
$src imagecreatefromstring(file_get_contents($imgfile));
    }
    
    if (!
is_resource($src)) {
        return 
false;
    }
    
    
$dest imagecreatetruecolor($w,$h);
    if (!
is_resource($dest)) {
        return 
false;
    }
    
    
imageantialias($dest,TRUE);
    
    
$bg imagecolorallocate($dest,THUMB_BG_R,THUMB_BG_G,THUMB_BG_B);
    
imagefill($dest,0,0,$bg);
    
    
imagecopyresampled($dest,$src,$d_x,$d_y,0,0,$d_w,$d_h,$s_w,$s_h);
    
    if (isset(
$destfile)) {
        switch (
strtolower($format)) {
            case 
'jpg':
            case 
'jpeg':
                
imagejpeg($dest,$destfile);
                break;
            case 
'png':
                
imagepng($dest,$destfile);
                break;
            default:
                return 
false;
        }
    } else {
        switch (
strtolower($format)) {
            case 
'jpg':
            case 
'jpeg':
                
imagejpeg($dest);
                break;
            case 
'png':
                
imagepng($dest);
                break;
            default:
                return 
false;
        }
    }
    
    return 
true;
}

function 
_resize_image_gd2($imgfile,$w NULL,$h NULL,$format 'png',$destfile NULL)
{
    
$size getimagesize($imgfile);
    
$s_w $size[0];
    
$s_h $size[1];
    
    switch (
$size[2]) {
        case 
1// GIF
            
$src imagecreatefromgif($imgfile);
            break;
        case 
2// JPEG
            
check_jpeg($imgfile);
            
$src imagecreatefromjpeg($imgfile);
            break;
        case 
3// PNG
            
$src imagecreatefrompng($imgfile);
            break;
        default:
            
$src imagecreatefromstring(file_get_contents($imgfile));
    }
    
    if (!
is_resource($src)) {
        return 
false;
    }
    
    
$dest imagecreatetruecolor($w,$h);
    if (!
is_resource($dest)) {
        return 
false;
    }
    
    
imageantialias($dest,TRUE);
    
    
imagecopyresampled($dest,$src,0,0,0,0,$w,$h,$s_w,$s_h);
    
    if (isset(
$destfile)) {
        switch (
strtolower($format)) {
            case 
'jpg':
            case 
'jpeg':
                
imagejpeg($dest,$destfile);
                break;
            case 
'png':
                
imagepng($dest,$destfile);
                break;
            default:
                return 
false;
        }
    } else {
        switch (
strtolower($format)) {
            case 
'jpg':
            case 
'jpeg':
                
imagejpeg($dest);
                break;
            case 
'png':
                
imagepng($dest);
                break;
            default:
                return 
false;
        }
    }
    
    return 
true;
}

/**
* Format file size in a human-readable way 
* such as "xx Megabytes" or "xx Mo"
*
* @author           Andrea Paleni <andreaSPAMLESS_AT_SPAMLESScriticalbit.com>
* @version          1.0
* @param int       bytes   is the size
* @param bool      base10  enable base 10 representation, otherwise
*                  default base 2  is used  
* @param int       round   number of fractional digits
* @param array     labels  strings associated to each 2^10 or 
*                  10^3(base10==true) multiple of base units
*/
function hsize($bytes,$base10 false,$round 0,$labels = array('bytes','Kb','Mb','Gb'))
{
    if (
$bytes <= || !is_array($labels) || empty($labels)) {
        return 
null;
    }
    
    
$step $base10 10;
    
$base $base10 10 2;
    
    
$log = (int)(log10($bytes)/log10($base));
    
    
krsort($labels);
    
    foreach (
$labels as $p => $lab) {
        
$pow $p $step;
        if (
$log >= $pow) {
            
$text round($bytes/pow($base,$pow),$round).$lab;
            break;
        }
    }
    
    return 
$text;
}

function 
check_jpeg($f,$fix true)
{
    
# [070203]
    # check for jpeg file header and footer - also try to fix it
    
if (false !== (@$fd fopen($f,'r+b'))) {
        if (
fread($fd,2) == chr(255).chr(216)) {
            
fseek ($fd,-2,SEEK_END);
            if (
fread($fd,2) == chr(255).chr(217)) {
                
fclose($fd);
                return 
true;
            }
            if (
$fix && fwrite($fd,chr(255).chr(217))) {
                
fclose($fd);
                return 
true;
            }
        }
        
fclose($fd);
    }
    return 
false;
}

function 
escape_arg($arg)
{
    if (
PHP_OS == 'Windows'  || PHP_OS == 'WINNT') {
        return 
'"'preg_replace('/(["<>%|&])/','\\$1',$arg) .'"';
    }
    
    return 
escapeshellarg($arg);
}

// end of script